From 88058d7caf9d47853822529c0c27cb157653e135 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Wed, 17 Dec 2025 14:34:04 +0100 Subject: [PATCH] # EcoAccount New and Edit * refactors new and edit method views into classes --- compensation/urls/eco_account.py | 8 +- compensation/views/eco_account/eco_account.py | 183 ++++++++++++------ 2 files changed, 124 insertions(+), 67 deletions(-) diff --git a/compensation/urls/eco_account.py b/compensation/urls/eco_account.py index a1ade266..d57f9b24 100644 --- a/compensation/urls/eco_account.py +++ b/compensation/urls/eco_account.py @@ -9,8 +9,8 @@ from django.urls import path from compensation.autocomplete.eco_account import EcoAccountAutocomplete from compensation.views.eco_account.detail import DetailEcoAccountView -from compensation.views.eco_account.eco_account import new_view, edit_view, \ - IndexEcoAccountView, EcoAccountIdentifierGeneratorView +from compensation.views.eco_account.eco_account import IndexEcoAccountView, EcoAccountIdentifierGeneratorView, \ + NewEcoAccountView, EditEcoAccountView from compensation.views.eco_account.log import EcoAccountLogView from compensation.views.eco_account.record import EcoAccountRecordView from compensation.views.eco_account.remove import RemoveEcoAccountView @@ -31,13 +31,13 @@ from compensation.views.eco_account.deduction import NewEcoAccountDeductionView, app_name = "acc" urlpatterns = [ path("", IndexEcoAccountView.as_view(), name="index"), - path('new/', new_view, name='new'), + path('new/', NewEcoAccountView.as_view(), name='new'), path('new/id', EcoAccountIdentifierGeneratorView.as_view(), name='new-id'), path('', DetailEcoAccountView.as_view(), name='detail'), path('/log', EcoAccountLogView.as_view(), name='log'), path('/record', EcoAccountRecordView.as_view(), name='record'), path('/report', EcoAccountPublicReportView.as_view(), name='report'), - path('/edit', edit_view, name='edit'), + path('/edit', EditEcoAccountView.as_view(), name='edit'), path('/remove', RemoveEcoAccountView.as_view(), name='remove'), path('/resub', EcoAccountResubmissionView.as_view(), name='resubmission-create'), diff --git a/compensation/views/eco_account/eco_account.py b/compensation/views/eco_account/eco_account.py index 8c98c5c1..251744e4 100644 --- a/compensation/views/eco_account/eco_account.py +++ b/compensation/views/eco_account/eco_account.py @@ -6,10 +6,12 @@ Created on: 19.08.22 """ from django.contrib import messages -from django.contrib.auth.decorators import login_required +from django.contrib.auth.mixins import LoginRequiredMixin from django.http import HttpRequest, HttpResponse from django.shortcuts import get_object_or_404, redirect, render +from django.utils.decorators import method_decorator from django.utils.translation import gettext_lazy as _ +from django.views import View from compensation.forms.eco_account import EditEcoAccountForm, NewEcoAccountForm from compensation.models import EcoAccount @@ -52,22 +54,46 @@ class IndexEcoAccountView(AbstractIndexView): return render(request, self._TEMPLATE, context) -@login_required -@default_group_required -def new_view(request: HttpRequest): - """ - Renders a view for a new eco account creation +class NewEcoAccountView(LoginRequiredMixin, View): + _TEMPLATE = "compensation/form/view.html" - Args: - request (HttpRequest): The incoming request + @method_decorator(default_group_required) + def get(self, request: HttpRequest, *args, **kwargs) -> HttpResponse: + """ + Renders a view for a new eco account creation - Returns: + Args: + request (HttpRequest): The incoming request - """ - template = "compensation/form/view.html" - data_form = NewEcoAccountForm(request.POST or None) - geom_form = SimpleGeomForm(request.POST or None, read_only=False) - if request.method == "POST": + Returns: + + """ + data_form = NewEcoAccountForm(request.POST or None) + geom_form = SimpleGeomForm(request.POST or None, read_only=False) + + context = { + "form": data_form, + "geom_form": geom_form, + TAB_TITLE_IDENTIFIER: _("New Eco-Account"), + } + context = BaseContext(request, context).context + + return render(request, self._TEMPLATE, context) + + @method_decorator(default_group_required) + def post(self, request: HttpRequest, *args, **kwargs) -> HttpResponse: + + """ + Renders a view for a new eco account creation + + Args: + request (HttpRequest): The incoming request + + Returns: + + """ + data_form = NewEcoAccountForm(request.POST or None) + geom_form = SimpleGeomForm(request.POST or None, read_only=False) if data_form.is_valid() and geom_form.is_valid(): generated_identifier = data_form.cleaned_data.get("identifier", None) acc = data_form.save(request.user, geom_form) @@ -85,58 +111,92 @@ def new_view(request: HttpRequest): 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:acc:detail", id=acc.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: _("New Eco-Account"), - } - context = BaseContext(request, context).context - return render(request, template, context) + messages.error(request, FORM_INVALID, extra_tags="danger", ) + + context = { + "form": data_form, + "geom_form": geom_form, + TAB_TITLE_IDENTIFIER: _("New Eco-Account"), + } + context = BaseContext(request, context).context + + return render(request, self._TEMPLATE, context) class EcoAccountIdentifierGeneratorView(AbstractIdentifierGeneratorView): _MODEL = EcoAccount -@login_required -@default_group_required -@shared_access_required(EcoAccount, "id") -def edit_view(request: HttpRequest, id: str): - """ - Renders a view for editing compensations - Args: - request (HttpRequest): The incoming request +class EditEcoAccountView(LoginRequiredMixin, View): + _TEMPLATE = "compensation/form/view.html" - Returns: + @method_decorator(default_group_required) + @method_decorator(shared_access_required(EcoAccount, "id")) + def get(self, request: HttpRequest, id: str, *args, **kwargs) -> HttpResponse: - """ - template = "compensation/form/view.html" - # Get object from db - acc = get_object_or_404(EcoAccount, id=id) - if acc.is_recorded: - messages.info( - request, - RECORDED_BLOCKS_EDIT - ) - return redirect("compensation:acc:detail", id=id) + """ + Renders a view for editing compensations + + Args: + request (HttpRequest): The incoming request + + Returns: + + """ + # Get object from db + acc = get_object_or_404(EcoAccount, id=id) + if acc.is_recorded: + messages.info( + request, + RECORDED_BLOCKS_EDIT + ) + return redirect("compensation:acc:detail", id=id) + + # Create forms, initialize with values from db/from POST request + data_form = EditEcoAccountForm(request.POST or None, instance=acc) + geom_form = SimpleGeomForm(request.POST or None, read_only=False, instance=acc) + + context = { + "form": data_form, + "geom_form": geom_form, + TAB_TITLE_IDENTIFIER: _("Edit {}").format(acc.identifier), + } + context = BaseContext(request, context).context + return render(request, self._TEMPLATE, context) + + @method_decorator(default_group_required) + @method_decorator(shared_access_required(EcoAccount, "id")) + def post(self, request: HttpRequest, id: str, *args, **kwargs) -> HttpResponse: + + """ + Renders a view for editing compensations + + Args: + request (HttpRequest): The incoming request + + Returns: + + """ + # Get object from db + acc = get_object_or_404(EcoAccount, id=id) + if acc.is_recorded: + messages.info( + request, + RECORDED_BLOCKS_EDIT + ) + return redirect("compensation:acc:detail", id=id) + + # Create forms, initialize with values from db/from POST request + data_form = EditEcoAccountForm(request.POST or None, instance=acc) + geom_form = SimpleGeomForm(request.POST or None, read_only=False, instance=acc) - # Create forms, initialize with values from db/from POST request - data_form = EditEcoAccountForm(request.POST or None, instance=acc) - geom_form = SimpleGeomForm(request.POST or None, read_only=False, instance=acc) - if request.method == "POST": data_form_valid = data_form.is_valid() geom_form_valid = geom_form.is_valid() if data_form_valid and geom_form_valid: @@ -148,24 +208,21 @@ def edit_view(request: HttpRequest, id: str): 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:acc:detail", id=acc.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(acc.identifier), - } - context = BaseContext(request, context).context - return render(request, template, context) + messages.error(request, FORM_INVALID, extra_tags="danger", ) + + context = { + "form": data_form, + "geom_form": geom_form, + TAB_TITLE_IDENTIFIER: _("Edit {}").format(acc.identifier), + } + context = BaseContext(request, context).context + + return render(request, self._TEMPLATE, context)