Source code for ferrosoft.apps.emiflow.management.commands.emiflow_settings

from django.core.management import BaseCommand

from ferrosoft.apps.emiflow.models import (
    Settings,
    VehicleType,
    TransportChainDefaults,
    DistanceType,
)
from ferrosoft.apps.ferrobase.management.tenantcommand import TenantAwareCommand
from ferrosoft.apps.ferrobase.models import Directory


[docs] class Command(TenantAwareCommand, BaseCommand):
[docs] def add_arguments(self, parser): super().add_arguments(parser) parser.add_argument( "spec", nargs="+", type=str, help="Configuration in the format key=value", )
[docs] def handle_tenant(self, *args, **options): settings = Settings.get_instance() update_fields = [] for spec in options["spec"]: key, value = spec.split("=", 1) match key: case "report_directory": report_dir = Directory.get_or_create(value) settings.report_directory = report_dir update_fields.append("report_directory") case "tc_defaults": self.set_transport_chain_defaults(value, settings) case _: self.stderr.write(self.style.ERROR("Unknown setting: %s" % key)) if len(update_fields) > 0: settings.save(update_fields=update_fields)
[docs] def set_transport_chain_defaults(self, spec: str, settings: Settings): vehicle_type, key, value = spec.split("=", 2) if not hasattr(VehicleType, vehicle_type): self.stderr.write( self.style.ERROR("Unknown vehicle type: %s" % vehicle_type) ) return vehicle_type = VehicleType[vehicle_type] defaults = settings.get_transport_chain_defaults(vehicle_type) update_fields = [] if defaults is None: defaults = TransportChainDefaults(vehicle_type=vehicle_type) match key: case "distance_type": defaults.distance_type = DistanceType[value] update_fields.append("distance_type") case _: self.stderr.write(self.style.ERROR("Unknown setting: %s" % key)) if len(update_fields) > 0: defaults.save(update_fields=update_fields) settings.refresh_from_db()