From 3a9c4e13f688ff563cd909655ded3f32c99fe716 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Tue, 21 Oct 2025 17:03:12 +0200 Subject: [PATCH] # Resubmission view refactoring * refactors resubmission view for eiv, kom, oek, ema * removes unused attributes on BaseModalFormView --- compensation/forms/modals/resubmission.py | 15 ++++++ .../views/compensation/resubmission.py | 18 ++----- .../views/eco_account/resubmission.py | 18 ++----- ema/forms.py | 8 ++- ema/views/resubmission.py | 20 +++----- intervention/forms/modals/resubmission.py | 11 ++++ intervention/views/check.py | 2 - intervention/views/resubmission.py | 18 ++----- konova/forms/base_form.py | 1 - konova/utils/message_templates.py | 5 +- konova/views/base.py | 8 +-- konova/views/resubmission.py | 51 ++++--------------- 12 files changed, 69 insertions(+), 106 deletions(-) create mode 100644 compensation/forms/modals/resubmission.py create mode 100644 intervention/forms/modals/resubmission.py diff --git a/compensation/forms/modals/resubmission.py b/compensation/forms/modals/resubmission.py new file mode 100644 index 00000000..a723602a --- /dev/null +++ b/compensation/forms/modals/resubmission.py @@ -0,0 +1,15 @@ +""" +Author: Michel Peltriaux +Created on: 21.10.25 + +""" +from compensation.models import Compensation, EcoAccount +from konova.forms.modals import ResubmissionModalForm + + +class CompensationResubmissionModalForm(ResubmissionModalForm): + _MODEL_CLS = Compensation + + +class EcoAccountResubmissionModalForm(ResubmissionModalForm): + _MODEL_CLS = EcoAccount diff --git a/compensation/views/compensation/resubmission.py b/compensation/views/compensation/resubmission.py index 31b073e7..15f9b9d1 100644 --- a/compensation/views/compensation/resubmission.py +++ b/compensation/views/compensation/resubmission.py @@ -5,22 +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 compensation.forms.modals.resubmission import CompensationResubmissionModalForm from compensation.models import Compensation -from konova.decorators import shared_access_required, default_group_required, login_required_modal from konova.views.resubmission import AbstractResubmissionView class CompensationResubmissionView(AbstractResubmissionView): - model = Compensation - redirect_url_base = "compensation:detail" - form_action_url_base = "compensation:resubmission-create" - - @method_decorator(login_required_modal) - @method_decorator(login_required) - @method_decorator(default_group_required) - @method_decorator(shared_access_required(Compensation, "id")) - def dispatch(self, request, *args, **kwargs): - return super().dispatch(request, *args, **kwargs) + _MODEL_CLS = Compensation + _FORM_CLS = CompensationResubmissionModalForm + _REDIRECT_URL = "compensation:detail" diff --git a/compensation/views/eco_account/resubmission.py b/compensation/views/eco_account/resubmission.py index 19b8dca4..bf66488a 100644 --- a/compensation/views/eco_account/resubmission.py +++ b/compensation/views/eco_account/resubmission.py @@ -5,22 +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 compensation.forms.modals.resubmission import EcoAccountResubmissionModalForm from compensation.models import EcoAccount -from konova.decorators import shared_access_required, default_group_required, login_required_modal from konova.views.resubmission import AbstractResubmissionView class EcoAccountResubmissionView(AbstractResubmissionView): - model = EcoAccount - redirect_url_base = "compensation:acc:detail" - form_action_url_base = "compensation:acc:resubmission-create" - - @method_decorator(login_required_modal) - @method_decorator(login_required) - @method_decorator(default_group_required) - @method_decorator(shared_access_required(EcoAccount, "id")) - def dispatch(self, request, *args, **kwargs): - return super().dispatch(request, *args, **kwargs) + _MODEL_CLS = EcoAccount + _FORM_CLS = EcoAccountResubmissionModalForm + _REDIRECT_URL = "compensation:acc:detail" diff --git a/ema/forms.py b/ema/forms.py index 5a98a903..8b1a0c9d 100644 --- a/ema/forms.py +++ b/ema/forms.py @@ -15,7 +15,8 @@ from compensation.forms.compensation import AbstractCompensationForm from ema.models import Ema, EmaDocument from intervention.models import Responsibility, Handler from konova.forms import SimpleGeomForm -from konova.forms.modals import NewDocumentModalForm, EditDocumentModalForm, RemoveDocumentModalForm +from konova.forms.modals import NewDocumentModalForm, EditDocumentModalForm, RemoveDocumentModalForm, \ + ResubmissionModalForm from user.models import UserActionLogEntry @@ -176,4 +177,7 @@ class EditEmaDocumentModalForm(EditDocumentModalForm): _DOCUMENT_CLS = EmaDocument class RemoveEmaDocumentModalForm(RemoveDocumentModalForm): - _DOCUMENT_CLS = EmaDocument \ No newline at end of file + _DOCUMENT_CLS = EmaDocument + +class EmaResubmissionModalForm(ResubmissionModalForm): + _MODEL_CLS = Ema diff --git a/ema/views/resubmission.py b/ema/views/resubmission.py index c07c79ee..76ea60bd 100644 --- a/ema/views/resubmission.py +++ b/ema/views/resubmission.py @@ -5,22 +5,16 @@ 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 ema.forms import EmaResubmissionModalForm from ema.models import Ema -from konova.decorators import shared_access_required, conservation_office_group_required, login_required_modal from konova.views.resubmission import AbstractResubmissionView class EmaResubmissionView(AbstractResubmissionView): - model = Ema - redirect_url_base = "ema:detail" - form_action_url_base = "ema:resubmission-create" + _MODEL_CLS = Ema + _FORM_CLS = EmaResubmissionModalForm + _REDIRECT_URL = "ema:detail" + action_url = "ema:resubmission-create" - @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) + def _user_has_permission(self, user): + return user.is_ets_user() diff --git a/intervention/forms/modals/resubmission.py b/intervention/forms/modals/resubmission.py new file mode 100644 index 00000000..04b9ef5d --- /dev/null +++ b/intervention/forms/modals/resubmission.py @@ -0,0 +1,11 @@ +""" +Author: Michel Peltriaux +Created on: 21.10.25 + +""" +from intervention.models import Intervention +from konova.forms.modals import ResubmissionModalForm + + +class InterventionResubmissionModalForm(ResubmissionModalForm): + _MODEL_CLS = Intervention diff --git a/intervention/views/check.py b/intervention/views/check.py index 3ed0cdfb..07387913 100644 --- a/intervention/views/check.py +++ b/intervention/views/check.py @@ -10,7 +10,6 @@ from django.utils.translation import gettext_lazy as _ from intervention.forms.modals.check import CheckModalForm from intervention.models import Intervention -from konova.utils.message_templates import INTERVENTION_INVALID from konova.views.base import BaseModalFormView @@ -18,7 +17,6 @@ class InterventionCheckView(LoginRequiredMixin, BaseModalFormView): _MODEL_CLS = Intervention _FORM_CLS = CheckModalForm _MSG_SUCCESS = _("Check performed") - _MSG_ERROR = INTERVENTION_INVALID _REDIRECT_URL = "intervention:detail" def _user_has_permission(self, user): diff --git a/intervention/views/resubmission.py b/intervention/views/resubmission.py index 37fbd632..e3a3a053 100644 --- a/intervention/views/resubmission.py +++ b/intervention/views/resubmission.py @@ -5,22 +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 intervention.forms.modals.resubmission import InterventionResubmissionModalForm from intervention.models import Intervention -from konova.decorators import default_group_required, shared_access_required, login_required_modal from konova.views.resubmission import AbstractResubmissionView class InterventionResubmissionView(AbstractResubmissionView): - model = Intervention - redirect_url_base = "intervention:detail" - form_action_url_base = "intervention:resubmission-create" - - @method_decorator(login_required_modal) - @method_decorator(login_required) - @method_decorator(default_group_required) - @method_decorator(shared_access_required(Intervention, "id")) - def dispatch(self, request, *args, **kwargs): - return super().dispatch(request, *args, **kwargs) + _MODEL_CLS = Intervention + _FORM_CLS = InterventionResubmissionModalForm + _REDIRECT_URL = "intervention:detail" diff --git a/konova/forms/base_form.py b/konova/forms/base_form.py index ba526396..e648f796 100644 --- a/konova/forms/base_form.py +++ b/konova/forms/base_form.py @@ -10,7 +10,6 @@ from abc import abstractmethod from django import forms from django.utils.translation import gettext_lazy as _ -from compensation.models import EcoAccount from konova.models import BaseObject diff --git a/konova/utils/message_templates.py b/konova/utils/message_templates.py index 09ead4da..860dc9eb 100644 --- a/konova/utils/message_templates.py +++ b/konova/utils/message_templates.py @@ -98,4 +98,7 @@ DATA_CHECKED_PREVIOUSLY_TEMPLATE = _("Data has changed since last check on {} by DATA_IS_UNCHECKED = _("Current data not checked yet") # API TOKEN SETTINGS -NEW_API_TOKEN_GENERATED = _("New token generated. Administrators need to validate.") \ No newline at end of file +NEW_API_TOKEN_GENERATED = _("New token generated. Administrators need to validate.") + +# RESUBMISSION +NEW_RESUBMISSION_CREATED = _("Resubmission set") diff --git a/konova/views/base.py b/konova/views/base.py index 3c5d8499..a1de7e29 100644 --- a/konova/views/base.py +++ b/konova/views/base.py @@ -44,6 +44,7 @@ class BaseView(View): return super().dispatch(request, *args, **kwargs) + @abstractmethod def _user_has_permission(self, user): """ Has to be implemented properly by inheriting classes @@ -53,8 +54,9 @@ class BaseView(View): Returns: """ - return False + raise NotImplementedError("User permission not checked!") + @abstractmethod def _user_has_shared_access(self, user, **kwargs): """ Has to be implemented properly by inheriting classes @@ -64,7 +66,7 @@ class BaseView(View): Returns: """ - return False + raise NotImplementedError("Shared access not checked!") def _get_redirect_url(self, *args, **kwargs): return self._REDIRECT_URL @@ -76,9 +78,7 @@ class BaseModalFormView(BaseView): _TEMPLATE = "modal/modal_form.html" _MODEL_CLS = None _FORM_CLS = None - _TAB_TITLE = None _MSG_SUCCESS = None - _MSG_ERROR = None class Meta: abstract = True diff --git a/konova/views/resubmission.py b/konova/views/resubmission.py index 634949de..cbe21af0 100644 --- a/konova/views/resubmission.py +++ b/konova/views/resubmission.py @@ -5,51 +5,20 @@ Contact: ksp-servicestelle@sgdnord.rlp.de Created on: 19.08.22 """ -from django.shortcuts import get_object_or_404 -from django.urls import reverse -from django.views import View -from django.utils.translation import gettext_lazy as _ +from django.contrib.auth.mixins import LoginRequiredMixin -from konova.forms.modals import ResubmissionModalForm +from konova.utils.message_templates import NEW_RESUBMISSION_CREATED +from konova.views.base import BaseModalFormView -class AbstractResubmissionView(View): - model = None - form_action_url_base = None - redirect_url_base = None +class AbstractResubmissionView(LoginRequiredMixin, BaseModalFormView): + _MODEL_CLS = None + _FORM_CLS = None + _REDIRECT_URL = None + _MSG_SUCCESS = NEW_RESUBMISSION_CREATED class Meta: abstract = True - - def get(self, request, id: str): - """ Renders resubmission form for an object - Args: - request (HttpRequest): The incoming request - id (str): Object's id - - Returns: - - """ - obj = get_object_or_404(self.model, id=id) - form = ResubmissionModalForm(request.POST or None, instance=obj, request=request) - form.action_url = reverse(self.form_action_url_base, args=(id,)) - return form.process_request( - request, - msg_success=_("Resubmission set"), - redirect_url=reverse(self.redirect_url_base, args=(id,)) - ) - - 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) + def _user_has_permission(self, user): + return user.is_default_user()