From fdf3adf5ae1b8a78b48eaa6cac1d7b61b0c0de52 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Sun, 14 Dec 2025 16:00:40 +0100 Subject: [PATCH] # Index views * refactors index view methods into classes * introduces AbstractIndexView as base class --- compensation/urls/compensation.py | 6 +- compensation/urls/eco_account.py | 6 +- .../views/compensation/compensation.py | 57 +++++++++--------- compensation/views/eco_account/eco_account.py | 54 ++++++++--------- ema/urls.py | 4 +- ema/views/ema.py | 49 ++++++++------- intervention/urls.py | 5 +- intervention/views/intervention.py | 60 +++++++++---------- konova/views/index.py | 23 +++++++ 9 files changed, 140 insertions(+), 124 deletions(-) create mode 100644 konova/views/index.py diff --git a/compensation/urls/compensation.py b/compensation/urls/compensation.py index 45a11594..c5c664cf 100644 --- a/compensation/urls/compensation.py +++ b/compensation/urls/compensation.py @@ -17,13 +17,13 @@ from compensation.views.compensation.action import NewCompensationActionView, Ed RemoveCompensationActionView from compensation.views.compensation.state import NewCompensationStateView, EditCompensationStateView, \ RemoveCompensationStateView -from compensation.views.compensation.compensation import index_view, new_view, new_id_view, detail_view, edit_view, \ - remove_view +from compensation.views.compensation.compensation import new_view, new_id_view, detail_view, edit_view, \ + remove_view, IndexCompensationView from compensation.views.compensation.log import CompensationLogView urlpatterns = [ # Main compensation - path("", index_view, name="index"), + path("", IndexCompensationView.as_view(), name="index"), path('new/id', new_id_view, name='new-id'), path('new/', new_view, name='new'), path('new', new_view, name='new'), diff --git a/compensation/urls/eco_account.py b/compensation/urls/eco_account.py index beaae8d9..e7fc85b2 100644 --- a/compensation/urls/eco_account.py +++ b/compensation/urls/eco_account.py @@ -8,8 +8,8 @@ Created on: 24.08.21 from django.urls import path from compensation.autocomplete.eco_account import EcoAccountAutocomplete -from compensation.views.eco_account.eco_account import index_view, new_view, new_id_view, edit_view, remove_view, \ - detail_view +from compensation.views.eco_account.eco_account import new_view, new_id_view, edit_view, remove_view, \ + detail_view, IndexEcoAccountView from compensation.views.eco_account.log import EcoAccountLogView from compensation.views.eco_account.record import EcoAccountRecordView from compensation.views.eco_account.report import report_view @@ -28,7 +28,7 @@ from compensation.views.eco_account.deduction import NewEcoAccountDeductionView, app_name = "acc" urlpatterns = [ - path("", index_view, name="index"), + path("", IndexEcoAccountView.as_view(), name="index"), path('new/', new_view, name='new'), path('new/id', new_id_view, name='new-id'), path('', detail_view, name='detail'), diff --git a/compensation/views/compensation/compensation.py b/compensation/views/compensation/compensation.py index 15bac1f8..8cc050cd 100644 --- a/compensation/views/compensation/compensation.py +++ b/compensation/views/compensation/compensation.py @@ -8,8 +8,7 @@ Created on: 19.08.22 from django.contrib import messages from django.contrib.auth.decorators import login_required from django.core.exceptions import ObjectDoesNotExist -from django.db.models import Sum -from django.http import HttpRequest, JsonResponse +from django.http import HttpRequest, JsonResponse, HttpResponse from django.shortcuts import get_object_or_404, render, redirect from django.urls import reverse from django.utils.translation import gettext_lazy as _ @@ -28,38 +27,36 @@ from konova.sub_settings.context_settings import TAB_TITLE_IDENTIFIER from konova.utils.message_templates import COMPENSATION_REMOVED_TEMPLATE, DATA_CHECKED_PREVIOUSLY_TEMPLATE, \ RECORDED_BLOCKS_EDIT, CHECK_STATE_RESET, FORM_INVALID, PARAMS_INVALID, IDENTIFIER_REPLACED, \ COMPENSATION_ADDED_TEMPLATE, DO_NOT_FORGET_TO_SHARE, GEOMETRY_SIMPLIFIED, GEOMETRIES_IGNORED_TEMPLATE +from konova.views.index import AbstractIndexView -@login_required -@any_group_check -def index_view(request: HttpRequest): - """ - Renders the index view for compensation +class IndexCompensationView(AbstractIndexView): + def get(self, request, *args, **kwargs) -> HttpResponse: + """ + Renders the index view for compensation - Args: - request (HttpRequest): The incoming request - - Returns: - A rendered view - """ - template = "generic_index.html" - compensations = Compensation.objects.filter( - deleted=None, # only show those which are not deleted individually - intervention__deleted=None, # and don't show the ones whose intervention has been deleted - ).order_by( - "-modified__timestamp" - ) - table = CompensationTable( - request=request, - queryset=compensations - ) - context = { - "table": table, - TAB_TITLE_IDENTIFIER: _("Compensations - Overview"), - } - context = BaseContext(request, context).context - return render(request, template, context) + Args: + request (HttpRequest): The incoming request + Returns: + A rendered view + """ + compensations = Compensation.objects.filter( + deleted=None, # only show those which are not deleted individually + intervention__deleted=None, # and don't show the ones whose intervention has been deleted + ).order_by( + "-modified__timestamp" + ) + table = CompensationTable( + request=request, + queryset=compensations + ) + context = { + "table": table, + TAB_TITLE_IDENTIFIER: _("Compensations - Overview"), + } + context = BaseContext(request, context).context + return render(request, self._TEMPLATE, context) @login_required @default_group_required diff --git a/compensation/views/eco_account/eco_account.py b/compensation/views/eco_account/eco_account.py index 28dbfc10..7fd7ff2f 100644 --- a/compensation/views/eco_account/eco_account.py +++ b/compensation/views/eco_account/eco_account.py @@ -7,8 +7,7 @@ Created on: 19.08.22 """ from django.contrib import messages from django.contrib.auth.decorators import login_required -from django.db.models import Sum -from django.http import HttpRequest, JsonResponse +from django.http import HttpRequest, JsonResponse, HttpResponse from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse from django.utils.translation import gettext_lazy as _ @@ -24,36 +23,35 @@ from konova.settings import ETS_GROUP, DEFAULT_GROUP, ZB_GROUP from konova.sub_settings.context_settings import TAB_TITLE_IDENTIFIER from konova.utils.message_templates import CANCEL_ACC_RECORDED_OR_DEDUCTED, RECORDED_BLOCKS_EDIT, FORM_INVALID, \ IDENTIFIER_REPLACED, DO_NOT_FORGET_TO_SHARE, GEOMETRY_SIMPLIFIED, GEOMETRIES_IGNORED_TEMPLATE +from konova.views.index import AbstractIndexView -@login_required -@any_group_check -def index_view(request: HttpRequest): - """ - Renders the index view for eco accounts +class IndexEcoAccountView(AbstractIndexView): + def get(self, request: HttpRequest, *args, **kwargs) -> HttpResponse: + """ + Renders the index view for eco accounts - Args: - request (HttpRequest): The incoming request + Args: + request (HttpRequest): The incoming request - Returns: - A rendered view - """ - template = "generic_index.html" - eco_accounts = EcoAccount.objects.filter( - deleted=None, - ).order_by( - "-modified__timestamp" - ) - table = EcoAccountTable( - request=request, - queryset=eco_accounts - ) - context = { - "table": table, - TAB_TITLE_IDENTIFIER: _("Eco-account - Overview"), - } - context = BaseContext(request, context).context - return render(request, template, context) + Returns: + A rendered view + """ + eco_accounts = EcoAccount.objects.filter( + deleted=None, + ).order_by( + "-modified__timestamp" + ) + table = EcoAccountTable( + request=request, + queryset=eco_accounts + ) + context = { + "table": table, + TAB_TITLE_IDENTIFIER: _("Eco-account - Overview"), + } + context = BaseContext(request, context).context + return render(request, self._TEMPLATE, context) @login_required diff --git a/ema/urls.py b/ema/urls.py index bff7c41d..52cac31a 100644 --- a/ema/urls.py +++ b/ema/urls.py @@ -10,7 +10,7 @@ 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 index_view, new_view, new_id_view, detail_view, edit_view, remove_view +from ema.views.ema import new_view, new_id_view, detail_view, edit_view, remove_view, IndexEmaView from ema.views.log import EmaLogView from ema.views.record import EmaRecordView from ema.views.report import report_view @@ -20,7 +20,7 @@ from ema.views.state import NewEmaStateView, EditEmaStateView, RemoveEmaStateVie app_name = "ema" urlpatterns = [ - path("", index_view, name="index"), + path("", IndexEmaView.as_view(), name="index"), path("new/", new_view, name="new"), path("new/id", new_id_view, name="new-id"), path("", detail_view, name="detail"), diff --git a/ema/views/ema.py b/ema/views/ema.py index 5322b5ef..cfcd0f6f 100644 --- a/ema/views/ema.py +++ b/ema/views/ema.py @@ -7,8 +7,7 @@ Created on: 19.08.22 """ from django.contrib import messages from django.contrib.auth.decorators import login_required -from django.db.models import Sum -from django.http import HttpRequest, JsonResponse +from django.http import HttpRequest, JsonResponse, HttpResponse from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse from django.utils.translation import gettext_lazy as _ @@ -25,35 +24,35 @@ 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.index import AbstractIndexView -@login_required -def index_view(request: HttpRequest): - """ Renders the index view for EMAs +class IndexEmaView(AbstractIndexView): + def get(self, request: HttpRequest, *args, **kwargs) -> HttpResponse: + """ Renders the index view for EMAs - Args: - request (HttpRequest): The incoming request + Args: + request (HttpRequest): The incoming request - Returns: + Returns: - """ - template = "generic_index.html" - emas = Ema.objects.filter( - deleted=None, - ).order_by( - "-modified__timestamp" - ) + """ + emas = Ema.objects.filter( + deleted=None, + ).order_by( + "-modified__timestamp" + ) - table = EmaTable( - request, - queryset=emas - ) - context = { - "table": table, - TAB_TITLE_IDENTIFIER: _("EMAs - Overview"), - } - context = BaseContext(request, context).context - return render(request, template, context) + table = EmaTable( + request, + queryset=emas + ) + context = { + "table": table, + TAB_TITLE_IDENTIFIER: _("EMAs - Overview"), + } + context = BaseContext(request, context).context + return render(request, self._TEMPLATE, context) @login_required diff --git a/intervention/urls.py b/intervention/urls.py index 8a148197..27f13fb9 100644 --- a/intervention/urls.py +++ b/intervention/urls.py @@ -14,7 +14,8 @@ from intervention.views.deduction import NewInterventionDeductionView, EditInter RemoveInterventionDeductionView from intervention.views.document import NewInterventionDocumentView, GetInterventionDocumentView, \ RemoveInterventionDocumentView, EditInterventionDocumentView -from intervention.views.intervention import index_view, new_view, new_id_view, detail_view, edit_view, remove_view +from intervention.views.intervention import new_view, new_id_view, detail_view, edit_view, remove_view, \ + IndexInterventionView from intervention.views.log import InterventionLogView from intervention.views.record import InterventionRecordView from intervention.views.report import report_view @@ -25,7 +26,7 @@ from intervention.views.share import InterventionShareFormView, InterventionShar app_name = "intervention" urlpatterns = [ - path("", index_view, name="index"), + path("", IndexInterventionView.as_view(), name="index"), path('new/', new_view, name='new'), path('new/id', new_id_view, name='new-id'), path('', detail_view, name='detail'), diff --git a/intervention/views/intervention.py b/intervention/views/intervention.py index 0d6cc369..4cd2b019 100644 --- a/intervention/views/intervention.py +++ b/intervention/views/intervention.py @@ -7,7 +7,7 @@ Created on: 19.08.22 """ from django.contrib import messages from django.contrib.auth.decorators import login_required -from django.http import JsonResponse, HttpRequest +from django.http import JsonResponse, HttpRequest, HttpResponse from django.shortcuts import get_object_or_404, render, redirect from django.urls import reverse from django.utils.translation import gettext_lazy as _ @@ -25,40 +25,38 @@ from konova.sub_settings.context_settings import TAB_TITLE_IDENTIFIER from konova.utils.message_templates import DATA_CHECKED_PREVIOUSLY_TEMPLATE, RECORDED_BLOCKS_EDIT, \ CHECK_STATE_RESET, FORM_INVALID, IDENTIFIER_REPLACED, DO_NOT_FORGET_TO_SHARE, GEOMETRY_SIMPLIFIED, \ GEOMETRIES_IGNORED_TEMPLATE +from konova.views.index import AbstractIndexView -@login_required -@any_group_check -def index_view(request: HttpRequest): - """ - Renders the index view for Interventions +class IndexInterventionView(AbstractIndexView): + def get(self, request: HttpRequest, *args, **kwargs) -> HttpResponse: + """ + Renders the index view for Interventions - Args: - request (HttpRequest): The incoming request + Args: + request (HttpRequest): The incoming request - Returns: - A rendered view - """ - template = "generic_index.html" - - # Filtering by user access is performed in table filter inside InterventionTableFilter class - interventions = Intervention.objects.filter( - deleted=None, # not deleted - ).select_related( - "legal" - ).order_by( - "-modified__timestamp" - ) - table = InterventionTable( - request=request, - queryset=interventions - ) - context = { - "table": table, - TAB_TITLE_IDENTIFIER: _("Interventions - Overview"), - } - context = BaseContext(request, context).context - return render(request, template, context) + Returns: + A rendered view + """ + # Filtering by user access is performed in table filter inside InterventionTableFilter class + interventions = Intervention.objects.filter( + deleted=None, # not deleted + ).select_related( + "legal" + ).order_by( + "-modified__timestamp" + ) + table = InterventionTable( + request=request, + queryset=interventions + ) + context = { + "table": table, + TAB_TITLE_IDENTIFIER: _("Interventions - Overview"), + } + context = BaseContext(request, context).context + return render(request, self._TEMPLATE, context) @login_required diff --git a/konova/views/index.py b/konova/views/index.py new file mode 100644 index 00000000..cafaeff9 --- /dev/null +++ b/konova/views/index.py @@ -0,0 +1,23 @@ +""" +Author: Michel Peltriaux +Created on: 14.12.25 + +""" +from django.contrib.auth.decorators import login_required +from django.contrib.auth.mixins import LoginRequiredMixin +from django.utils.decorators import method_decorator +from django.views import View + +from konova.decorators import any_group_check + + +class AbstractIndexView(LoginRequiredMixin, View): + _TEMPLATE = "generic_index.html" + + class Meta: + abstract = True + + @method_decorator(login_required) + @method_decorator(any_group_check) + def dispatch(self, request, *args, **kwargs): + return super().dispatch(request, *args, **kwargs)