From 73178b3fd2dbdbb14631de293ebe8c2ee2389138 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Sun, 19 Oct 2025 14:06:14 +0200 Subject: [PATCH] # NewCompensation EditCompensation view * refactors new and edit compensation views from function to class based * adds checked property to compensation to return parent-intervention's checked info * fixes bug where compensation could be added to recorded intervention * updates translations --- compensation/forms/compensation.py | 11 ++ compensation/models/compensation.py | 6 + compensation/urls/compensation.py | 11 +- .../views/compensation/compensation.py | 187 +++++------------- konova/views/base.py | 11 +- locale/de/LC_MESSAGES/django.mo | Bin 46205 -> 46354 bytes locale/de/LC_MESSAGES/django.po | 58 +++--- 7 files changed, 118 insertions(+), 166 deletions(-) diff --git a/compensation/forms/compensation.py b/compensation/forms/compensation.py index bb1532d6..b3ceb03f 100644 --- a/compensation/forms/compensation.py +++ b/compensation/forms/compensation.py @@ -168,6 +168,17 @@ class NewCompensationForm(AbstractCompensationForm, comp.log.add(action) return comp, action + def is_valid(self): + valid = super().is_valid() + intervention = self.cleaned_data.get("intervention", None) + valid &= not intervention.is_recorded + if not valid: + self.add_error( + "intervention", + _("This intervention is currently recorded. You cannot add further compensations as long as it is recorded.") + ) + return valid + def save(self, user: User, geom_form: SimpleGeomForm): with transaction.atomic(): comp, action = self.__create_comp(user) diff --git a/compensation/models/compensation.py b/compensation/models/compensation.py index 49accd46..eebd2b38 100644 --- a/compensation/models/compensation.py +++ b/compensation/models/compensation.py @@ -510,6 +510,12 @@ class Compensation(AbstractCompensation, CEFMixin, CoherenceMixin, PikMixin): return retval + @property + def checked(self): + if self.intervention: + return self.intervention.checked + return None + class CompensationDocument(AbstractDocument): """ diff --git a/compensation/urls/compensation.py b/compensation/urls/compensation.py index adec4b7f..b410ac78 100644 --- a/compensation/urls/compensation.py +++ b/compensation/urls/compensation.py @@ -17,19 +17,20 @@ from compensation.views.compensation.action import NewCompensationActionView, Ed RemoveCompensationActionView from compensation.views.compensation.state import NewCompensationStateView, EditCompensationStateView, \ RemoveCompensationStateView -from compensation.views.compensation.compensation import new_view, edit_view, \ - remove_view, CompensationIndexView, CompensationIdentifierGeneratorView, CompensationDetailView +from compensation.views.compensation.compensation import \ + remove_view, CompensationIndexView, CompensationIdentifierGeneratorView, CompensationDetailView, \ + NewCompensationFormView, EditCompensationFormView from compensation.views.compensation.log import CompensationLogView urlpatterns = [ # Main compensation path("", CompensationIndexView.as_view(), name="index"), path('new/id', CompensationIdentifierGeneratorView.as_view(), name='new-id'), - path('new/', new_view, name='new'), - path('new', new_view, name='new'), + path('new/', NewCompensationFormView.as_view(), name='new'), + path('new', NewCompensationFormView.as_view(), name='new'), path('', CompensationDetailView.as_view(), name='detail'), path('/log', CompensationLogView.as_view(), name='log'), - path('/edit', edit_view, name='edit'), + path('/edit', EditCompensationFormView.as_view(), name='edit'), path('/remove', remove_view, name='remove'), path('/state/new', NewCompensationStateView.as_view(), name='new-state'), diff --git a/compensation/views/compensation/compensation.py b/compensation/views/compensation/compensation.py index 2403d2b8..c9baedb0 100644 --- a/compensation/views/compensation/compensation.py +++ b/compensation/views/compensation/compensation.py @@ -18,15 +18,12 @@ from compensation.forms.compensation import EditCompensationForm, NewCompensatio from compensation.models import Compensation from compensation.tables.compensation import CompensationTable from intervention.models import Intervention -from konova.contexts import BaseContext from konova.decorators import shared_access_required, default_group_required, login_required_modal -from konova.forms import SimpleGeomForm from konova.forms.modals import RemoveModalForm -from konova.sub_settings.context_settings import TAB_TITLE_IDENTIFIER from konova.utils.message_templates import COMPENSATION_REMOVED_TEMPLATE, DATA_CHECKED_PREVIOUSLY_TEMPLATE, \ - RECORDED_BLOCKS_EDIT, CHECK_STATE_RESET, FORM_INVALID, PARAMS_INVALID, IDENTIFIER_REPLACED, \ - COMPENSATION_ADDED_TEMPLATE, GEOMETRY_SIMPLIFIED, GEOMETRIES_IGNORED_TEMPLATE -from konova.views.base import BaseIndexView, BaseIdentifierGeneratorView + RECORDED_BLOCKS_EDIT, PARAMS_INVALID +from konova.views.base import BaseIndexView, BaseIdentifierGeneratorView, BaseNewSpatialLocatedObjectFormView, \ + BaseEditSpatialLocatedObjectFormView from konova.views.detail import BaseDetailView @@ -44,74 +41,55 @@ class CompensationIndexView(LoginRequiredMixin, BaseIndexView): return qs -@login_required -@default_group_required -@shared_access_required(Intervention, "intervention_id") -def new_view(request: HttpRequest, intervention_id: str = None): - """ - Renders a view for a new compensation creation +class NewCompensationFormView(BaseNewSpatialLocatedObjectFormView): + _FORM_CLS = NewCompensationForm + _MODEL_CLS = Compensation + _TEMPLATE = "compensation/form/view.html" + _TAB_TITLE = _("New Compensation") + _REDIRECT_URL = "compensation:detail" - Args: - request (HttpRequest): The incoming request - - Returns: - - """ - template = "compensation/form/view.html" - if intervention_id is not None: - try: - intervention = Intervention.objects.get(id=intervention_id) - except ObjectDoesNotExist: - messages.error(request, PARAMS_INVALID) - return redirect("home") - if intervention.is_recorded: - messages.info( - request, - RECORDED_BLOCKS_EDIT - ) - return redirect("intervention:detail", id=intervention_id) - - data_form = NewCompensationForm(request.POST or None, intervention_id=intervention_id) - geom_form = SimpleGeomForm(request.POST or None, read_only=False) - if request.method == "POST": - if data_form.is_valid() and geom_form.is_valid(): - generated_identifier = data_form.cleaned_data.get("identifier", None) - comp = data_form.save(request.user, geom_form) - if generated_identifier != comp.identifier: - messages.info( - request, - IDENTIFIER_REPLACED.format( - generated_identifier, - comp.identifier - ) - ) - messages.success(request, COMPENSATION_ADDED_TEMPLATE.format(comp.identifier)) - if geom_form.has_geometry_simplified(): - messages.info( - request, - GEOMETRY_SIMPLIFIED - ) - - num_ignored_geometries = geom_form.get_num_geometries_ignored() - if num_ignored_geometries > 0: - messages.info( - request, - GEOMETRIES_IGNORED_TEMPLATE.format(num_ignored_geometries) - ) - - return redirect("compensation:detail", id=comp.id) + def _user_has_shared_access(self, user, **kwargs): + # On a new compensation make sure the intervention (if call came directly through an intervention's detail + # view) is shared with the user + intervention_id = kwargs.get("intervention_id", None) + if not intervention_id: + return True else: - messages.error(request, FORM_INVALID, extra_tags="danger",) - else: - # For clarification: nothing in this case - pass - context = { - "form": data_form, - "geom_form": geom_form, - TAB_TITLE_IDENTIFIER: _("New compensation"), - } - context = BaseContext(request, context).context - return render(request, template, context) + intervention = get_object_or_404(Intervention, id=intervention_id) + return intervention.is_shared_with(user) + + def _user_has_permission(self, user): + # User has to be an ets user + return user.is_default_user() + + def dispatch(self, request, *args, **kwargs): + # Make sure there is an existing intervention based on the given id + # Compensations can not exist without an intervention + intervention_id = kwargs.get("intervention_id", None) + if intervention_id: + try: + intervention = Intervention.objects.get(id=intervention_id) + if intervention.is_recorded: + messages.info( + request, + RECORDED_BLOCKS_EDIT + ) + return redirect("intervention:detail", id=intervention_id) + except ObjectDoesNotExist: + messages.error(request, PARAMS_INVALID, extra_tags="danger") + return redirect("home") + return super().dispatch(request, *args, **kwargs) + + +class EditCompensationFormView(BaseEditSpatialLocatedObjectFormView): + _MODEL_CLS = Compensation + _FORM_CLS = EditCompensationForm + _TEMPLATE = "compensation/form/view.html" + _REDIRECT_URL = "compensation:detail" + + def _user_has_permission(self, user): + # User has to be an ets user + return user.is_default_user() class CompensationIdentifierGeneratorView(LoginRequiredMixin, BaseIdentifierGeneratorView): @@ -119,71 +97,6 @@ class CompensationIdentifierGeneratorView(LoginRequiredMixin, BaseIdentifierGene _REDIRECT_URL = "compensation:index" -@login_required -@default_group_required -@shared_access_required(Compensation, "id") -def edit_view(request: HttpRequest, id: str): - """ - Renders a view for editing compensations - - Args: - request (HttpRequest): The incoming request - - Returns: - - """ - template = "compensation/form/view.html" - # Get object from db - comp = get_object_or_404(Compensation, id=id) - if comp.is_recorded: - messages.info( - request, - RECORDED_BLOCKS_EDIT - ) - return redirect("compensation:detail", id=id) - - # Create forms, initialize with values from db/from POST request - data_form = EditCompensationForm(request.POST or None, instance=comp) - geom_form = SimpleGeomForm(request.POST or None, read_only=False, instance=comp) - if request.method == "POST": - if data_form.is_valid() and geom_form.is_valid(): - # Preserve state of intervention checked to determine whether the user must be informed or not - # about a change of the check state - intervention_is_checked = comp.intervention.checked is not None - - # The data form takes the geom form for processing, as well as the performing user - comp = data_form.save(request.user, geom_form) - if intervention_is_checked: - messages.info(request, CHECK_STATE_RESET) - messages.success(request, _("Compensation {} edited").format(comp.identifier)) - if geom_form.has_geometry_simplified(): - messages.info( - request, - GEOMETRY_SIMPLIFIED - ) - - num_ignored_geometries = geom_form.get_num_geometries_ignored() - if num_ignored_geometries > 0: - messages.info( - request, - GEOMETRIES_IGNORED_TEMPLATE.format(num_ignored_geometries) - ) - - return redirect("compensation:detail", id=comp.id) - else: - messages.error(request, FORM_INVALID, extra_tags="danger",) - else: - # For clarification: nothing in this case - pass - context = { - "form": data_form, - "geom_form": geom_form, - TAB_TITLE_IDENTIFIER: _("Edit {}").format(comp.identifier), - } - context = BaseContext(request, context).context - return render(request, template, context) - - class CompensationDetailView(BaseDetailView): _MODEL_CLS = Compensation _TEMPLATE = "compensation/detail/compensation/view.html" diff --git a/konova/views/base.py b/konova/views/base.py index 4961f84d..266ddee0 100644 --- a/konova/views/base.py +++ b/konova/views/base.py @@ -225,10 +225,19 @@ class BaseNewSpatialLocatedObjectFormView(BaseSpatialLocatedObjectFormView): context = self._get_additional_context_data() context = BaseContext(request, additional_context=context).context + context.update( + { + "form": form, + "geom_form": geom_form, + TAB_TITLE_IDENTIFIER: self._TAB_TITLE, + } + ) return render(request, self._TEMPLATE, context) class BaseEditSpatialLocatedObjectFormView(BaseSpatialLocatedObjectFormView): + _TAB_TITLE = _("Edit {}") + def get(self, request: HttpRequest, id: str): obj = get_object_or_404( self._MODEL_CLS, @@ -252,7 +261,7 @@ class BaseEditSpatialLocatedObjectFormView(BaseSpatialLocatedObjectFormView): { "form": form, "geom_form": geom_form, - TAB_TITLE_IDENTIFIER: self._TAB_TITLE, + TAB_TITLE_IDENTIFIER: self._TAB_TITLE.format(obj.identifier), } ) return render(request, self._TEMPLATE, context) diff --git a/locale/de/LC_MESSAGES/django.mo b/locale/de/LC_MESSAGES/django.mo index d35d602883beb5424bdfc1c4205c1aa7daa5e18a..c9a22673b615d664eebe6e2487fcf12849e6deaf 100644 GIT binary patch delta 11811 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\n" "Language-Team: LANGUAGE \n" @@ -448,11 +448,19 @@ msgid "Select the intervention for which this compensation compensates" msgstr "Wählen Sie den Eingriff, für den diese Kompensation bestimmt ist" #: compensation/forms/compensation.py:114 -#: compensation/views/compensation/compensation.py:111 +#: compensation/views/compensation/compensation.py:161 msgid "New compensation" msgstr "Neue Kompensation" -#: compensation/forms/compensation.py:190 +#: compensation/forms/compensation.py:179 +msgid "" +"This intervention is currently recorded. You cannot add further " +"compensations as long as it is recorded." +msgstr "" +"Dieser Eingriff ist derzeit verzeichnet. " +"Sie können keine weiteren Kompensationen hinzufügen, so lange er verzeichnet ist." + +#: compensation/forms/compensation.py:202 msgid "Edit compensation" msgstr "Bearbeite Kompensation" @@ -1288,18 +1296,25 @@ msgstr "" msgid "Responsible data" msgstr "Daten zu den verantwortlichen Stellen" -#: compensation/views/compensation/compensation.py:34 +#: compensation/views/compensation/compensation.py:35 msgid "Compensations - Overview" msgstr "Kompensationen - Übersicht" -#: compensation/views/compensation/compensation.py:158 +#: compensation/views/compensation/compensation.py:52 +#, fuzzy +#| msgid "New compensation" +msgid "New Compensation" +msgstr "Neue Kompensation" + +#: compensation/views/compensation/compensation.py:208 #: konova/utils/message_templates.py:40 msgid "Compensation {} edited" msgstr "Kompensation {} bearbeitet" -#: compensation/views/compensation/compensation.py:181 -#: compensation/views/eco_account/eco_account.py:159 ema/views/ema.py:213 -#: intervention/views/intervention.py:59 intervention/views/intervention.py:186 +#: compensation/views/compensation/compensation.py:231 +#: compensation/views/eco_account/eco_account.py:159 ema/views/ema.py:59 +#: intervention/views/intervention.py:59 intervention/views/intervention.py:179 +#: konova/views/base.py:239 msgid "Edit {}" msgstr "Bearbeite {}" @@ -1319,8 +1334,7 @@ msgstr "Ökokonto {} bearbeitet" msgid "Eco-account removed" msgstr "Ökokonto entfernt" -#: ema/forms.py:42 ema/tests/unit/test_forms.py:27 ema/views/ema.py:92 -#: ema/views/ema.py:102 +#: ema/forms.py:42 ema/tests/unit/test_forms.py:27 ema/views/ema.py:42 msgid "New EMA" msgstr "Neue EMA hinzufügen" @@ -1348,19 +1362,11 @@ msgstr "" msgid "Payment funded compensation" msgstr "Ersatzzahlungsmaßnahme" -#: ema/views/ema.py:31 +#: ema/views/ema.py:26 msgid "EMAs - Overview" msgstr "EMAs - Übersicht" -#: ema/views/ema.py:70 -msgid "EMA {} added" -msgstr "EMA {} hinzugefügt" - -#: ema/views/ema.py:190 -msgid "EMA {} edited" -msgstr "EMA {} bearbeitet" - -#: ema/views/ema.py:237 +#: ema/views/ema.py:138 msgid "EMA removed" msgstr "EMA entfernt" @@ -1664,11 +1670,11 @@ msgstr "Prüfung durchgeführt" msgid "Interventions - Overview" msgstr "Eingriffe - Übersicht" -#: intervention/views/intervention.py:161 +#: intervention/views/intervention.py:154 msgid "Intervention {} edited" msgstr "Eingriff {} bearbeitet" -#: intervention/views/intervention.py:211 +#: intervention/views/intervention.py:204 msgid "{} removed" msgstr "{} entfernt" @@ -2306,7 +2312,7 @@ msgstr "" msgid "{} added" msgstr "{} hinzugefügt" -#: konova/views/base.py:274 +#: konova/views/base.py:281 msgid "{} edited" msgstr "{} bearbeitet" @@ -3151,3 +3157,9 @@ msgstr "Sie sind kein Mitglied dieses Teams" #: user/views/views.py:204 msgid "Left Team" msgstr "Team verlassen" + +#~ msgid "EMA {} added" +#~ msgstr "EMA {} hinzugefügt" + +#~ msgid "EMA {} edited" +#~ msgstr "EMA {} bearbeitet"