Source code for greenlang.calculations.ghg.scope_3.forms.leased_assets
""" Upstream Leased Assets calculation methods """
from django import forms
from django.utils.translation import gettext_lazy as _
from django.utils import timezone
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Row, Column, Submit, Hidden, Field
from crispy_forms.bootstrap import AppendedText
from fingreen_web.models import (
    GhgEmissionSourceComputationMethod,
    CollectionItem,
    GhgEmissionFactor,
)
from ...base.forms import PredefinedFactorCalculationMethodForm, TaggedFormMixin
[docs]
class LeasedBuildingsAssetSpecificMethodForm(TaggedFormMixin, forms.ModelForm):
    """Automatic method form"""
    method = forms.ModelChoiceField(
        queryset=GhgEmissionSourceComputationMethod.objects.all(), required=True
    )
    total_floor_space = forms.FloatField(required=True)
    leased_floor_space = forms.FloatField(required=True)
    scope1_emissions = forms.FloatField(required=True)
    scope2_emissions = forms.FloatField(required=True)
    leased_month_count = forms.IntegerField(required=True)
    def __init__(self, *args, **kwargs):
        """Init form"""
        super().__init__(*args, **kwargs)
        has_instance = 'instance' in kwargs and kwargs['instance']
        if has_instance:
            instance = kwargs['instance']
            if instance.widget_data:
                for key, value in instance.widget_data.items():
                    setattr(self.fields[key], 'initial', value)
        self.helper = FormHelper()
        self.helper.form_tag = False
        self.helper.form_show_labels = False
        self.helper.layout = Layout(
            Hidden(
                "method", self.initial["method"].id
            ),  # field used in the view to preset form
            Hidden("collection", self.initial["collection"].id),
            Hidden("item_type", self.initial["item_type"]),
            Hidden("ghg_scope", self.initial["ghg_scope"]),
            Row(
                Column(
                    Field(
                        "description_user",
                        placeholder=_("Description"),
                        type="text",
                        autocomplete="off",
                        css_class="form-control form-control-lg form-control-solid mb-3 mb-lg-0",
                    ),
                    css_class="col-md-6",
                ),
                Column(
                    Field(
                        "tags",
                        css_class="form-control tags-input",
                    ),
                    css_class="col-md-6",
                ),
            ),
            Row(
                Column(
                    AppendedText(
                        "total_floor_space", "m2", placeholder=_("Total floor space")
                    ),
                    css_class="col-6",
                ),
                Column(
                    AppendedText(
                        "leased_floor_space", "m2", placeholder=_("Leased floor space")
                    ),
                    css_class="col-6",
                ),
                Column(
                    AppendedText(
                        "scope1_emissions",
                        "kg CO2e",
                        placeholder=_("Total Building Scope 1 Emissions"),
                    ),
                    css_class="col-6",
                ),
                Column(
                    AppendedText(
                        "scope2_emissions",
                        "kg CO2e",
                        placeholder=_("Total Building Scope 2 Emissions"),
                    ),
                    css_class="col-6",
                ),
                Column(
                    Field("leased_month_count", placeholder=_("Leased month count")),
                    css_class="col-6",
                ),
                Column(
                    Submit(
                        "submit",
                        _("Add") if not has_instance else _("Update"),
                        css_class="btn btn-light-primary w-100 mb-3",
                    ),
                    css_class="d-flex align-items-end col-2",
                ),
            ),
        )
[docs]
    def save(self, commit=True):
        """Save form"""
        instance = super().save(commit=False)
        leased_ratio = (
            self.cleaned_data["leased_floor_space"]
            / self.cleaned_data["total_floor_space"]
        )
        leased_ratio_per_year = (
            leased_ratio * self.cleaned_data["leased_month_count"] / 12
        )
        instance.value_float = leased_ratio_per_year
        instance.ghg_unit = "m2_year"
        instance.ghg_factor = GhgEmissionFactor.objects.create(
            name=instance.description_user,
            factor_type="custom_leased_nuildings",
            method=self.cleaned_data["method"],
        )
        instance.widget_data = {
            "total_floor_space": self.cleaned_data["total_floor_space"],
            "leased_floor_space": self.cleaned_data["leased_floor_space"],
            "scope1_emissions": self.cleaned_data["scope1_emissions"],
            "scope2_emissions": self.cleaned_data["scope2_emissions"],
            "leased_month_count": self.cleaned_data["leased_month_count"],
        }
        if commit:
            if self.user:
                instance.value_last_editor = self.user
            instance.value_update_date = timezone.now()
            
            instance.save()
            self.save_tags(instance)
        return instance
    class Meta:
        model = CollectionItem
        fields = [
            "method",
            "collection",
            "ghg_scope",
            "item_type",
            "description_user",
            "tags",
        ]
[docs]
class LeasedBuildingsAverageDataMethodForm(PredefinedFactorCalculationMethodForm):
    """LeasedBuildingsAverageDataMethodForm"""
    leased_month_count = forms.IntegerField(required=True)
[docs]
    def get_extra_fields(self):
        """Return fields."""
        return [
            Column(
                Field("leased_month_count", placeholder=_("Leased month count")),
                css_class="col-2",
            ),
        ]
[docs]
    def save(self, commit=True):
        """Save form"""
        instance = super().save(commit=False)
        instance.widget_data = {
            "leased_month_count": self.cleaned_data["leased_month_count"],
        }
        if commit:
            instance.save()
        return instance
    class Meta:
        model = CollectionItem
        fields = [
            "collection",
            "tags",
            "ghg_scope",
            "item_type",
            "description_user",
            "ghg_factor",
            "value_float",
            "ghg_unit",
        ]