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()