# Resubmission view refactoring

* refactors resubmission view for eiv, kom, oek, ema
* removes unused attributes on BaseModalFormView
This commit is contained in:
mpeltriaux 2025-10-21 17:03:12 +02:00
parent 1fc1b533cd
commit 3a9c4e13f6
12 changed files with 69 additions and 106 deletions

View File

@ -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

View File

@ -5,22 +5,12 @@ Contact: ksp-servicestelle@sgdnord.rlp.de
Created on: 19.08.22 Created on: 19.08.22
""" """
from django.contrib.auth.decorators import login_required from compensation.forms.modals.resubmission import CompensationResubmissionModalForm
from django.utils.decorators import method_decorator
from compensation.models import Compensation from compensation.models import Compensation
from konova.decorators import shared_access_required, default_group_required, login_required_modal
from konova.views.resubmission import AbstractResubmissionView from konova.views.resubmission import AbstractResubmissionView
class CompensationResubmissionView(AbstractResubmissionView): class CompensationResubmissionView(AbstractResubmissionView):
model = Compensation _MODEL_CLS = Compensation
redirect_url_base = "compensation:detail" _FORM_CLS = CompensationResubmissionModalForm
form_action_url_base = "compensation:resubmission-create" _REDIRECT_URL = "compensation:detail"
@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)

View File

@ -5,22 +5,12 @@ Contact: ksp-servicestelle@sgdnord.rlp.de
Created on: 19.08.22 Created on: 19.08.22
""" """
from django.contrib.auth.decorators import login_required from compensation.forms.modals.resubmission import EcoAccountResubmissionModalForm
from django.utils.decorators import method_decorator
from compensation.models import EcoAccount from compensation.models import EcoAccount
from konova.decorators import shared_access_required, default_group_required, login_required_modal
from konova.views.resubmission import AbstractResubmissionView from konova.views.resubmission import AbstractResubmissionView
class EcoAccountResubmissionView(AbstractResubmissionView): class EcoAccountResubmissionView(AbstractResubmissionView):
model = EcoAccount _MODEL_CLS = EcoAccount
redirect_url_base = "compensation:acc:detail" _FORM_CLS = EcoAccountResubmissionModalForm
form_action_url_base = "compensation:acc:resubmission-create" _REDIRECT_URL = "compensation:acc:detail"
@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)

View File

@ -15,7 +15,8 @@ from compensation.forms.compensation import AbstractCompensationForm
from ema.models import Ema, EmaDocument from ema.models import Ema, EmaDocument
from intervention.models import Responsibility, Handler from intervention.models import Responsibility, Handler
from konova.forms import SimpleGeomForm 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 from user.models import UserActionLogEntry
@ -176,4 +177,7 @@ class EditEmaDocumentModalForm(EditDocumentModalForm):
_DOCUMENT_CLS = EmaDocument _DOCUMENT_CLS = EmaDocument
class RemoveEmaDocumentModalForm(RemoveDocumentModalForm): class RemoveEmaDocumentModalForm(RemoveDocumentModalForm):
_DOCUMENT_CLS = EmaDocument _DOCUMENT_CLS = EmaDocument
class EmaResubmissionModalForm(ResubmissionModalForm):
_MODEL_CLS = Ema

View File

@ -5,22 +5,16 @@ Contact: ksp-servicestelle@sgdnord.rlp.de
Created on: 19.08.22 Created on: 19.08.22
""" """
from django.contrib.auth.decorators import login_required from ema.forms import EmaResubmissionModalForm
from django.utils.decorators import method_decorator
from ema.models import Ema 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 from konova.views.resubmission import AbstractResubmissionView
class EmaResubmissionView(AbstractResubmissionView): class EmaResubmissionView(AbstractResubmissionView):
model = Ema _MODEL_CLS = Ema
redirect_url_base = "ema:detail" _FORM_CLS = EmaResubmissionModalForm
form_action_url_base = "ema:resubmission-create" _REDIRECT_URL = "ema:detail"
action_url = "ema:resubmission-create"
@method_decorator(login_required_modal) def _user_has_permission(self, user):
@method_decorator(login_required) return user.is_ets_user()
@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)

View File

@ -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

View File

@ -10,7 +10,6 @@ from django.utils.translation import gettext_lazy as _
from intervention.forms.modals.check import CheckModalForm from intervention.forms.modals.check import CheckModalForm
from intervention.models import Intervention from intervention.models import Intervention
from konova.utils.message_templates import INTERVENTION_INVALID
from konova.views.base import BaseModalFormView from konova.views.base import BaseModalFormView
@ -18,7 +17,6 @@ class InterventionCheckView(LoginRequiredMixin, BaseModalFormView):
_MODEL_CLS = Intervention _MODEL_CLS = Intervention
_FORM_CLS = CheckModalForm _FORM_CLS = CheckModalForm
_MSG_SUCCESS = _("Check performed") _MSG_SUCCESS = _("Check performed")
_MSG_ERROR = INTERVENTION_INVALID
_REDIRECT_URL = "intervention:detail" _REDIRECT_URL = "intervention:detail"
def _user_has_permission(self, user): def _user_has_permission(self, user):

View File

@ -5,22 +5,12 @@ Contact: ksp-servicestelle@sgdnord.rlp.de
Created on: 19.08.22 Created on: 19.08.22
""" """
from django.contrib.auth.decorators import login_required from intervention.forms.modals.resubmission import InterventionResubmissionModalForm
from django.utils.decorators import method_decorator
from intervention.models import Intervention from intervention.models import Intervention
from konova.decorators import default_group_required, shared_access_required, login_required_modal
from konova.views.resubmission import AbstractResubmissionView from konova.views.resubmission import AbstractResubmissionView
class InterventionResubmissionView(AbstractResubmissionView): class InterventionResubmissionView(AbstractResubmissionView):
model = Intervention _MODEL_CLS = Intervention
redirect_url_base = "intervention:detail" _FORM_CLS = InterventionResubmissionModalForm
form_action_url_base = "intervention:resubmission-create" _REDIRECT_URL = "intervention:detail"
@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)

View File

@ -10,7 +10,6 @@ from abc import abstractmethod
from django import forms from django import forms
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from compensation.models import EcoAccount
from konova.models import BaseObject from konova.models import BaseObject

View File

@ -98,4 +98,7 @@ DATA_CHECKED_PREVIOUSLY_TEMPLATE = _("Data has changed since last check on {} by
DATA_IS_UNCHECKED = _("Current data not checked yet") DATA_IS_UNCHECKED = _("Current data not checked yet")
# API TOKEN SETTINGS # API TOKEN SETTINGS
NEW_API_TOKEN_GENERATED = _("New token generated. Administrators need to validate.") NEW_API_TOKEN_GENERATED = _("New token generated. Administrators need to validate.")
# RESUBMISSION
NEW_RESUBMISSION_CREATED = _("Resubmission set")

View File

@ -44,6 +44,7 @@ class BaseView(View):
return super().dispatch(request, *args, **kwargs) return super().dispatch(request, *args, **kwargs)
@abstractmethod
def _user_has_permission(self, user): def _user_has_permission(self, user):
""" Has to be implemented properly by inheriting classes """ Has to be implemented properly by inheriting classes
@ -53,8 +54,9 @@ class BaseView(View):
Returns: Returns:
""" """
return False raise NotImplementedError("User permission not checked!")
@abstractmethod
def _user_has_shared_access(self, user, **kwargs): def _user_has_shared_access(self, user, **kwargs):
""" Has to be implemented properly by inheriting classes """ Has to be implemented properly by inheriting classes
@ -64,7 +66,7 @@ class BaseView(View):
Returns: Returns:
""" """
return False raise NotImplementedError("Shared access not checked!")
def _get_redirect_url(self, *args, **kwargs): def _get_redirect_url(self, *args, **kwargs):
return self._REDIRECT_URL return self._REDIRECT_URL
@ -76,9 +78,7 @@ class BaseModalFormView(BaseView):
_TEMPLATE = "modal/modal_form.html" _TEMPLATE = "modal/modal_form.html"
_MODEL_CLS = None _MODEL_CLS = None
_FORM_CLS = None _FORM_CLS = None
_TAB_TITLE = None
_MSG_SUCCESS = None _MSG_SUCCESS = None
_MSG_ERROR = None
class Meta: class Meta:
abstract = True abstract = True

View File

@ -5,51 +5,20 @@ Contact: ksp-servicestelle@sgdnord.rlp.de
Created on: 19.08.22 Created on: 19.08.22
""" """
from django.shortcuts import get_object_or_404 from django.contrib.auth.mixins import LoginRequiredMixin
from django.urls import reverse
from django.views import View
from django.utils.translation import gettext_lazy as _
from konova.forms.modals import ResubmissionModalForm from konova.utils.message_templates import NEW_RESUBMISSION_CREATED
from konova.views.base import BaseModalFormView
class AbstractResubmissionView(View): class AbstractResubmissionView(LoginRequiredMixin, BaseModalFormView):
model = None _MODEL_CLS = None
form_action_url_base = None _FORM_CLS = None
redirect_url_base = None _REDIRECT_URL = None
_MSG_SUCCESS = NEW_RESUBMISSION_CREATED
class Meta: class Meta:
abstract = True abstract = True
def get(self, request, id: str):
""" Renders resubmission form for an object
Args: def _user_has_permission(self, user):
request (HttpRequest): The incoming request return user.is_default_user()
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)