""" 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.contrib.auth.mixins import LoginRequiredMixin 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 ema.forms import NewEmaForm, EditEmaForm from ema.models import Ema from ema.tables import EmaTable from konova.decorators import shared_access_required, conservation_office_group_required, login_required_modal from konova.forms.modals import RemoveModalForm from konova.views.base import BaseIndexView, BaseIdentifierGeneratorView, BaseNewSpatialLocatedObjectFormView, \ BaseEditSpatialLocatedObjectFormView from konova.views.detail import BaseDetailView class EmaIndexView(LoginRequiredMixin, BaseIndexView): _TAB_TITLE = _("EMAs - Overview") _INDEX_TABLE_CLS = EmaTable def _get_queryset(self): qs = Ema.objects.filter( deleted=None, ).order_by( "-modified__timestamp" ) return qs class NewEmaFormView(BaseNewSpatialLocatedObjectFormView): _FORM_CLS = NewEmaForm _MODEL_CLS = Ema _TEMPLATE = "ema/form/view.html" _TAB_TITLE = _("New EMA") _REDIRECT_URL = "ema:detail" def _user_has_permission(self, user): # User has to be an ets user return user.is_ets_user() class EditEmaFormView(BaseEditSpatialLocatedObjectFormView): _MODEL_CLS = Ema _FORM_CLS = EditEmaForm _TEMPLATE = "ema/form/view.html" _REDIRECT_URL = "ema:detail" _TAB_TITLE = _("Edit {}") def _user_has_permission(self, user): # User has to be an ets user return user.is_ets_user() class EmaIdentifierGeneratorView(LoginRequiredMixin, BaseIdentifierGeneratorView): _MODEL_CLS = Ema _REDIRECT_URL = "ema:index" def _user_has_permission(self, user): return user.is_ets_user() class EmaDetailView(BaseDetailView): _MODEL_CLS = Ema _TEMPLATE = "ema/detail/view.html" def _get_object(self, id: str): """ Fetch object for detail view Args: id (str): The record's id' Returns: """ ema = get_object_or_404(Ema, id=id, deleted=None) return ema def _get_detail_context(self, obj: Ema): """ Generate object specific detail context for view Args: obj (): The record Returns: """ # Order states according to surface before_states = obj.before_states.all().order_by("-surface") after_states = obj.after_states.all().order_by("-surface") # Precalculate logical errors between before- and after-states # Sum() returns None in case of no states, so we catch that and replace it with 0 for easier handling sum_before_states = obj.get_surface_before_states() sum_after_states = obj.get_surface_after_states() diff_states = abs(sum_before_states - sum_after_states) context = { "before_states": before_states, "after_states": after_states, "sum_before_states": sum_before_states, "sum_after_states": sum_after_states, "diff_states": diff_states, "has_finished_deadlines": obj.get_finished_deadlines().exists(), } return context @login_required_modal @login_required @conservation_office_group_required @shared_access_required(Ema, "id") def remove_view(request: HttpRequest, id: str): """ Renders a modal view for removing the EMA Args: request (HttpRequest): The incoming request id (str): The EMA's id Returns: """ ema = get_object_or_404(Ema, id=id) form = RemoveModalForm(request.POST or None, instance=ema, request=request) return form.process_request( request=request, msg_success=_("EMA removed"), redirect_url=reverse("ema:index"), )