""" Author: Michel Peltriaux Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany Contact: ksp-servicestelle@sgdnord.rlp.de Created on: 18.08.22 """ from dal import autocomplete from django import forms from django.utils.translation import gettext_lazy as _ from codelist.models import KonovaCode from codelist.settings import CODELIST_COMPENSATION_ACTION_ID, CODELIST_COMPENSATION_ACTION_DETAIL_ID from intervention.inputs import CompensationActionTreeCheckboxSelectMultiple from konova.forms.modals import BaseModalForm, RemoveModalForm from konova.utils.message_templates import COMPENSATION_ACTION_EDITED, ADDED_COMPENSATION_ACTION class NewCompensationActionModalForm(BaseModalForm): """ Form handling action related input Compensation actions are the actions performed on the area, which shall be compensated. Actions will change the surface of the area, the biotopes, and have an environmental impact. With actions the before-after states can change (not in the process logic in Konova, but in the real world). """ from compensation.models import UnitChoices action_type = forms.MultipleChoiceField( label=_("Action Type"), label_suffix="", required=True, help_text=_("An action can consist of multiple different action types. All the selected action types are expected to be performed according to the amount and unit below on this form."), choices=[], widget=CompensationActionTreeCheckboxSelectMultiple(), ) action_type_details = forms.ModelMultipleChoiceField( label=_("Action Type detail"), label_suffix="", required=False, help_text=_("Select the action type detail"), queryset=KonovaCode.objects.filter( is_archived=False, is_leaf=True, code_lists__in=[CODELIST_COMPENSATION_ACTION_DETAIL_ID], ), widget=autocomplete.ModelSelect2Multiple( url="codelist:compensation-action-detail-autocomplete", attrs={ "data-placeholder": _("Action Type detail"), } ), ) unit = forms.ChoiceField( label=_("Unit"), label_suffix="", required=True, help_text=_("Select the unit"), choices=UnitChoices.choices, widget=forms.Select( attrs={ "class": "form-control" } ) ) amount = forms.DecimalField( label=_("Amount"), label_suffix="", required=True, help_text=_("Insert the amount"), decimal_places=2, min_value=0.00, widget=forms.NumberInput( attrs={ "class": "form-control", "placeholder": "0,00", } ) ) comment = forms.CharField( required=False, label=_("Comment"), label_suffix=_(""), help_text=_("Additional comment"), widget=forms.Textarea( attrs={ "rows": 5, "class": "form-control", } ) ) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.form_title = _("New action") self.form_caption = _("Insert data for the new action") choices =KonovaCode.objects.filter( code_lists__in=[CODELIST_COMPENSATION_ACTION_ID], is_archived=False, is_leaf=True, ).values_list("id", flat=True) choices = [ (choice, choice) for choice in choices ] self.fields["action_type"].choices = choices def save(self): action = self.instance.add_action(self) self.instance.mark_as_edited(self.user, self.request, ADDED_COMPENSATION_ACTION) return action class EditCompensationActionModalForm(NewCompensationActionModalForm): action = None def __init__(self, *args, **kwargs): self.action = kwargs.pop("action", None) super().__init__(*args, **kwargs) self.form_title = _("Edit action") form_data = { "action_type": list(self.action.action_type.values_list("id", flat=True)), "action_type_details": self.action.action_type_details.all(), "amount": self.action.amount, "unit": self.action.unit, "comment": self.action.comment, } self.load_initial_data(form_data) def save(self): action = self.action action.action_type.set(self.cleaned_data.get("action_type", [])) action.action_type_details.set(self.cleaned_data.get("action_type_details", [])) action.amount = self.cleaned_data.get("amount", None) action.unit = self.cleaned_data.get("unit", None) action.comment = self.cleaned_data.get("comment", None) action.save() self.instance.mark_as_edited(self.user, self.request, edit_comment=COMPENSATION_ACTION_EDITED) return action class RemoveCompensationActionModalForm(RemoveModalForm): """ Removing modal form for CompensationAction Can be used for anything, where removing shall be confirmed by the user a second time. """ action = None def __init__(self, *args, **kwargs): action = kwargs.pop("action", None) self.action = action super().__init__(*args, **kwargs) def save(self): self.instance.remove_action(self)