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_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_context_data(self, **kwargs):
return super().get_context_data(**kwargs) | {
"enable_distance": self.object.enable_distance,
}