diff --git a/compensation/urls/compensation.py b/compensation/urls/compensation.py index b9eaf84f..d7f0df8a 100644 --- a/compensation/urls/compensation.py +++ b/compensation/urls/compensation.py @@ -19,19 +19,19 @@ from compensation.views.compensation.action import NewCompensationActionView, Ed RemoveCompensationActionView from compensation.views.compensation.state import NewCompensationStateView, EditCompensationStateView, \ RemoveCompensationStateView -from compensation.views.compensation.compensation import new_view, edit_view, \ - IndexCompensationView, CompensationIdentifierGeneratorView +from compensation.views.compensation.compensation import IndexCompensationView, CompensationIdentifierGeneratorView, \ + EditCompensationView, NewCompensationView from compensation.views.compensation.log import CompensationLogView urlpatterns = [ # Main compensation path("", IndexCompensationView.as_view(), name="index"), path('new/id', CompensationIdentifierGeneratorView.as_view(), name='new-id'), - path('new/', new_view, name='new'), - path('new', new_view, name='new'), + path('new/', NewCompensationView.as_view(), name='new'), + path('new', NewCompensationView.as_view(), name='new'), path('', DetailCompensationView.as_view(), name='detail'), path('/log', CompensationLogView.as_view(), name='log'), - path('/edit', edit_view, name='edit'), + path('/edit', EditCompensationView.as_view(), name='edit'), path('/remove', RemoveCompensationView.as_view(), name='remove'), path('/state/new', NewCompensationStateView.as_view(), name='new-state'), diff --git a/compensation/views/compensation/compensation.py b/compensation/views/compensation/compensation.py index 3f2990ba..147ea038 100644 --- a/compensation/views/compensation/compensation.py +++ b/compensation/views/compensation/compensation.py @@ -6,11 +6,12 @@ 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.contrib.auth.mixins import LoginRequiredMixin from django.http import HttpRequest, HttpResponse from django.shortcuts import get_object_or_404, render, redirect +from django.utils.decorators import method_decorator from django.utils.translation import gettext_lazy as _ +from django.views import View from compensation.forms.compensation import EditCompensationForm, NewCompensationForm from compensation.models import Compensation @@ -54,36 +55,78 @@ class IndexCompensationView(AbstractIndexView): context = BaseContext(request, context).context return render(request, self._TEMPLATE, context) -@login_required -@default_group_required -@shared_access_required(Intervention, "intervention_id") -def new_view(request: HttpRequest, intervention_id: str = None): - """ - Renders a view for a new compensation creation - Args: - request (HttpRequest): The incoming request +class NewCompensationView(LoginRequiredMixin, View): + _TEMPLATE = "compensation/form/view.html" - Returns: + @method_decorator(default_group_required) + @method_decorator(shared_access_required(Intervention, "intervention_id")) + def get(self, request: HttpRequest, intervention_id: str = None, *args, **kwargs) -> HttpResponse: + """ + Renders a view for new compensation - """ - template = "compensation/form/view.html" - if intervention_id is not None: - try: - intervention = Intervention.objects.get(id=intervention_id) - except ObjectDoesNotExist: - messages.error(request, PARAMS_INVALID) - return redirect("home") - if intervention.is_recorded: - messages.info( - request, - RECORDED_BLOCKS_EDIT - ) - return redirect("intervention:detail", id=intervention_id) + A compensation creation may be called directly from the parent-intervention object. If so - we may take + the intervention's id and directly link the compensation to it. + + Args: + request (HttpRequest): The incoming request + intervention_id (str): The intervention identifier + + Returns: + + """ + if intervention_id: + # If the parent-intervention is recorded, we are not allowed to change anything on it's data. + # Not even adding new child elements like compensations! + intervention = get_object_or_404(Intervention, id=intervention_id) + recording_state_blocks_actions = intervention.is_recorded + if recording_state_blocks_actions: + messages.info( + request, + RECORDED_BLOCKS_EDIT + ) + return redirect("intervention:detail", id=intervention_id) + + data_form = NewCompensationForm(request.POST or None, intervention_id=intervention_id) + geom_form = SimpleGeomForm(request.POST or None, read_only=False) + + context = { + "form": data_form, + "geom_form": geom_form, + TAB_TITLE_IDENTIFIER: _("New compensation"), + } + context = BaseContext(request, context).context + + return render(request, self._TEMPLATE, context) + + @method_decorator(default_group_required) + @method_decorator(shared_access_required(Intervention, "intervention_id")) + def post(self, request: HttpRequest, intervention_id: str = None, *args, **kwargs) -> HttpResponse: + + """ + Renders a view for a new compensation creation + + Args: + request (HttpRequest): The incoming request + + Returns: + + """ + if intervention_id: + # If the parent-intervention is recorded, we are not allowed to change anything on it's data. + # Not even adding new child elements like compensations! + intervention = get_object_or_404(Intervention, id=intervention_id) + recording_state_blocks_actions = intervention.is_recorded + if recording_state_blocks_actions: + messages.info( + request, + RECORDED_BLOCKS_EDIT + ) + return redirect("intervention:detail", id=intervention_id) + + data_form = NewCompensationForm(request.POST or None, intervention_id=intervention_id) + geom_form = SimpleGeomForm(request.POST or None, read_only=False) - data_form = NewCompensationForm(request.POST or None, intervention_id=intervention_id) - geom_form = SimpleGeomForm(request.POST or None, read_only=False) - if request.method == "POST": if data_form.is_valid() and geom_form.is_valid(): generated_identifier = data_form.cleaned_data.get("identifier", None) comp = data_form.save(request.user, geom_form) @@ -101,65 +144,97 @@ def new_view(request: HttpRequest, intervention_id: str = None): request, GEOMETRY_SIMPLIFIED ) - num_ignored_geometries = geom_form.get_num_geometries_ignored() if num_ignored_geometries > 0: messages.info( request, GEOMETRIES_IGNORED_TEMPLATE.format(num_ignored_geometries) ) - return redirect("compensation:detail", id=comp.id) else: - messages.error(request, FORM_INVALID, extra_tags="danger",) - else: - # For clarification: nothing in this case - pass - context = { - "form": data_form, - "geom_form": geom_form, - TAB_TITLE_IDENTIFIER: _("New compensation"), - } - context = BaseContext(request, context).context - return render(request, template, context) + messages.error(request, FORM_INVALID, extra_tags="danger", ) + + context = { + "form": data_form, + "geom_form": geom_form, + TAB_TITLE_IDENTIFIER: _("New compensation"), + } + context = BaseContext(request, context).context + + return render(request, self._TEMPLATE, context) class CompensationIdentifierGeneratorView(AbstractIdentifierGeneratorView): _MODEL = Compensation -@login_required -@default_group_required -@shared_access_required(Compensation, "id") -def edit_view(request: HttpRequest, id: str): - """ - Renders a view for editing compensations +class EditCompensationView(LoginRequiredMixin, View): + _TEMPLATE = "compensation/form/view.html" - Args: - request (HttpRequest): The incoming request + @method_decorator(default_group_required) + @method_decorator(shared_access_required(Compensation, "id")) + def get(self, request: HttpRequest, id: str, *args, **kwargs) -> HttpResponse: - Returns: + """ + Renders a view for editing compensations - """ - template = "compensation/form/view.html" - # Get object from db - comp = get_object_or_404(Compensation, id=id) - if comp.is_recorded: - messages.info( - request, - RECORDED_BLOCKS_EDIT - ) - return redirect("compensation:detail", id=id) + Args: + request (HttpRequest): The incoming request - # Create forms, initialize with values from db/from POST request - data_form = EditCompensationForm(request.POST or None, instance=comp) - geom_form = SimpleGeomForm(request.POST or None, read_only=False, instance=comp) - if request.method == "POST": + Returns: + + """ + # Get object from db + comp = get_object_or_404(Compensation, id=id) + if comp.is_recorded: + messages.info( + request, + RECORDED_BLOCKS_EDIT + ) + return redirect("compensation:detail", id=id) + + # Create forms, initialize with values from db/from POST request + data_form = EditCompensationForm(request.POST or None, instance=comp) + geom_form = SimpleGeomForm(request.POST or None, read_only=False, instance=comp) + + context = { + "form": data_form, + "geom_form": geom_form, + TAB_TITLE_IDENTIFIER: _("Edit {}").format(comp.identifier), + } + context = BaseContext(request, context).context + + return render(request, self._TEMPLATE, context) + + @method_decorator(default_group_required) + @method_decorator(shared_access_required(Compensation, "id")) + def post(self, request: HttpRequest, id: str, *args, **kwargs) -> HttpResponse: + + """ + Renders a view for editing compensations + + Args: + request (HttpRequest): The incoming request + + Returns: + + """ + # Get object from db + comp = get_object_or_404(Compensation, id=id) + if comp.is_recorded: + messages.info( + request, + RECORDED_BLOCKS_EDIT + ) + return redirect("compensation:detail", id=id) + + # Create forms, initialize with values from db/from POST request + data_form = EditCompensationForm(request.POST or None, instance=comp) + geom_form = SimpleGeomForm(request.POST or None, read_only=False, instance=comp) if data_form.is_valid() and geom_form.is_valid(): # Preserve state of intervention checked to determine whether the user must be informed or not # about a change of the check state intervention_is_checked = comp.intervention.checked is not None - # The data form takes the geom form for processing, as well as the performing user comp = data_form.save(request.user, geom_form) if intervention_is_checked: @@ -170,24 +245,21 @@ def edit_view(request: HttpRequest, id: str): request, GEOMETRY_SIMPLIFIED ) - num_ignored_geometries = geom_form.get_num_geometries_ignored() if num_ignored_geometries > 0: messages.info( request, GEOMETRIES_IGNORED_TEMPLATE.format(num_ignored_geometries) ) - return redirect("compensation:detail", id=comp.id) else: - messages.error(request, FORM_INVALID, extra_tags="danger",) - else: - # For clarification: nothing in this case - pass - context = { - "form": data_form, - "geom_form": geom_form, - TAB_TITLE_IDENTIFIER: _("Edit {}").format(comp.identifier), - } - context = BaseContext(request, context).context - return render(request, template, context) + messages.error(request, FORM_INVALID, extra_tags="danger", ) + + context = { + "form": data_form, + "geom_form": geom_form, + TAB_TITLE_IDENTIFIER: _("Edit {}").format(comp.identifier), + } + context = BaseContext(request, context).context + + return render(request, self._TEMPLATE, context) \ No newline at end of file