From c7a4c309bfb7622b6003d1c4a832d11019eec3b6 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Tue, 21 Oct 2025 08:48:30 +0200 Subject: [PATCH] # CompensationAction views refactored * refactors AbstractCompensationActionViews (new, edit, remove) to inherit from BaseModalFormView * refactors KOM, OEK, EMA views for compensation actions * moves message template strings into message_templates.py --- .../forms/modals/compensation_action.py | 9 +- .../tests/compensation/unit/test_forms.py | 12 ++- compensation/views/compensation/action.py | 46 ++------- compensation/views/eco_account/action.py | 38 ++------ ema/views/action.py | 41 +++----- konova/utils/message_templates.py | 4 + konova/views/action.py | 95 ++++--------------- konova/views/record.py | 7 +- 8 files changed, 68 insertions(+), 184 deletions(-) diff --git a/compensation/forms/modals/compensation_action.py b/compensation/forms/modals/compensation_action.py index 6c5e0666..54156b13 100644 --- a/compensation/forms/modals/compensation_action.py +++ b/compensation/forms/modals/compensation_action.py @@ -7,10 +7,12 @@ Created on: 18.08.22 """ from dal import autocomplete from django import forms +from django.shortcuts import get_object_or_404 from django.utils.translation import gettext_lazy as _ from codelist.models import KonovaCode from codelist.settings import CODELIST_COMPENSATION_ACTION_ID, CODELIST_COMPENSATION_ACTION_DETAIL_ID +from compensation.models import CompensationAction from intervention.inputs import CompensationActionTreeCheckboxSelectMultiple from konova.forms.modals import BaseModalForm, RemoveModalForm from konova.utils.message_templates import COMPENSATION_ACTION_EDITED, ADDED_COMPENSATION_ACTION @@ -114,7 +116,8 @@ class EditCompensationActionModalForm(NewCompensationActionModalForm): action = None def __init__(self, *args, **kwargs): - self.action = kwargs.pop("action", None) + action_id = kwargs.pop("action_id", None) + self.action = get_object_or_404(CompensationAction, id=action_id) super().__init__(*args, **kwargs) self.form_title = _("Edit action") form_data = { @@ -147,8 +150,8 @@ class RemoveCompensationActionModalForm(RemoveModalForm): action = None def __init__(self, *args, **kwargs): - action = kwargs.pop("action", None) - self.action = action + action_id = kwargs.pop("action_id", None) + self.action = get_object_or_404(CompensationAction, id=action_id) super().__init__(*args, **kwargs) def save(self): diff --git a/compensation/tests/compensation/unit/test_forms.py b/compensation/tests/compensation/unit/test_forms.py index 333ea947..dd804b77 100644 --- a/compensation/tests/compensation/unit/test_forms.py +++ b/compensation/tests/compensation/unit/test_forms.py @@ -80,7 +80,11 @@ class EditCompensationActionModalFormTestCase(NewCompensationActionModalFormTest self.compensation.actions.add(self.comp_action) def test_init(self): - form = EditCompensationActionModalForm(request=self.request, instance=self.compensation, action=self.comp_action) + form = EditCompensationActionModalForm( + request=self.request, + instance=self.compensation, + action_id=self.comp_action.id + ) self.assertEqual(form.form_title, str(_("Edit action"))) self.assertEqual(len(form.fields["action_type"].initial), self.comp_action.action_type.count()) self.assertEqual(len(form.fields["action_type_details"].initial), self.comp_action.action_type_details.count()) @@ -101,7 +105,7 @@ class EditCompensationActionModalFormTestCase(NewCompensationActionModalFormTest "comment": comment, } - form = EditCompensationActionModalForm(data, request=self.request, instance=self.compensation, action=self.comp_action) + form = EditCompensationActionModalForm(data, request=self.request, instance=self.compensation, action_id=self.comp_action.id) self.assertTrue(form.is_valid()) action = form.save() @@ -126,7 +130,7 @@ class RemoveCompensationActionModalFormTestCase(EditCompensationActionModalFormT def test_init(self): self.assertIn(self.comp_action, self.compensation.actions.all()) - form = RemoveCompensationActionModalForm(request=self.request, instance=self.compensation, action=self.comp_action) + form = RemoveCompensationActionModalForm(request=self.request, instance=self.compensation, action_id=self.comp_action.id) self.assertEqual(form.action, self.comp_action) def test_save(self): @@ -137,7 +141,7 @@ class RemoveCompensationActionModalFormTestCase(EditCompensationActionModalFormT data, request=self.request, instance=self.compensation, - action=self.comp_action + action_id=self.comp_action.id ) self.assertTrue(form.is_valid()) self.assertIn(self.comp_action, self.compensation.actions.all()) diff --git a/compensation/views/compensation/action.py b/compensation/views/compensation/action.py index aa87c71d..9b412d6f 100644 --- a/compensation/views/compensation/action.py +++ b/compensation/views/compensation/action.py @@ -5,53 +5,23 @@ Contact: ksp-servicestelle@sgdnord.rlp.de Created on: 19.08.22 """ -from django.contrib.auth.decorators import login_required -from django.http import HttpRequest -from django.shortcuts import get_object_or_404 -from django.urls import reverse -from django.utils.decorators import method_decorator -from compensation.forms.modals.compensation_action import RemoveCompensationActionModalForm, \ - EditCompensationActionModalForm, NewCompensationActionModalForm -from compensation.models import Compensation, CompensationAction -from konova.decorators import shared_access_required, default_group_required, login_required_modal -from konova.utils.message_templates import COMPENSATION_ACTION_REMOVED, COMPENSATION_ACTION_EDITED, \ - COMPENSATION_ACTION_ADDED +from compensation.models import Compensation from konova.views.action import AbstractNewCompensationActionView, AbstractEditCompensationActionView, \ AbstractRemoveCompensationActionView +_COMPENSATION_DETAIL_URL_NAME = "compensation:detail" class NewCompensationActionView(AbstractNewCompensationActionView): - model = Compensation - 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) + _MODEL_CLS = Compensation + _REDIRECT_URL = _COMPENSATION_DETAIL_URL_NAME class EditCompensationActionView(AbstractEditCompensationActionView): - model = Compensation - 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) + _MODEL_CLS = Compensation + _REDIRECT_URL = _COMPENSATION_DETAIL_URL_NAME class RemoveCompensationActionView(AbstractRemoveCompensationActionView): - model = Compensation - 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) + _MODEL_CLS = Compensation + _REDIRECT_URL = _COMPENSATION_DETAIL_URL_NAME diff --git a/compensation/views/eco_account/action.py b/compensation/views/eco_account/action.py index 6aca3825..f94156a2 100644 --- a/compensation/views/eco_account/action.py +++ b/compensation/views/eco_account/action.py @@ -5,46 +5,22 @@ 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.models import EcoAccount -from konova.decorators import shared_access_required, default_group_required, login_required_modal from konova.views.action import AbstractNewCompensationActionView, AbstractEditCompensationActionView, \ AbstractRemoveCompensationActionView +_ECO_ACCOUNT_DETAIL_URL_NAME = "compensation:acc:detail" class NewEcoAccountActionView(AbstractNewCompensationActionView): - model = EcoAccount - 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) + _MODEL_CLS = EcoAccount + _REDIRECT_URL = _ECO_ACCOUNT_DETAIL_URL_NAME class EditEcoAccountActionView(AbstractEditCompensationActionView): - model = EcoAccount - 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) + _MODEL_CLS = EcoAccount + _REDIRECT_URL = _ECO_ACCOUNT_DETAIL_URL_NAME class RemoveEcoAccountActionView(AbstractRemoveCompensationActionView): - model = EcoAccount - 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) + _MODEL_CLS = EcoAccount + _REDIRECT_URL = _ECO_ACCOUNT_DETAIL_URL_NAME diff --git a/ema/views/action.py b/ema/views/action.py index 068c224a..e09511fd 100644 --- a/ema/views/action.py +++ b/ema/views/action.py @@ -5,46 +5,31 @@ 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.models import Ema -from konova.decorators import shared_access_required, conservation_office_group_required, login_required_modal from konova.views.action import AbstractNewCompensationActionView, AbstractEditCompensationActionView, \ AbstractRemoveCompensationActionView +_EMA_ACCOUNT_DETAIL_URL_NAME = "ema:detail" class NewEmaActionView(AbstractNewCompensationActionView): - model = Ema - redirect_url = "ema:detail" - - @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) + _MODEL_CLS = Ema + _REDIRECT_URL = _EMA_ACCOUNT_DETAIL_URL_NAME + def _user_has_permission(self, user): + return user.is_ets_user() class EditEmaActionView(AbstractEditCompensationActionView): - model = Ema - redirect_url = "ema:detail" + _MODEL_CLS = Ema + _REDIRECT_URL = _EMA_ACCOUNT_DETAIL_URL_NAME - @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() class RemoveEmaActionView(AbstractRemoveCompensationActionView): - model = Ema - redirect_url = "ema:detail" + _MODEL_CLS = Ema + _REDIRECT_URL = _EMA_ACCOUNT_DETAIL_URL_NAME - @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/konova/utils/message_templates.py b/konova/utils/message_templates.py index ba44934b..09ead4da 100644 --- a/konova/utils/message_templates.py +++ b/konova/utils/message_templates.py @@ -19,7 +19,11 @@ IDENTIFIER_REPLACED = _("The identifier '{}' had to be changed to '{}' since ano ENTRY_REMOVE_MISSING_PERMISSION = _("Only conservation or registration office users are allowed to remove entries.") MISSING_GROUP_PERMISSION = _("You need to be part of another user group.") CHECK_STATE_RESET = _("Status of Checked reset") + +# RECORDING RECORDED_BLOCKS_EDIT = _("Entry is recorded. To edit data, the entry first needs to be unrecorded.") +ENTRY_RECORDED = _("{} recorded") +ENTRY_UNRECORDED = _("{} unrecorded") # SHARE DATA_UNSHARED = _("This data is not shared with you") diff --git a/konova/views/action.py b/konova/views/action.py index 5699a963..cd00187d 100644 --- a/konova/views/action.py +++ b/konova/views/action.py @@ -5,104 +5,47 @@ Contact: ksp-servicestelle@sgdnord.rlp.de Created on: 22.08.22 """ -from django.shortcuts import get_object_or_404 -from django.urls import reverse -from django.views import View +from django.contrib.auth.mixins import LoginRequiredMixin from compensation.forms.modals.compensation_action import NewCompensationActionModalForm, \ EditCompensationActionModalForm, RemoveCompensationActionModalForm -from compensation.models import CompensationAction from konova.utils.message_templates import COMPENSATION_STATE_ADDED, COMPENSATION_STATE_EDITED, \ COMPENSATION_STATE_REMOVED +from konova.views.base import BaseModalFormView -class AbstractCompensationActionView(View): - model = None - redirect_url = None +class AbstractCompensationActionView(LoginRequiredMixin, BaseModalFormView): + _MODEL_CLS = None + _REDIRECT_URL = None class Meta: abstract = True + def _user_has_permission(self, user): + return user.is_default_user() + + def _get_redirect_url(self, *args, **kwargs): + return super()._get_redirect_url(*args, **kwargs) + "#related_data" class AbstractNewCompensationActionView(AbstractCompensationActionView): + _FORM_CLS = NewCompensationActionModalForm + _MSG_SUCCESS = COMPENSATION_STATE_ADDED + class Meta: abstract = True - def get(self, request, id: str): - """ Renders a form for adding new actions - - Args: - request (HttpRequest): The incoming request - id (str): The object's id to which the new action will be related - - Returns: - - """ - obj = get_object_or_404(self.model, id=id) - form = NewCompensationActionModalForm(request.POST or None, instance=obj, request=request) - return form.process_request( - request, - msg_success=COMPENSATION_STATE_ADDED, - redirect_url=reverse(self.redirect_url, args=(id,)) + "#related_data" - ) - - def post(self, request, id: str): - return self.get(request, id) - class AbstractEditCompensationActionView(AbstractCompensationActionView): + _FORM_CLS = EditCompensationActionModalForm + _MSG_SUCCESS = COMPENSATION_STATE_EDITED + class Meta: abstract = True - - def get(self, request, id: str, action_id: str): - """ Renders a form for editing a action - - Args: - request (HttpRequest): The incoming request - id (str): The object id - action_id (str): The action's id - - Returns: - - """ - obj = get_object_or_404(self.model, id=id) - action = get_object_or_404(CompensationAction, id=action_id) - form = EditCompensationActionModalForm(request.POST or None, instance=obj, action=action, request=request) - return form.process_request( - request, - msg_success=COMPENSATION_STATE_EDITED, - redirect_url=reverse(self.redirect_url, args=(id,)) + "#related_data" - ) - - def post(self, request, id: str, action_id: str): - return self.get(request, id, action_id) class AbstractRemoveCompensationActionView(AbstractCompensationActionView): + _FORM_CLS = RemoveCompensationActionModalForm + _MSG_SUCCESS = COMPENSATION_STATE_REMOVED + class Meta: abstract = True - - def get(self, request, id: str, action_id: str): - """ Renders a form for removing aaction - - Args: - request (HttpRequest): The incoming request - id (str): The object id - action_id (str): The action's id - - Returns: - - """ - obj = get_object_or_404(self.model, id=id) - action = get_object_or_404(CompensationAction, id=action_id) - form = RemoveCompensationActionModalForm(request.POST or None, instance=obj, action=action, request=request) - return form.process_request( - request, - msg_success=COMPENSATION_STATE_REMOVED, - redirect_url=reverse(self.redirect_url, args=(id,)) + "#related_data" - ) - - def post(self, request, id: str, action_id: str): - return self.get(request, id, action_id) - - diff --git a/konova/views/record.py b/konova/views/record.py index f2c09640..7f3c41ce 100644 --- a/konova/views/record.py +++ b/konova/views/record.py @@ -5,9 +5,8 @@ Contact: ksp-servicestelle@sgdnord.rlp.de Created on: 19.08.22 """ -from django.utils.translation import gettext_lazy as _ - from konova.forms.modals import RecordModalForm +from konova.utils.message_templates import ENTRY_RECORDED, ENTRY_UNRECORDED from konova.views.base import BaseModalFormView @@ -24,6 +23,6 @@ class AbstractRecordView(BaseModalFormView): assert obj is not None if obj.is_recorded: - return _("{} recorded").format(obj.identifier) + return ENTRY_RECORDED.format(obj.identifier) else: - return _("{} unrecorded").format(obj.identifier) + return ENTRY_UNRECORDED.format(obj.identifier)