* refactors views for new ema and edit ema from function to class based * moves shared access check to base edit form view to be checked for every inheriting class * fixes bug where private variables changed on singleton objects * updates translations
142 lines
4.2 KiB
Python
142 lines
4.2 KiB
Python
"""
|
|
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()
|
|
|
|
def _user_has_shared_access(self, user, **kwargs):
|
|
# No specific share constraint for creatin EMA entries
|
|
return True
|
|
|
|
|
|
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"),
|
|
)
|
|
|