From 554ade6794e7f583b4fc268afdfaef5b6a639f0b Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Tue, 21 Oct 2025 19:15:17 +0200 Subject: [PATCH] # Share view refactoring * refactors share views for eiv, oek, ema (kom does not have any) --- compensation/views/eco_account/share.py | 22 ++--------- ema/views/share.py | 24 +++--------- intervention/views/share.py | 22 ++--------- konova/views/share.py | 50 +++++++++++-------------- 4 files changed, 35 insertions(+), 83 deletions(-) diff --git a/compensation/views/eco_account/share.py b/compensation/views/eco_account/share.py index 19c8903a..3dade1e6 100644 --- a/compensation/views/eco_account/share.py +++ b/compensation/views/eco_account/share.py @@ -5,29 +5,15 @@ 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.share import AbstractShareByTokenView, AbstractShareFormView class EcoAccountShareByTokenView(AbstractShareByTokenView): - model = EcoAccount - redirect_url = "compensation:acc:detail" - - @method_decorator(login_required) - def dispatch(self, request, *args, **kwargs): - return super().dispatch(request, *args, **kwargs) + _MODEL_CLS = EcoAccount + _REDIRECT_URL = "compensation:acc:detail" class EcoAccountShareFormView(AbstractShareFormView): - model = EcoAccount - - @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 = "compensation:acc:detail" diff --git a/ema/views/share.py b/ema/views/share.py index 00b75e7c..84ebfdbf 100644 --- a/ema/views/share.py +++ b/ema/views/share.py @@ -5,29 +5,17 @@ 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 conservation_office_group_required, shared_access_required, login_required_modal from konova.views.share import AbstractShareByTokenView, AbstractShareFormView class EmaShareByTokenView(AbstractShareByTokenView): - model = Ema - redirect_url = "ema:detail" - - @method_decorator(login_required) - def dispatch(self, request, *args, **kwargs): - return super().dispatch(request, *args, **kwargs) - + _MODEL_CLS = Ema + _REDIRECT_URL = "ema:detail" class EmaShareFormView(AbstractShareFormView): - model = Ema + _MODEL_CLS = 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) + def _user_has_permission(self, user): + return user.is_ets_user() \ No newline at end of file diff --git a/intervention/views/share.py b/intervention/views/share.py index c72e2183..deee54e6 100644 --- a/intervention/views/share.py +++ b/intervention/views/share.py @@ -5,29 +5,15 @@ 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.models import Intervention -from konova.decorators import default_group_required, shared_access_required, login_required_modal from konova.views.share import AbstractShareByTokenView, AbstractShareFormView class InterventionShareByTokenView(AbstractShareByTokenView): - model = Intervention - redirect_url = "intervention:detail" - - @method_decorator(login_required) - def dispatch(self, request, *args, **kwargs): - return super().dispatch(request, *args, **kwargs) + _MODEL_CLS = Intervention + _REDIRECT_URL = "intervention:detail" class InterventionShareFormView(AbstractShareFormView): - model = Intervention - - @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 + _REDIRECT_URL = "intervention:detail" \ No newline at end of file diff --git a/konova/views/share.py b/konova/views/share.py index abcbecaa..4d894338 100644 --- a/konova/views/share.py +++ b/konova/views/share.py @@ -6,24 +6,24 @@ Created on: 22.08.22 """ from django.contrib import messages +from django.contrib.auth.mixins import LoginRequiredMixin from django.shortcuts import get_object_or_404, redirect -from django.views import View from django.utils.translation import gettext_lazy as _ from intervention.forms.modals.share import ShareModalForm from konova.utils.message_templates import DATA_SHARE_SET +from konova.views.base import BaseView, BaseModalFormView -class AbstractShareByTokenView(View): - model = None - redirect_url = None +class AbstractShareByTokenView(LoginRequiredMixin, BaseView): + _MODEL_CLS = None + _REDIRECT_URL = None class Meta: abstract = True def get(self, request, id: str, token: str): - - """ Performs sharing of an intervention + """ Performs sharing of an entry If token given in url is not valid, the user will be redirected to the dashboard @@ -36,7 +36,7 @@ class AbstractShareByTokenView(View): """ user = request.user - obj = get_object_or_404(self.model, id=id) + obj = get_object_or_404(self._MODEL_CLS, id=id) # Check tokens if obj.access_token == token: # Send different messages in case user has already been added to list of sharing users @@ -51,7 +51,7 @@ class AbstractShareByTokenView(View): _("{} has been shared with you").format(obj.identifier) ) obj.share_with_user(user) - return redirect(self.redirect_url, id=id) + return redirect(self._REDIRECT_URL, id=id) else: messages.error( request, @@ -60,29 +60,21 @@ class AbstractShareByTokenView(View): ) return redirect("home") + def _user_has_permission(self, user): + return user.is_default_user() -class AbstractShareFormView(View): - model = None + def _user_has_shared_access(self, user, **kwargs): + # The user does not need to have shared access to call the endpoint which gives them shared access + return True + + +class AbstractShareFormView(LoginRequiredMixin, BaseModalFormView): + _MODEL_CLS = None + _FORM_CLS = ShareModalForm + _MSG_SUCCESS = DATA_SHARE_SET class Meta: abstract = True - - def get(self, request, id: str): - """ Renders sharing form - Args: - request (HttpRequest): The incoming request - id (str): Object's id - - Returns: - - """ - obj = get_object_or_404(self.model, id=id) - form = ShareModalForm(request.POST or None, instance=obj, request=request) - return form.process_request( - request, - msg_success=DATA_SHARE_SET - ) - - def post(self, request, id: str): - return self.get(request, id) + def _user_has_permission(self, user): + return user.is_default_user()