From ac0db79928f2349b7c28a4314af17fcddd1d53ba Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Fri, 19 Aug 2022 07:34:09 +0200 Subject: [PATCH] Intervention views * splits intervention/views.py (+700 lines) into separate files in new module * view files can now be found in /intervention/views/... --- intervention/urls.py | 19 +- intervention/views.py | 756 ----------------------------- intervention/views/__init__.py | 7 + intervention/views/check.py | 39 ++ intervention/views/compensation.py | 45 ++ intervention/views/deduction.py | 97 ++++ intervention/views/document.py | 112 +++++ intervention/views/intervention.py | 251 ++++++++++ intervention/views/log.py | 41 ++ intervention/views/record.py | 39 ++ intervention/views/report.py | 73 +++ intervention/views/resubmission.py | 39 ++ intervention/views/revocation.py | 117 +++++ intervention/views/share.py | 78 +++ 14 files changed, 951 insertions(+), 762 deletions(-) delete mode 100644 intervention/views.py create mode 100644 intervention/views/__init__.py create mode 100644 intervention/views/check.py create mode 100644 intervention/views/compensation.py create mode 100644 intervention/views/deduction.py create mode 100644 intervention/views/document.py create mode 100644 intervention/views/intervention.py create mode 100644 intervention/views/log.py create mode 100644 intervention/views/record.py create mode 100644 intervention/views/report.py create mode 100644 intervention/views/resubmission.py create mode 100644 intervention/views/revocation.py create mode 100644 intervention/views/share.py diff --git a/intervention/urls.py b/intervention/urls.py index b3cc7038..2d0dfdb5 100644 --- a/intervention/urls.py +++ b/intervention/urls.py @@ -8,11 +8,18 @@ Created on: 30.11.20 from django.urls import path from intervention.autocomplete.intervention import InterventionAutocomplete -from intervention.views import index_view, new_view, detail_view, edit_view, remove_view, new_document_view, share_view, \ - create_share_view, remove_revocation_view, new_revocation_view, check_view, log_view, new_deduction_view, \ - record_view, remove_document_view, get_document_view, get_revocation_view, new_id_view, report_view, \ - remove_deduction_view, remove_compensation_view, edit_deduction_view, edit_revocation_view, edit_document_view, \ - create_resubmission_view +from intervention.views.check import check_view +from intervention.views.compensation import remove_compensation_view +from intervention.views.deduction import new_deduction_view, edit_deduction_view, remove_deduction_view +from intervention.views.document import new_document_view, get_document_view, remove_document_view, edit_document_view +from intervention.views.intervention import index_view, new_view, new_id_view, detail_view, edit_view, remove_view +from intervention.views.log import log_view +from intervention.views.record import record_view +from intervention.views.report import report_view +from intervention.views.resubmission import create_resubmission_view +from intervention.views.revocation import new_revocation_view, edit_revocation_view, remove_revocation_view, \ + get_revocation_view +from intervention.views.share import share_view, create_share_view app_name = "intervention" urlpatterns = [ @@ -52,4 +59,4 @@ urlpatterns = [ # Autocomplete path("atcmplt/interventions", InterventionAutocomplete.as_view(), name="autocomplete"), -] \ No newline at end of file +] diff --git a/intervention/views.py b/intervention/views.py deleted file mode 100644 index e622488f..00000000 --- a/intervention/views.py +++ /dev/null @@ -1,756 +0,0 @@ -from django.contrib.auth.decorators import login_required -from django.core.exceptions import ObjectDoesNotExist -from django.utils.translation import gettext_lazy as _ -from django.http import HttpRequest, JsonResponse, Http404 -from django.shortcuts import render - -from intervention.forms.intervention import NewInterventionForm, EditInterventionForm -from intervention.forms.modals.check import CheckModalForm -from intervention.forms.modals.deduction import NewEcoAccountDeductionModalForm, RemoveEcoAccountDeductionModalForm, \ - EditEcoAccountDeductionModalForm -from intervention.forms.modals.document import NewInterventionDocumentModalForm -from intervention.forms.modals.revocation import EditRevocationModalForm, RemoveRevocationModalForm, \ - NewRevocationModalForm -from intervention.forms.modals.share import ShareModalForm -from intervention.models import Intervention, Revocation, InterventionDocument, RevocationDocument -from intervention.tables import InterventionTable -from konova.contexts import BaseContext -from konova.decorators import * -from konova.forms import SimpleGeomForm -from konova.forms.modals import RemoveModalForm, RecordModalForm, EditDocumentModalForm, ResubmissionModalForm -from konova.sub_settings.context_settings import TAB_TITLE_IDENTIFIER -from konova.utils.documents import remove_document, get_document -from konova.utils.generators import generate_qr_code -from konova.utils.message_templates import INTERVENTION_INVALID, FORM_INVALID, IDENTIFIER_REPLACED, \ - CHECKED_RECORDED_RESET, DEDUCTION_REMOVED, DEDUCTION_ADDED, REVOCATION_ADDED, REVOCATION_REMOVED, \ - COMPENSATION_REMOVED_TEMPLATE, DOCUMENT_ADDED, DEDUCTION_EDITED, REVOCATION_EDITED, DOCUMENT_EDITED, \ - RECORDED_BLOCKS_EDIT, DATA_CHECKED_PREVIOUSLY_TEMPLATE -from konova.utils.user_checks import in_group - - -@login_required -@any_group_check -def index_view(request: HttpRequest): - """ - Renders the index view for Interventions - - Args: - request (HttpRequest): The incoming request - - Returns: - A rendered view - """ - template = "generic_index.html" - - # Filtering by user access is performed in table filter inside of InterventionTableFilter class - interventions = Intervention.objects.filter( - deleted=None, # not deleted - ).select_related( - "legal" - ) - table = InterventionTable( - request=request, - queryset=interventions - ) - context = { - "table": table, - TAB_TITLE_IDENTIFIER: _("Interventions - Overview"), - } - context = BaseContext(request, context).context - return render(request, template, context) - - -@login_required -@default_group_required -def new_view(request: HttpRequest): - """ - Renders a view for a new intervention creation - - Args: - request (HttpRequest): The incoming request - - Returns: - - """ - template = "intervention/form/view.html" - data_form = NewInterventionForm(request.POST or None) - 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) - intervention = data_form.save(request.user, geom_form) - if generated_identifier != intervention.identifier: - messages.info( - request, - IDENTIFIER_REPLACED.format( - generated_identifier, - intervention.identifier - ) - ) - messages.success(request, _("Intervention {} added").format(intervention.identifier)) - return redirect("intervention:detail", id=intervention.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 intervention"), - } - context = BaseContext(request, context).context - return render(request, template, context) - - -@login_required -@default_group_required -def new_id_view(request: HttpRequest): - """ JSON endpoint - - Provides fetching of free identifiers for e.g. AJAX calls - - """ - tmp_intervention = Intervention() - identifier = tmp_intervention.generate_new_identifier() - while Intervention.objects.filter(identifier=identifier).exists(): - identifier = tmp_intervention.generate_new_identifier() - return JsonResponse( - data={ - "gen_data": identifier - } - ) - - -@login_required -@default_group_required -@shared_access_required(Intervention, "id") -def new_document_view(request: HttpRequest, id: str): - """ Renders a form for uploading new documents - - Args: - request (HttpRequest): The incoming request - id (str): The intervention's id to which the new document will be related - Returns: - - """ - intervention = get_object_or_404(Intervention, id=id) - form = NewInterventionDocumentModalForm(request.POST or None, request.FILES or None, instance=intervention, request=request) - return form.process_request( - request, - msg_success=DOCUMENT_ADDED, - redirect_url=reverse("intervention:detail", args=(id,)) + "#related_data" - ) - - -@login_required -@default_group_required -def get_revocation_view(request: HttpRequest, doc_id: str): - """ Returns the revocation document as downloadable file - - Wraps the generic document fetcher function from konova.utils. - - Args: - request (HttpRequest): The incoming request - doc_id (str): The document id - - Returns: - - """ - doc = get_object_or_404(RevocationDocument, id=doc_id) - # File download only possible if related instance is shared with user - if not doc.instance.legal.intervention.users.filter(id=request.user.id): - messages.info( - request, - DATA_UNSHARED - ) - return redirect("intervention:detail", id=doc.instance.id) - return get_document(doc) - -@login_required -@default_group_required -@shared_access_required(Intervention, "id") -def get_document_view(request: HttpRequest, id: str, doc_id: str): - """ Returns the document as downloadable file - - Wraps the generic document fetcher function from konova.utils. - - Args: - request (HttpRequest): The incoming request - id (str): The intervention id - doc_id (str): The document id - - Returns: - - """ - intervention = get_object_or_404(Intervention, id=id) - doc = get_object_or_404(InterventionDocument, id=doc_id) - return get_document(doc) - - -@login_required -@default_group_required -@shared_access_required(Intervention, "id") -def remove_document_view(request: HttpRequest, id: str, doc_id: str): - """ Removes the document from the database and file system - - Wraps the generic functionality from konova.utils. - - Args: - request (HttpRequest): The incoming request - id (str): The intervention id - doc_id (str): The document id - - Returns: - - """ - intervention = get_object_or_404(Intervention, id=id) - doc = get_object_or_404(InterventionDocument, id=doc_id) - return remove_document( - request, - doc - ) - - -@login_required -@default_group_required -@shared_access_required(Intervention, "id") -def edit_document_view(request: HttpRequest, id: str, doc_id: str): - """ Removes the document from the database and file system - - Wraps the generic functionality from konova.utils. - - Args: - request (HttpRequest): The incoming request - id (str): The intervention id - doc_id (str): The document id - - Returns: - - """ - intervention = get_object_or_404(Intervention, id=id) - doc = get_object_or_404(InterventionDocument, id=doc_id) - form = EditDocumentModalForm(request.POST or None, request.FILES or None, instance=intervention, document=doc, request=request) - return form.process_request( - request, - DOCUMENT_EDITED, - redirect_url=reverse("intervention:detail", args=(intervention.id,)) + "#related_data" - ) - - -@login_required -@any_group_check -def detail_view(request: HttpRequest, id: str): - """ Renders a detail view for viewing an intervention's data - - Args: - request (HttpRequest): The incoming request - id (str): The intervention's id - - Returns: - - """ - template = "intervention/detail/view.html" - - # Fetch data, filter out deleted related data - intervention = get_object_or_404( - Intervention.objects.select_related( - "geometry", - "legal", - "responsible", - ), - id=id - ) - compensations = intervention.compensations.filter( - deleted=None, - ) - _user = request.user - is_data_shared = intervention.is_shared_with(user=_user) - - geom_form = SimpleGeomForm( - instance=intervention, - ) - last_checked = intervention.get_last_checked_action() - last_checked_tooltip = "" - if last_checked: - last_checked_tooltip = DATA_CHECKED_PREVIOUSLY_TEMPLATE.format(last_checked.get_timestamp_str_formatted(), last_checked.user) - - context = { - "obj": intervention, - "last_checked": last_checked, - "last_checked_tooltip": last_checked_tooltip, - "compensations": compensations, - "has_access": is_data_shared, - "geom_form": geom_form, - "is_default_member": in_group(_user, DEFAULT_GROUP), - "is_zb_member": in_group(_user, ZB_GROUP), - "is_ets_member": in_group(_user, ETS_GROUP), - "LANIS_LINK": intervention.get_LANIS_link(), - TAB_TITLE_IDENTIFIER: f"{intervention.identifier} - {intervention.title}", - } - - request = intervention.set_status_messages(request) - - context = BaseContext(request, context).context - return render(request, template, context) - - -@login_required -@default_group_required -@shared_access_required(Intervention, "id") -def edit_view(request: HttpRequest, id: str): - """ - Renders a view for editing interventions - - Args: - request (HttpRequest): The incoming request - - Returns: - - """ - template = "intervention/form/view.html" - # Get object from db - intervention = get_object_or_404(Intervention, id=id) - if intervention.is_recorded: - messages.info( - request, - RECORDED_BLOCKS_EDIT - ) - return redirect("intervention:detail", id=id) - - # Create forms, initialize with values from db/from POST request - data_form = EditInterventionForm(request.POST or None, instance=intervention) - geom_form = SimpleGeomForm(request.POST or None, read_only=False, instance=intervention) - if request.method == "POST": - if data_form.is_valid() and geom_form.is_valid(): - # The data form takes the geom form for processing, as well as the performing user - # Save the current state of recorded|checked to inform the user in case of a status reset due to editing - i_rec = intervention.recorded is not None - i_check = intervention.checked is not None - intervention = data_form.save(request.user, geom_form) - messages.success(request, _("Intervention {} edited").format(intervention.identifier)) - if i_check or i_rec: - messages.info(request, CHECKED_RECORDED_RESET) - return redirect("intervention:detail", id=intervention.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(intervention.identifier), - } - context = BaseContext(request, context).context - return render(request, template, context) - - -@login_required -@default_group_required -@shared_access_required(Intervention, "id") -def remove_view(request: HttpRequest, id: str): - """ Renders a remove view for this intervention - - Args: - request (HttpRequest): The incoming request - id (str): The uuid id as string - - Returns: - - """ - obj = Intervention.objects.get(id=id) - identifier = obj.identifier - form = RemoveModalForm(request.POST or None, instance=obj, request=request) - return form.process_request( - request, - _("{} removed").format(identifier), - redirect_url=reverse("intervention:index") - ) - - -@login_required -@default_group_required -@shared_access_required(Intervention, "id") -def edit_revocation_view(request: HttpRequest, id: str, revocation_id: str): - """ Renders a edit view for a revocation - - Args: - request (HttpRequest): The incoming request - id (str): The intervention's id as string - revocation_id (str): The revocation's id as string - - Returns: - - """ - intervention = get_object_or_404(Intervention, id=id) - revocation = get_object_or_404(Revocation, id=revocation_id) - - form = EditRevocationModalForm(request.POST or None, request.FILES or None, instance=intervention, revocation=revocation, request=request) - return form.process_request( - request, - REVOCATION_EDITED, - redirect_url=reverse("intervention:detail", args=(intervention.id,)) + "#related_data" - ) - - -@login_required -@default_group_required -@shared_access_required(Intervention, "id") -def remove_revocation_view(request: HttpRequest, id: str, revocation_id: str): - """ Renders a remove view for a revocation - - Args: - request (HttpRequest): The incoming request - id (str): The intervention's id as string - revocation_id (str): The revocation's id as string - - Returns: - - """ - intervention = get_object_or_404(Intervention, id=id) - revocation = get_object_or_404(Revocation, id=revocation_id) - - form = RemoveRevocationModalForm(request.POST or None, instance=intervention, revocation=revocation, request=request) - return form.process_request( - request, - REVOCATION_REMOVED, - redirect_url=reverse("intervention:detail", args=(intervention.id,)) + "#related_data" - ) - - -@login_required -def share_view(request: HttpRequest, id: str, token: str): - """ Performs sharing of an intervention - - If token given in url is not valid, the user will be redirected to the dashboard - - Args: - request (HttpRequest): The incoming request - id (str): Intervention's id - token (str): Access token for intervention - - Returns: - - """ - user = request.user - intervention = get_object_or_404(Intervention, id=id) - # Check tokens - if intervention.access_token == token: - # Send different messages in case user has already been added to list of sharing users - if intervention.is_shared_with(user): - messages.info( - request, - _("{} has already been shared with you").format(intervention.identifier) - ) - else: - messages.success( - request, - _("{} has been shared with you").format(intervention.identifier) - ) - intervention.share_with_user(user) - return redirect("intervention:detail", id=id) - else: - messages.error( - request, - _("Share link invalid"), - extra_tags="danger", - ) - return redirect("home") - - -@login_required -@default_group_required -@shared_access_required(Intervention, "id") -def create_share_view(request: HttpRequest, id: str): - """ Renders sharing form for an intervention - - Args: - request (HttpRequest): The incoming request - id (str): Intervention's id - - Returns: - - """ - intervention = get_object_or_404(Intervention, id=id) - form = ShareModalForm(request.POST or None, instance=intervention, request=request) - return form.process_request( - request, - msg_success=_("Share settings updated") - ) - - -@login_required -@default_group_required -@shared_access_required(Intervention, "id") -def create_resubmission_view(request: HttpRequest, id: str): - """ Renders resubmission form for an intervention - - Args: - request (HttpRequest): The incoming request - id (str): Intervention's id - - Returns: - - """ - intervention = get_object_or_404(Intervention, id=id) - form = ResubmissionModalForm(request.POST or None, instance=intervention, request=request) - form.action_url = reverse("intervention:resubmission-create", args=(id,)) - return form.process_request( - request, - msg_success=_("Resubmission set"), - redirect_url=reverse("intervention:detail", args=(id,)) - ) - - -@login_required -@registration_office_group_required -@shared_access_required(Intervention, "id") -def check_view(request: HttpRequest, id: str): - """ Renders check form for an intervention - - Args: - request (HttpRequest): The incoming request - id (str): Intervention's id - - Returns: - - """ - intervention = get_object_or_404(Intervention, id=id) - form = CheckModalForm(request.POST or None, instance=intervention, request=request) - return form.process_request( - request, - msg_success=_("Check performed"), - msg_error=INTERVENTION_INVALID - ) - - -@login_required -@default_group_required -@shared_access_required(Intervention, "id") -def new_revocation_view(request: HttpRequest, id: str): - """ Renders sharing form for an intervention - - Args: - request (HttpRequest): The incoming request - id (str): Intervention's id - - Returns: - - """ - intervention = get_object_or_404(Intervention, id=id) - form = NewRevocationModalForm(request.POST or None, request.FILES or None, instance=intervention, request=request) - return form.process_request( - request, - msg_success=REVOCATION_ADDED, - redirect_url=reverse("intervention:detail", args=(id,)) + "#related_data" - ) - - -@login_required -@default_group_required -@shared_access_required(Intervention, "id") -def log_view(request: HttpRequest, id: str): - """ Renders a log view using modal - - Args: - request (HttpRequest): The incoming request - id (str): The compensation's id - - Returns: - - """ - intervention = get_object_or_404(Intervention, id=id) - template = "modal/modal_generic.html" - body_template = "log.html" - - context = { - "modal_body_template": body_template, - "log": intervention.log.all(), - "modal_title": _("Log"), - } - context = BaseContext(request, context).context - return render(request, template, context) - - -@login_required -@default_group_required -@shared_access_required(Intervention, "id") -def new_deduction_view(request: HttpRequest, id: str): - """ Renders a modal form view for creating deductions - - Args: - request (HttpRequest): The incoming request - id (str): The intervention's id which shall benefit from this deduction - - Returns: - - """ - intervention = get_object_or_404(Intervention, id=id) - form = NewEcoAccountDeductionModalForm(request.POST or None, instance=intervention, request=request) - return form.process_request( - request, - msg_success=DEDUCTION_ADDED, - redirect_url=reverse("intervention:detail", args=(id,)) + "#related_data", - ) - - -@login_required -@default_group_required -@shared_access_required(Intervention, "id") -def remove_deduction_view(request: HttpRequest, id: str, deduction_id: str): - """ Renders a modal view for removing deductions - - Args: - request (HttpRequest): The incoming request - id (str): The intervention's id - deduction_id (str): The deduction's id - - Returns: - - """ - intervention = get_object_or_404(Intervention, id=id) - try: - eco_deduction = intervention.deductions.get(id=deduction_id) - except ObjectDoesNotExist: - raise Http404("Unknown deduction") - - form = RemoveEcoAccountDeductionModalForm(request.POST or None, instance=intervention, deduction=eco_deduction, request=request) - return form.process_request( - request=request, - msg_success=DEDUCTION_REMOVED, - redirect_url=reverse("intervention:detail", args=(id,)) + "#related_data" - ) - - -@login_required -@default_group_required -@shared_access_required(Intervention, "id") -def edit_deduction_view(request: HttpRequest, id: str, deduction_id: str): - """ Renders a modal view for removing deductions - - Args: - request (HttpRequest): The incoming request - id (str): The intervention's id - deduction_id (str): The deduction's id - - Returns: - - """ - intervention = get_object_or_404(Intervention, id=id) - try: - eco_deduction = intervention.deductions.get(id=deduction_id) - except ObjectDoesNotExist: - raise Http404("Unknown deduction") - - form = EditEcoAccountDeductionModalForm(request.POST or None, instance=intervention, deduction=eco_deduction, request=request) - return form.process_request( - request=request, - msg_success=DEDUCTION_EDITED, - redirect_url=reverse("intervention:detail", args=(id,)) + "#related_data" - ) - - -@login_required -@conservation_office_group_required -@shared_access_required(Intervention, "id") -def record_view(request: HttpRequest, id: str): - """ Renders a modal form for recording an intervention - - Args: - request (HttpRequest): The incoming request - id (str): The intervention's id - - Returns: - - """ - intervention = get_object_or_404(Intervention, id=id) - form = RecordModalForm(request.POST or None, instance=intervention, request=request) - msg_succ = _("{} unrecorded") if intervention.recorded else _("{} recorded") - msg_succ = msg_succ.format(intervention.identifier) - return form.process_request( - request, - msg_succ, - msg_error=_("There are errors on this intervention:") - ) - - -def remove_compensation_view(request:HttpRequest, id: str, comp_id: str): - """ Renders a modal view for removing the compensation - - Args: - request (HttpRequest): The incoming request - id (str): The compensation's id - - Returns: - - """ - intervention = get_object_or_404(Intervention, id=id) - try: - comp = intervention.compensations.get( - id=comp_id - ) - except ObjectDoesNotExist: - raise Http404("Unknown compensation") - form = RemoveModalForm(request.POST or None, instance=comp, request=request) - return form.process_request( - request=request, - msg_success=COMPENSATION_REMOVED_TEMPLATE.format(comp.identifier), - redirect_url=reverse("intervention:detail", args=(id,)) + "#related_data", - ) - - -def report_view(request:HttpRequest, id: str): - """ Renders the public report view - - Args: - request (HttpRequest): The incoming request - id (str): The id of the intervention - - Returns: - - """ - template = "intervention/report/report.html" - intervention = get_object_or_404(Intervention, id=id) - - tab_title = _("Report {}").format(intervention.identifier) - # If intervention is not recorded (yet or currently) we need to render another template without any data - if not intervention.is_ready_for_publish(): - template = "report/unavailable.html" - context = { - TAB_TITLE_IDENTIFIER: tab_title, - } - context = BaseContext(request, context).context - return render(request, template, context) - - # Prepare data for map viewer - geom_form = SimpleGeomForm( - instance=intervention - ) - parcels = intervention.get_underlying_parcels() - - distinct_deductions = intervention.deductions.all().distinct( - "account" - ) - qrcode_url = request.build_absolute_uri(reverse("intervention:report", args=(id,))) - qrcode_img = generate_qr_code(qrcode_url, 10) - qrcode_lanis_url = intervention.get_LANIS_link() - qrcode_img_lanis = generate_qr_code(qrcode_lanis_url, 7) - - context = { - "obj": intervention, - "deductions": distinct_deductions, - "qrcode": { - "img": qrcode_img, - "url": qrcode_url, - }, - "qrcode_lanis": { - "img": qrcode_img_lanis, - "url": qrcode_lanis_url, - }, - "geom_form": geom_form, - "parcels": parcels, - TAB_TITLE_IDENTIFIER: tab_title, - } - context = BaseContext(request, context).context - return render(request, template, context) diff --git a/intervention/views/__init__.py b/intervention/views/__init__.py new file mode 100644 index 00000000..3a996e1f --- /dev/null +++ b/intervention/views/__init__.py @@ -0,0 +1,7 @@ +""" +Author: Michel Peltriaux +Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany +Contact: ksp-servicestelle@sgdnord.rlp.de +Created on: 19.08.22 + +""" diff --git a/intervention/views/check.py b/intervention/views/check.py new file mode 100644 index 00000000..1fae75bb --- /dev/null +++ b/intervention/views/check.py @@ -0,0 +1,39 @@ +""" +Author: Michel Peltriaux +Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany +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.utils.translation import gettext_lazy as _ + +from intervention.forms.modals.check import CheckModalForm +from intervention.models import Intervention +from konova.decorators import registration_office_group_required, shared_access_required +from konova.utils.message_templates import INTERVENTION_INVALID + + +@login_required +@registration_office_group_required +@shared_access_required(Intervention, "id") +def check_view(request: HttpRequest, id: str): + """ Renders check form for an intervention + + Args: + request (HttpRequest): The incoming request + id (str): Intervention's id + + Returns: + + """ + intervention = get_object_or_404(Intervention, id=id) + form = CheckModalForm(request.POST or None, instance=intervention, request=request) + return form.process_request( + request, + msg_success=_("Check performed"), + msg_error=INTERVENTION_INVALID + ) + diff --git a/intervention/views/compensation.py b/intervention/views/compensation.py new file mode 100644 index 00000000..94e8dfd5 --- /dev/null +++ b/intervention/views/compensation.py @@ -0,0 +1,45 @@ +""" +Author: Michel Peltriaux +Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany +Contact: ksp-servicestelle@sgdnord.rlp.de +Created on: 19.08.22 + +""" +from django.contrib.auth.decorators import login_required +from django.core.exceptions import ObjectDoesNotExist +from django.http import HttpRequest, Http404 +from django.shortcuts import get_object_or_404 +from django.urls import reverse + +from intervention.models import Intervention +from konova.decorators import shared_access_required +from konova.forms.modals import RemoveModalForm +from konova.utils.message_templates import COMPENSATION_REMOVED_TEMPLATE + + +@login_required +@shared_access_required(Intervention, "id") +def remove_compensation_view(request: HttpRequest, id: str, comp_id: str): + """ Renders a modal view for removing the compensation + + Args: + request (HttpRequest): The incoming request + id (str): The compensation's id + + Returns: + + """ + intervention = get_object_or_404(Intervention, id=id) + try: + comp = intervention.compensations.get( + id=comp_id + ) + except ObjectDoesNotExist: + raise Http404("Unknown compensation") + form = RemoveModalForm(request.POST or None, instance=comp, request=request) + return form.process_request( + request=request, + msg_success=COMPENSATION_REMOVED_TEMPLATE.format(comp.identifier), + redirect_url=reverse("intervention:detail", args=(id,)) + "#related_data", + ) + diff --git a/intervention/views/deduction.py b/intervention/views/deduction.py new file mode 100644 index 00000000..2fb841c1 --- /dev/null +++ b/intervention/views/deduction.py @@ -0,0 +1,97 @@ +""" +Author: Michel Peltriaux +Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany +Contact: ksp-servicestelle@sgdnord.rlp.de +Created on: 19.08.22 + +""" +from django.contrib.auth.decorators import login_required +from django.core.exceptions import ObjectDoesNotExist +from django.http import HttpRequest, Http404 +from django.shortcuts import get_object_or_404 +from django.urls import reverse + +from intervention.forms.modals.deduction import NewEcoAccountDeductionModalForm, RemoveEcoAccountDeductionModalForm, \ + EditEcoAccountDeductionModalForm +from intervention.models import Intervention +from konova.decorators import default_group_required, shared_access_required +from konova.utils.message_templates import DEDUCTION_ADDED, DEDUCTION_REMOVED, DEDUCTION_EDITED + + +@login_required +@default_group_required +@shared_access_required(Intervention, "id") +def new_deduction_view(request: HttpRequest, id: str): + """ Renders a modal form view for creating deductions + + Args: + request (HttpRequest): The incoming request + id (str): The intervention's id which shall benefit from this deduction + + Returns: + + """ + intervention = get_object_or_404(Intervention, id=id) + form = NewEcoAccountDeductionModalForm(request.POST or None, instance=intervention, request=request) + return form.process_request( + request, + msg_success=DEDUCTION_ADDED, + redirect_url=reverse("intervention:detail", args=(id,)) + "#related_data", + ) + + +@login_required +@default_group_required +@shared_access_required(Intervention, "id") +def remove_deduction_view(request: HttpRequest, id: str, deduction_id: str): + """ Renders a modal view for removing deductions + + Args: + request (HttpRequest): The incoming request + id (str): The intervention's id + deduction_id (str): The deduction's id + + Returns: + + """ + intervention = get_object_or_404(Intervention, id=id) + try: + eco_deduction = intervention.deductions.get(id=deduction_id) + except ObjectDoesNotExist: + raise Http404("Unknown deduction") + + form = RemoveEcoAccountDeductionModalForm(request.POST or None, instance=intervention, deduction=eco_deduction, request=request) + return form.process_request( + request=request, + msg_success=DEDUCTION_REMOVED, + redirect_url=reverse("intervention:detail", args=(id,)) + "#related_data" + ) + + +@login_required +@default_group_required +@shared_access_required(Intervention, "id") +def edit_deduction_view(request: HttpRequest, id: str, deduction_id: str): + """ Renders a modal view for removing deductions + + Args: + request (HttpRequest): The incoming request + id (str): The intervention's id + deduction_id (str): The deduction's id + + Returns: + + """ + intervention = get_object_or_404(Intervention, id=id) + try: + eco_deduction = intervention.deductions.get(id=deduction_id) + except ObjectDoesNotExist: + raise Http404("Unknown deduction") + + form = EditEcoAccountDeductionModalForm(request.POST or None, instance=intervention, deduction=eco_deduction, request=request) + return form.process_request( + request=request, + msg_success=DEDUCTION_EDITED, + redirect_url=reverse("intervention:detail", args=(id,)) + "#related_data" + ) + diff --git a/intervention/views/document.py b/intervention/views/document.py new file mode 100644 index 00000000..be43fbd5 --- /dev/null +++ b/intervention/views/document.py @@ -0,0 +1,112 @@ +""" +Author: Michel Peltriaux +Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany +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.translation import gettext_lazy as _ + +from intervention.forms.modals.document import NewInterventionDocumentModalForm +from intervention.models import Intervention, InterventionDocument +from konova.decorators import default_group_required, shared_access_required +from konova.forms.modals import EditDocumentModalForm +from konova.utils.documents import get_document, remove_document +from konova.utils.message_templates import DOCUMENT_ADDED, DOCUMENT_EDITED + + +@login_required +@default_group_required +@shared_access_required(Intervention, "id") +def new_document_view(request: HttpRequest, id: str): + """ Renders a form for uploading new documents + + Args: + request (HttpRequest): The incoming request + id (str): The intervention's id to which the new document will be related + Returns: + + """ + intervention = get_object_or_404(Intervention, id=id) + form = NewInterventionDocumentModalForm(request.POST or None, request.FILES or None, instance=intervention, request=request) + return form.process_request( + request, + msg_success=DOCUMENT_ADDED, + redirect_url=reverse("intervention:detail", args=(id,)) + "#related_data" + ) + + +@login_required +@default_group_required +@shared_access_required(Intervention, "id") +def get_document_view(request: HttpRequest, id: str, doc_id: str): + """ Returns the document as downloadable file + + Wraps the generic document fetcher function from konova.utils. + + Args: + request (HttpRequest): The incoming request + id (str): The intervention id + doc_id (str): The document id + + Returns: + + """ + intervention = get_object_or_404(Intervention, id=id) + doc = get_object_or_404(InterventionDocument, id=doc_id) + return get_document(doc) + + +@login_required +@default_group_required +@shared_access_required(Intervention, "id") +def remove_document_view(request: HttpRequest, id: str, doc_id: str): + """ Removes the document from the database and file system + + Wraps the generic functionality from konova.utils. + + Args: + request (HttpRequest): The incoming request + id (str): The intervention id + doc_id (str): The document id + + Returns: + + """ + intervention = get_object_or_404(Intervention, id=id) + doc = get_object_or_404(InterventionDocument, id=doc_id) + return remove_document( + request, + doc + ) + + +@login_required +@default_group_required +@shared_access_required(Intervention, "id") +def edit_document_view(request: HttpRequest, id: str, doc_id: str): + """ Removes the document from the database and file system + + Wraps the generic functionality from konova.utils. + + Args: + request (HttpRequest): The incoming request + id (str): The intervention id + doc_id (str): The document id + + Returns: + + """ + intervention = get_object_or_404(Intervention, id=id) + doc = get_object_or_404(InterventionDocument, id=doc_id) + form = EditDocumentModalForm(request.POST or None, request.FILES or None, instance=intervention, document=doc, request=request) + return form.process_request( + request, + DOCUMENT_EDITED, + redirect_url=reverse("intervention:detail", args=(intervention.id,)) + "#related_data" + ) + diff --git a/intervention/views/intervention.py b/intervention/views/intervention.py new file mode 100644 index 00000000..bf33bfb9 --- /dev/null +++ b/intervention/views/intervention.py @@ -0,0 +1,251 @@ +""" +Author: Michel Peltriaux +Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany +Contact: ksp-servicestelle@sgdnord.rlp.de +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.shortcuts import get_object_or_404, render, redirect +from django.urls import reverse +from django.utils.translation import gettext_lazy as _ + +from intervention.forms.intervention import EditInterventionForm, NewInterventionForm +from intervention.models import Intervention +from intervention.tables import InterventionTable +from konova.contexts import BaseContext +from konova.decorators import default_group_required, shared_access_required, any_group_check +from konova.forms import SimpleGeomForm +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 DATA_CHECKED_PREVIOUSLY_TEMPLATE, RECORDED_BLOCKS_EDIT, \ + CHECKED_RECORDED_RESET, FORM_INVALID, IDENTIFIER_REPLACED +from konova.utils.user_checks import in_group + + +@login_required +@any_group_check +def index_view(request: HttpRequest): + """ + Renders the index view for Interventions + + Args: + request (HttpRequest): The incoming request + + Returns: + A rendered view + """ + template = "generic_index.html" + + # Filtering by user access is performed in table filter inside of InterventionTableFilter class + interventions = Intervention.objects.filter( + deleted=None, # not deleted + ).select_related( + "legal" + ) + table = InterventionTable( + request=request, + queryset=interventions + ) + context = { + "table": table, + TAB_TITLE_IDENTIFIER: _("Interventions - Overview"), + } + context = BaseContext(request, context).context + return render(request, template, context) + + +@login_required +@default_group_required +def new_view(request: HttpRequest): + """ + Renders a view for a new intervention creation + + Args: + request (HttpRequest): The incoming request + + Returns: + + """ + template = "intervention/form/view.html" + data_form = NewInterventionForm(request.POST or None) + 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) + intervention = data_form.save(request.user, geom_form) + if generated_identifier != intervention.identifier: + messages.info( + request, + IDENTIFIER_REPLACED.format( + generated_identifier, + intervention.identifier + ) + ) + messages.success(request, _("Intervention {} added").format(intervention.identifier)) + return redirect("intervention:detail", id=intervention.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 intervention"), + } + context = BaseContext(request, context).context + return render(request, template, context) + + +@login_required +@default_group_required +def new_id_view(request: HttpRequest): + """ JSON endpoint + + Provides fetching of free identifiers for e.g. AJAX calls + + """ + tmp_intervention = Intervention() + identifier = tmp_intervention.generate_new_identifier() + while Intervention.objects.filter(identifier=identifier).exists(): + identifier = tmp_intervention.generate_new_identifier() + return JsonResponse( + data={ + "gen_data": identifier + } + ) + + +@login_required +@any_group_check +def detail_view(request: HttpRequest, id: str): + """ Renders a detail view for viewing an intervention's data + + Args: + request (HttpRequest): The incoming request + id (str): The intervention's id + + Returns: + + """ + template = "intervention/detail/view.html" + + # Fetch data, filter out deleted related data + intervention = get_object_or_404( + Intervention.objects.select_related( + "geometry", + "legal", + "responsible", + ), + id=id + ) + compensations = intervention.compensations.filter( + deleted=None, + ) + _user = request.user + is_data_shared = intervention.is_shared_with(user=_user) + + geom_form = SimpleGeomForm( + instance=intervention, + ) + last_checked = intervention.get_last_checked_action() + last_checked_tooltip = "" + if last_checked: + last_checked_tooltip = DATA_CHECKED_PREVIOUSLY_TEMPLATE.format(last_checked.get_timestamp_str_formatted(), last_checked.user) + + context = { + "obj": intervention, + "last_checked": last_checked, + "last_checked_tooltip": last_checked_tooltip, + "compensations": compensations, + "has_access": is_data_shared, + "geom_form": geom_form, + "is_default_member": in_group(_user, DEFAULT_GROUP), + "is_zb_member": in_group(_user, ZB_GROUP), + "is_ets_member": in_group(_user, ETS_GROUP), + "LANIS_LINK": intervention.get_LANIS_link(), + TAB_TITLE_IDENTIFIER: f"{intervention.identifier} - {intervention.title}", + } + + request = intervention.set_status_messages(request) + + context = BaseContext(request, context).context + return render(request, template, context) + + +@login_required +@default_group_required +@shared_access_required(Intervention, "id") +def edit_view(request: HttpRequest, id: str): + """ + Renders a view for editing interventions + + Args: + request (HttpRequest): The incoming request + + Returns: + + """ + template = "intervention/form/view.html" + # Get object from db + intervention = get_object_or_404(Intervention, id=id) + if intervention.is_recorded: + messages.info( + request, + RECORDED_BLOCKS_EDIT + ) + return redirect("intervention:detail", id=id) + + # Create forms, initialize with values from db/from POST request + data_form = EditInterventionForm(request.POST or None, instance=intervention) + geom_form = SimpleGeomForm(request.POST or None, read_only=False, instance=intervention) + if request.method == "POST": + if data_form.is_valid() and geom_form.is_valid(): + # The data form takes the geom form for processing, as well as the performing user + # Save the current state of recorded|checked to inform the user in case of a status reset due to editing + i_rec = intervention.recorded is not None + i_check = intervention.checked is not None + intervention = data_form.save(request.user, geom_form) + messages.success(request, _("Intervention {} edited").format(intervention.identifier)) + if i_check or i_rec: + messages.info(request, CHECKED_RECORDED_RESET) + return redirect("intervention:detail", id=intervention.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(intervention.identifier), + } + context = BaseContext(request, context).context + return render(request, template, context) + + +@login_required +@default_group_required +@shared_access_required(Intervention, "id") +def remove_view(request: HttpRequest, id: str): + """ Renders a remove view for this intervention + + Args: + request (HttpRequest): The incoming request + id (str): The uuid id as string + + Returns: + + """ + obj = Intervention.objects.get(id=id) + identifier = obj.identifier + form = RemoveModalForm(request.POST or None, instance=obj, request=request) + return form.process_request( + request, + _("{} removed").format(identifier), + redirect_url=reverse("intervention:index") + ) diff --git a/intervention/views/log.py b/intervention/views/log.py new file mode 100644 index 00000000..fcb69197 --- /dev/null +++ b/intervention/views/log.py @@ -0,0 +1,41 @@ +""" +Author: Michel Peltriaux +Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany +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, render +from django.utils.translation import gettext_lazy as _ + +from intervention.models import Intervention +from konova.contexts import BaseContext +from konova.decorators import shared_access_required, default_group_required + + +@login_required +@default_group_required +@shared_access_required(Intervention, "id") +def log_view(request: HttpRequest, id: str): + """ Renders a log view using modal + + Args: + request (HttpRequest): The incoming request + id (str): The compensation's id + + Returns: + + """ + intervention = get_object_or_404(Intervention, id=id) + template = "modal/modal_generic.html" + body_template = "log.html" + + context = { + "modal_body_template": body_template, + "log": intervention.log.all(), + "modal_title": _("Log"), + } + context = BaseContext(request, context).context + return render(request, template, context) diff --git a/intervention/views/record.py b/intervention/views/record.py new file mode 100644 index 00000000..c5709b22 --- /dev/null +++ b/intervention/views/record.py @@ -0,0 +1,39 @@ +""" +Author: Michel Peltriaux +Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany +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.utils.translation import gettext_lazy as _ + +from intervention.models import Intervention +from konova.decorators import conservation_office_group_required, shared_access_required +from konova.forms.modals import RecordModalForm + + +@login_required +@conservation_office_group_required +@shared_access_required(Intervention, "id") +def record_view(request: HttpRequest, id: str): + """ Renders a modal form for recording an intervention + + Args: + request (HttpRequest): The incoming request + id (str): The intervention's id + + Returns: + + """ + intervention = get_object_or_404(Intervention, id=id) + form = RecordModalForm(request.POST or None, instance=intervention, request=request) + msg_succ = _("{} unrecorded") if intervention.recorded else _("{} recorded") + msg_succ = msg_succ.format(intervention.identifier) + return form.process_request( + request, + msg_succ, + msg_error=_("There are errors on this intervention:") + ) diff --git a/intervention/views/report.py b/intervention/views/report.py new file mode 100644 index 00000000..fa4798d0 --- /dev/null +++ b/intervention/views/report.py @@ -0,0 +1,73 @@ +""" +Author: Michel Peltriaux +Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany +Contact: ksp-servicestelle@sgdnord.rlp.de +Created on: 19.08.22 + +""" +from django.http import HttpRequest +from django.shortcuts import get_object_or_404, render +from django.urls import reverse +from django.utils.translation import gettext_lazy as _ + +from intervention.models import Intervention +from konova.contexts import BaseContext +from konova.forms import SimpleGeomForm +from konova.sub_settings.context_settings import TAB_TITLE_IDENTIFIER +from konova.utils.generators import generate_qr_code + + +def report_view(request:HttpRequest, id: str): + """ Renders the public report view + + Args: + request (HttpRequest): The incoming request + id (str): The id of the intervention + + Returns: + + """ + template = "intervention/report/report.html" + intervention = get_object_or_404(Intervention, id=id) + + tab_title = _("Report {}").format(intervention.identifier) + # If intervention is not recorded (yet or currently) we need to render another template without any data + if not intervention.is_ready_for_publish(): + template = "report/unavailable.html" + context = { + TAB_TITLE_IDENTIFIER: tab_title, + } + context = BaseContext(request, context).context + return render(request, template, context) + + # Prepare data for map viewer + geom_form = SimpleGeomForm( + instance=intervention + ) + parcels = intervention.get_underlying_parcels() + + distinct_deductions = intervention.deductions.all().distinct( + "account" + ) + qrcode_url = request.build_absolute_uri(reverse("intervention:report", args=(id,))) + qrcode_img = generate_qr_code(qrcode_url, 10) + qrcode_lanis_url = intervention.get_LANIS_link() + qrcode_img_lanis = generate_qr_code(qrcode_lanis_url, 7) + + context = { + "obj": intervention, + "deductions": distinct_deductions, + "qrcode": { + "img": qrcode_img, + "url": qrcode_url, + }, + "qrcode_lanis": { + "img": qrcode_img_lanis, + "url": qrcode_lanis_url, + }, + "geom_form": geom_form, + "parcels": parcels, + TAB_TITLE_IDENTIFIER: tab_title, + } + context = BaseContext(request, context).context + return render(request, template, context) diff --git a/intervention/views/resubmission.py b/intervention/views/resubmission.py new file mode 100644 index 00000000..34a618c2 --- /dev/null +++ b/intervention/views/resubmission.py @@ -0,0 +1,39 @@ +""" +Author: Michel Peltriaux +Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany +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.translation import gettext_lazy as _ + +from intervention.models import Intervention +from konova.decorators import default_group_required, shared_access_required +from konova.forms.modals import ResubmissionModalForm + + +@login_required +@default_group_required +@shared_access_required(Intervention, "id") +def create_resubmission_view(request: HttpRequest, id: str): + """ Renders resubmission form for an intervention + + Args: + request (HttpRequest): The incoming request + id (str): Intervention's id + + Returns: + + """ + intervention = get_object_or_404(Intervention, id=id) + form = ResubmissionModalForm(request.POST or None, instance=intervention, request=request) + form.action_url = reverse("intervention:resubmission-create", args=(id,)) + return form.process_request( + request, + msg_success=_("Resubmission set"), + redirect_url=reverse("intervention:detail", args=(id,)) + ) diff --git a/intervention/views/revocation.py b/intervention/views/revocation.py new file mode 100644 index 00000000..6c6c70b7 --- /dev/null +++ b/intervention/views/revocation.py @@ -0,0 +1,117 @@ +""" +Author: Michel Peltriaux +Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany +Contact: ksp-servicestelle@sgdnord.rlp.de +Created on: 19.08.22 + +""" +from django.contrib import messages +from django.contrib.auth.decorators import login_required +from django.http import HttpRequest +from django.shortcuts import get_object_or_404, redirect +from django.urls import reverse + +from intervention.forms.modals.revocation import NewRevocationModalForm, EditRevocationModalForm, \ + RemoveRevocationModalForm +from intervention.models import Intervention, RevocationDocument, Revocation +from konova.decorators import default_group_required, shared_access_required +from konova.utils.documents import get_document +from konova.utils.message_templates import REVOCATION_ADDED, DATA_UNSHARED, REVOCATION_EDITED, REVOCATION_REMOVED + + +@login_required +@default_group_required +@shared_access_required(Intervention, "id") +def new_revocation_view(request: HttpRequest, id: str): + """ Renders sharing form for an intervention + + Args: + request (HttpRequest): The incoming request + id (str): Intervention's id + + Returns: + + """ + intervention = get_object_or_404(Intervention, id=id) + form = NewRevocationModalForm(request.POST or None, request.FILES or None, instance=intervention, request=request) + return form.process_request( + request, + msg_success=REVOCATION_ADDED, + redirect_url=reverse("intervention:detail", args=(id,)) + "#related_data" + ) + + +@login_required +@default_group_required +def get_revocation_view(request: HttpRequest, doc_id: str): + """ Returns the revocation document as downloadable file + + Wraps the generic document fetcher function from konova.utils. + + Args: + request (HttpRequest): The incoming request + doc_id (str): The document id + + Returns: + + """ + doc = get_object_or_404(RevocationDocument, id=doc_id) + # File download only possible if related instance is shared with user + if not doc.instance.legal.intervention.users.filter(id=request.user.id): + messages.info( + request, + DATA_UNSHARED + ) + return redirect("intervention:detail", id=doc.instance.id) + return get_document(doc) + + +@login_required +@default_group_required +@shared_access_required(Intervention, "id") +def edit_revocation_view(request: HttpRequest, id: str, revocation_id: str): + """ Renders a edit view for a revocation + + Args: + request (HttpRequest): The incoming request + id (str): The intervention's id as string + revocation_id (str): The revocation's id as string + + Returns: + + """ + intervention = get_object_or_404(Intervention, id=id) + revocation = get_object_or_404(Revocation, id=revocation_id) + + form = EditRevocationModalForm(request.POST or None, request.FILES or None, instance=intervention, revocation=revocation, request=request) + return form.process_request( + request, + REVOCATION_EDITED, + redirect_url=reverse("intervention:detail", args=(intervention.id,)) + "#related_data" + ) + + +@login_required +@default_group_required +@shared_access_required(Intervention, "id") +def remove_revocation_view(request: HttpRequest, id: str, revocation_id: str): + """ Renders a remove view for a revocation + + Args: + request (HttpRequest): The incoming request + id (str): The intervention's id as string + revocation_id (str): The revocation's id as string + + Returns: + + """ + intervention = get_object_or_404(Intervention, id=id) + revocation = get_object_or_404(Revocation, id=revocation_id) + + form = RemoveRevocationModalForm(request.POST or None, instance=intervention, revocation=revocation, request=request) + return form.process_request( + request, + REVOCATION_REMOVED, + redirect_url=reverse("intervention:detail", args=(intervention.id,)) + "#related_data" + ) + diff --git a/intervention/views/share.py b/intervention/views/share.py new file mode 100644 index 00000000..ba9cdd3a --- /dev/null +++ b/intervention/views/share.py @@ -0,0 +1,78 @@ +""" +Author: Michel Peltriaux +Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany +Contact: ksp-servicestelle@sgdnord.rlp.de +Created on: 19.08.22 + +""" +from django.contrib import messages +from django.contrib.auth.decorators import login_required +from django.http import HttpRequest +from django.shortcuts import get_object_or_404, redirect +from django.utils.translation import gettext_lazy as _ + +from intervention.forms.modals.share import ShareModalForm +from intervention.models import Intervention +from konova.decorators import default_group_required, shared_access_required + + +@login_required +def share_view(request: HttpRequest, id: str, token: str): + """ Performs sharing of an intervention + + If token given in url is not valid, the user will be redirected to the dashboard + + Args: + request (HttpRequest): The incoming request + id (str): Intervention's id + token (str): Access token for intervention + + Returns: + + """ + user = request.user + intervention = get_object_or_404(Intervention, id=id) + # Check tokens + if intervention.access_token == token: + # Send different messages in case user has already been added to list of sharing users + if intervention.is_shared_with(user): + messages.info( + request, + _("{} has already been shared with you").format(intervention.identifier) + ) + else: + messages.success( + request, + _("{} has been shared with you").format(intervention.identifier) + ) + intervention.share_with_user(user) + return redirect("intervention:detail", id=id) + else: + messages.error( + request, + _("Share link invalid"), + extra_tags="danger", + ) + return redirect("home") + + +@login_required +@default_group_required +@shared_access_required(Intervention, "id") +def create_share_view(request: HttpRequest, id: str): + """ Renders sharing form for an intervention + + Args: + request (HttpRequest): The incoming request + id (str): Intervention's id + + Returns: + + """ + intervention = get_object_or_404(Intervention, id=id) + form = ShareModalForm(request.POST or None, instance=intervention, request=request) + return form.process_request( + request, + msg_success=_("Share settings updated") + ) +