Source code for ferrosoft.apps.emiflow.dataimport.base

from dataclasses import dataclass
from typing import Type, Callable

from django.utils.translation import gettext as _

from ferrosoft.apps.dataimport.models import LogHighlight
from ferrosoft.apps.dataimport.queue import ProcessorArgs, ModelProcessorArgs
from ferrosoft.apps.emiflow.models import (
    Settings,
    VehicleType,
    ImportLine,
    TransportChainDefaults,
)
from ferrosoft.apps.emiflow.services.vehicle import detect_vehicle_type
from ferrosoft.apps.ferrobase.tenant.utils import tenant_db_transaction


[docs] @dataclass class ImportState: settings: Settings booking_disabled: bool
[docs] def load_defaults(pargs: ProcessorArgs): settings = Settings.get_instance() booking_disabled = settings.report_directory is None if booking_disabled: pargs.ui_updater.send_log_entry( pargs.job, _("Please review settings and set defaults."), 0, LogHighlight.DANGER, ) return ImportState(settings, booking_disabled)
[docs] def process_transport_chain[T]( processor_args: ModelProcessorArgs, model_class: Type[T], creator: Callable[[T, ImportState, ModelProcessorArgs], None], ): state = processor_args.processor_state model = processor_args.model if not isinstance(state, ImportState): raise ValueError("State must be %s instance" % ImportState.__name__) if not isinstance(model, model_class): raise ValueError("Model must be %s instance" % model_class.__name__) try: with tenant_db_transaction(): creator(model, state, processor_args) except Exception as e: processor_args.ui_updater.send_log_entry( processor_args.job, _("Failed booking transport and calculating emissions"), processor_args.line_number, LogHighlight.DANGER, ) raise e
[docs] def get_transport_chain_defaults( model: ImportLine, state: ImportState, processor_args: ModelProcessorArgs, ) -> TransportChainDefaults | None: vehicle_type = ( VehicleType(model.vehicle_type) if model.vehicle_type else detect_vehicle_type(model.weight) ) defaults = state.settings.get_transport_chain_defaults(vehicle_type) if state.booking_disabled or not defaults.are_defaults_set: processor_args.ui_updater.send_log_entry( processor_args.job, _( "Cannot create transport chain: please review settings and set defaults for vehicle type %s." ) % vehicle_type.label, processor_args.line_number, LogHighlight.DANGER, ) return None return defaults