From a44d8658d40583b1ed565cb6a3b0d59e27409892 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Wed, 15 Oct 2025 16:29:05 +0200 Subject: [PATCH] # NewId Generator Ema refactoring * introduces BaseNewIdentifierGeneratorView class * refactors new identifier generator view for ema --- ema/urls.py | 5 +++-- ema/views/ema.py | 28 ++++++++++------------------ konova/views/base.py | 24 +++++++++++++++++++++++- 3 files changed, 36 insertions(+), 21 deletions(-) diff --git a/ema/urls.py b/ema/urls.py index 3901c704..5fad0959 100644 --- a/ema/urls.py +++ b/ema/urls.py @@ -10,7 +10,8 @@ from django.urls import path from ema.views.action import NewEmaActionView, EditEmaActionView, RemoveEmaActionView from ema.views.deadline import NewEmaDeadlineView, EditEmaDeadlineView, RemoveEmaDeadlineView from ema.views.document import NewEmaDocumentView, EditEmaDocumentView, RemoveEmaDocumentView, GetEmaDocumentView -from ema.views.ema import new_view, new_id_view, detail_view, edit_view, remove_view, EmaIndexView +from ema.views.ema import new_view, detail_view, edit_view, remove_view, EmaIndexView, \ + EmaIdentifierGeneratorView from ema.views.log import EmaLogView from ema.views.record import EmaRecordView from ema.views.report import report_view @@ -22,7 +23,7 @@ app_name = "ema" urlpatterns = [ path("", EmaIndexView.as_view(), name="index"), path("new/", new_view, name="new"), - path("new/id", new_id_view, name="new-id"), + path("new/id", EmaIdentifierGeneratorView.as_view(), name="new-id"), path("", detail_view, name="detail"), path('/log', EmaLogView.as_view(), name='log'), path('/edit', edit_view, name='edit'), diff --git a/ema/views/ema.py b/ema/views/ema.py index 41684cea..4cd9d7ea 100644 --- a/ema/views/ema.py +++ b/ema/views/ema.py @@ -24,8 +24,8 @@ from konova.forms.modals import RemoveModalForm from konova.settings import DEFAULT_GROUP, ZB_GROUP, ETS_GROUP from konova.sub_settings.context_settings import TAB_TITLE_IDENTIFIER from konova.utils.message_templates import RECORDED_BLOCKS_EDIT, IDENTIFIER_REPLACED, FORM_INVALID, \ - DO_NOT_FORGET_TO_SHARE, GEOMETRY_SIMPLIFIED, GEOMETRIES_IGNORED_TEMPLATE -from konova.views.base import BaseIndexView + DO_NOT_FORGET_TO_SHARE, GEOMETRY_SIMPLIFIED, GEOMETRIES_IGNORED_TEMPLATE, MISSING_GROUP_PERMISSION +from konova.views.base import BaseIndexView, BaseIdentifierGeneratorView class EmaIndexView(LoginRequiredMixin, BaseIndexView): @@ -96,23 +96,15 @@ def new_view(request: HttpRequest): return render(request, template, context) -@login_required -@conservation_office_group_required -def new_id_view(request: HttpRequest): - """ JSON endpoint +class EmaIdentifierGeneratorView(LoginRequiredMixin, BaseIdentifierGeneratorView): + _MODEL_CLS = Ema - Provides fetching of free identifiers for e.g. AJAX calls - - """ - tmp = Ema() - identifier = tmp.generate_new_identifier() - while Ema.objects.filter(identifier=identifier).exists(): - identifier = tmp.generate_new_identifier() - return JsonResponse( - data={ - "gen_data": identifier - } - ) + def dispatch(self, request, *args, **kwargs): + is_ets = request.user.is_ets_user() + if not is_ets: + messages.info(request, MISSING_GROUP_PERMISSION) + return redirect(reverse("ema:index")) + return super().dispatch(request, *args, **kwargs) @login_required diff --git a/konova/views/base.py b/konova/views/base.py index ab862e9b..6a3c78d6 100644 --- a/konova/views/base.py +++ b/konova/views/base.py @@ -5,7 +5,7 @@ Created on: 15.10.25 """ from abc import abstractmethod -from django.http import HttpRequest +from django.http import HttpRequest, JsonResponse from django.shortcuts import render from django.views import View @@ -45,3 +45,25 @@ class BaseIndexView(View): @abstractmethod def _get_queryset(self): raise NotImplementedError + + +class BaseIdentifierGeneratorView(View): + _MODEL_CLS = None + + class Meta: + abstract = True + + def dispatch(self, request, *args, **kwargs): + request = check_user_is_in_any_group(request) + return super().dispatch(request, *args, **kwargs) + + def get(self, request: HttpRequest): + tmp_obj = self._MODEL_CLS() + identifier = tmp_obj.generate_new_identifier() + while self._MODEL_CLS.objects.filter(identifier=identifier).exists(): + identifier = tmp_obj.generate_new_identifier() + return JsonResponse( + data={ + "gen_data": identifier + } + ) \ No newline at end of file