From a7b23935a12af9e5d6f8a6627c7fb98c5892c01c Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Mon, 20 Oct 2025 16:29:50 +0200 Subject: [PATCH] # RecordModalForm refactored * refactors AbstractRecordModalForm * refactors recording view for ema, intervention and eco account --- compensation/views/eco_account/record.py | 16 ++------ ema/views/record.py | 16 ++------ intervention/views/record.py | 15 ++------ konova/views/base.py | 4 +- konova/views/record.py | 49 +++++++----------------- 5 files changed, 29 insertions(+), 71 deletions(-) diff --git a/compensation/views/eco_account/record.py b/compensation/views/eco_account/record.py index 0d1f2070..5394af2f 100644 --- a/compensation/views/eco_account/record.py +++ b/compensation/views/eco_account/record.py @@ -5,20 +5,12 @@ Contact: ksp-servicestelle@sgdnord.rlp.de Created on: 19.08.22 """ -from django.contrib.auth.decorators import login_required -from django.utils.decorators import method_decorator +from django.contrib.auth.mixins import LoginRequiredMixin from compensation.models import EcoAccount -from konova.decorators import shared_access_required, conservation_office_group_required, login_required_modal from konova.views.record import AbstractRecordView -class EcoAccountRecordView(AbstractRecordView): - model = EcoAccount - - @method_decorator(login_required_modal) - @method_decorator(login_required) - @method_decorator(conservation_office_group_required) - @method_decorator(shared_access_required(EcoAccount, "id")) - def dispatch(self, request, *args, **kwargs): - return super().dispatch(request, *args, **kwargs) +class EcoAccountRecordView(LoginRequiredMixin, AbstractRecordView): + _MODEL_CLS = EcoAccount + _REDIRECT_URL = "compensation:acc:detail" diff --git a/ema/views/record.py b/ema/views/record.py index 83560999..83e7b5a1 100644 --- a/ema/views/record.py +++ b/ema/views/record.py @@ -5,20 +5,12 @@ Contact: ksp-servicestelle@sgdnord.rlp.de Created on: 19.08.22 """ -from django.contrib.auth.decorators import login_required -from django.utils.decorators import method_decorator +from django.contrib.auth.mixins import LoginRequiredMixin from ema.models import Ema -from konova.decorators import shared_access_required, conservation_office_group_required, login_required_modal from konova.views.record import AbstractRecordView -class EmaRecordView(AbstractRecordView): - model = Ema - - @method_decorator(login_required_modal) - @method_decorator(login_required) - @method_decorator(conservation_office_group_required) - @method_decorator(shared_access_required(Ema, "id")) - def dispatch(self, request, *args, **kwargs): - return super().dispatch(request, *args, **kwargs) +class EmaRecordView(LoginRequiredMixin, AbstractRecordView): + _MODEL_CLS = Ema + _REDIRECT_URL = "ema:detail" diff --git a/intervention/views/record.py b/intervention/views/record.py index a845fdfd..d425a89c 100644 --- a/intervention/views/record.py +++ b/intervention/views/record.py @@ -5,19 +5,12 @@ Contact: ksp-servicestelle@sgdnord.rlp.de Created on: 19.08.22 """ -from django.contrib.auth.decorators import login_required -from django.utils.decorators import method_decorator +from django.contrib.auth.mixins import LoginRequiredMixin from intervention.models import Intervention -from konova.decorators import conservation_office_group_required, shared_access_required from konova.views.record import AbstractRecordView -class InterventionRecordView(AbstractRecordView): - model = Intervention - - @method_decorator(login_required) - @method_decorator(conservation_office_group_required) - @method_decorator(shared_access_required(Intervention, "id")) - def dispatch(self, request, *args, **kwargs): - return super().dispatch(request, *args, **kwargs) +class InterventionRecordView(LoginRequiredMixin, AbstractRecordView): + _MODEL_CLS = Intervention + _REDIRECT_URL = "intervention:detail" diff --git a/konova/views/base.py b/konova/views/base.py index 5cc4fefe..d8b1ab0b 100644 --- a/konova/views/base.py +++ b/konova/views/base.py @@ -109,7 +109,7 @@ class BaseModalFormView(BaseView): form.save() messages.success( request, - self._MSG_SUCCESS + self._get_msg_success(obj=obj) ) return HttpResponseRedirect(redirect_url) else: @@ -124,6 +124,8 @@ class BaseModalFormView(BaseView): assert obj is not None return reverse(self._REDIRECT_URL, args=(obj.id,)) + def _get_msg_success(self, *args, **kwargs): + return self._MSG_SUCCESS class BaseIndexView(BaseView): """ Base class for index views diff --git a/konova/views/record.py b/konova/views/record.py index b80d1b0f..f2c09640 100644 --- a/konova/views/record.py +++ b/konova/views/record.py @@ -5,46 +5,25 @@ Contact: ksp-servicestelle@sgdnord.rlp.de Created on: 19.08.22 """ -from django.shortcuts import get_object_or_404 -from django.views import View from django.utils.translation import gettext_lazy as _ from konova.forms.modals import RecordModalForm +from konova.views.base import BaseModalFormView -class AbstractRecordView(View): - model = None +class AbstractRecordView(BaseModalFormView): + _MODEL_CLS = None + _FORM_CLS = RecordModalForm + _MSG_SUCCESS = None - def get(self, request, id: str): - """ Renders a modal form for recording an object + def _user_has_permission(self, user): + return user.is_ets_user() - Args: - request (HttpRequest): The incoming request - id (str): The object's id + def _get_msg_success(self, *args, **kwargs): + obj = kwargs.get("obj") + assert obj is not None - Returns: - - """ - obj = get_object_or_404(self.model, id=id) - form = RecordModalForm(request.POST or None, instance=obj, request=request) - msg_succ = _("{} unrecorded") if obj.recorded else _("{} recorded") - msg_succ = msg_succ.format(obj.identifier) - return form.process_request( - request, - msg_succ, - msg_error=_("Errors found:") - ) - - def post(self, request, id: str): - """ - - BaseModalForm provides the method process_request() which handles GET as well as POST requests. It was written - for easier handling of function based views. To support process_request() on class based views, the post() - call needs to be treated the same way as the get() call. - - Args: - request (HttpRequest): The incoming request - id (str): Intervention's id - - """ - return self.get(request, id) + if obj.is_recorded: + return _("{} recorded").format(obj.identifier) + else: + return _("{} unrecorded").format(obj.identifier)