Source code for ferrosoft.apps.emiflow.views.intensity

#  Copyright (c) 2025 Ferrosoft GmbH. All rights reserved.
from uuid import UUID

from django.urls import reverse
from django.utils.translation import gettext_lazy as _

from ferrosoft.apps.emiflow.forms.intensity import EmissionIntensityForm
from ferrosoft.apps.emiflow.models import (
    EmitterEpitype,
    IntensityCapableEntity,
    EmissionIntensity,
    EnergyCarrier,
)
from ferrosoft.apps.ferrobase.views import CreateView, UpdateView
from ferrosoft.strparse import parse_uuid_noexcept, parse_int_noexcept

_OWNER_TYPE_PARAM = "ot"
_OWNER_ID_PARAM = "oi"
_ENERGY_CARRIER_ID = "ec"
_SHOW_DISTANCE_PARAM = "d"


[docs] def intensity_create_url( owner_type: IntensityCapableEntity, owner_id: UUID, energy_carrier_id: UUID | None = None, emitter_epitype: EmitterEpitype | None = None, ): """ Get URL to intensity create form. Args: owner_type: Type of entity for which to create the intensity. owner_id: ID of entity for which to create the intensity. energy_carrier_id: ID of energy carrier with which to constrain emission factors. Returns: URL of intensity create form. """ query = { _OWNER_TYPE_PARAM: int(owner_type), _OWNER_ID_PARAM: str(owner_id), } if isinstance(energy_carrier_id, UUID): query[_ENERGY_CARRIER_ID] = str(energy_carrier_id) if emitter_epitype is not None: query[_SHOW_DISTANCE_PARAM] = ( 0 if emitter_epitype in EmitterEpitype.hub_equipment() else 1 ) return reverse( "emiflow:emissionintensity_create", query=query, )
def _is_distance_enabled(request) -> bool: return request.GET.get(_SHOW_DISTANCE_PARAM, None) == "1"
[docs] class EmissionIntensityCreateView(CreateView): activity_title = _("Emission Intensity") form_class = EmissionIntensityForm help_topic = "define_emission_intensity" model = EmissionIntensity template_name = "emiflow/emission_intensity/create.html"
[docs] def get_success_url(self): return self.object.owner.get_absolute_url()
[docs] def get_form_kwargs(self): # FIXME Params should go into URL so that they cannot go missing. # Energy carrier passed in as query param should constrain emission factors, # to provide the user with a sensible choice. It is optional, since for emitters # the energy carrier may not be defined. energy_carrier = None energy_carrier_id = parse_uuid_noexcept( self.request.GET.get(_ENERGY_CARRIER_ID, None) ) if energy_carrier_id is not None: energy_carrier = EnergyCarrier.objects.filter(pk=energy_carrier_id).first() # Get owning entity from query params. owner_type_id = parse_int_noexcept( self.request.GET.get(_OWNER_TYPE_PARAM, None) ) owner_type = IntensityCapableEntity(owner_type_id) owner_id = parse_uuid_noexcept(self.request.GET.get(_OWNER_ID_PARAM, None)) enable_distance = _is_distance_enabled(self.request) return super().get_form_kwargs() | { "enable_distance": enable_distance, "energy_carrier": energy_carrier, "initial": { "enable_distance": enable_distance, "owner_type": owner_type, "owner_id": owner_id, }, }
[docs] def get_context_data(self, **kwargs): return super().get_context_data(**kwargs) | { "enable_distance": _is_distance_enabled(self.request), }
[docs] class EmissionIntensityUpdateView(UpdateView): activity_title = _("Emission Intensity") form_class = EmissionIntensityForm help_topic = "define_emission_intensity" model = EmissionIntensity template_name = "emiflow/emission_intensity/update.html" related_links_default = False
[docs] def get_success_url(self): return self.object.owner.get_absolute_url()
[docs] def get_form_kwargs(self): owner = self.object.owner # Same as in create view, but get energy carrier from owner. energy_carrier = None if hasattr(owner, "energy_carrier_id"): energy_carrier = EnergyCarrier.objects.filter( pk=getattr(owner, "energy_carrier_id") ).first() return super().get_form_kwargs() | { "enable_distance": self.object.enable_distance, "energy_carrier": energy_carrier, }
[docs] def get_context_data(self, **kwargs): return super().get_context_data(**kwargs) | { "enable_distance": self.object.enable_distance, }