""" 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.mixins import LoginRequiredMixin from django.shortcuts import get_object_or_404 from django.utils.translation import gettext_lazy as _ from compensation.forms.eco_account import EditEcoAccountForm, NewEcoAccountForm, RemoveEcoAccountModalForm from compensation.models import EcoAccount from compensation.tables.eco_account import EcoAccountTable from konova.views.identifier import AbstractIdentifierGeneratorView from konova.views.form import AbstractNewGeometryFormView, AbstractEditGeometryFormView from konova.views.index import AbstractIndexView from konova.views.detail import BaseDetailView from konova.views.remove import BaseRemoveModalFormView class EcoAccountIndexView(LoginRequiredMixin, AbstractIndexView): """ View class for indexing eco accounts """ _INDEX_TABLE_CLS = EcoAccountTable _TAB_TITLE = _("Eco-account - Overview") def _get_queryset(self): qs = EcoAccount.objects.filter( deleted=None, ).order_by( "-modified__timestamp" ) return qs class NewEcoAccountFormView(AbstractNewGeometryFormView): """ Form view class Renders a form for new eco accounts """ _FORM_CLS = NewEcoAccountForm _MODEL_CLS = EcoAccount _TEMPLATE = "compensation/form/view.html" _TAB_TITLE = _("New Eco-Account") _REDIRECT_URL = "compensation:acc:detail" def _user_has_permission(self, user, **kwargs): # User has to be a default user return user.is_default_user() class EditEcoAccountFormView(AbstractEditGeometryFormView): """ Form view class Renders a form for editing of eco accounts """ _FORM_CLS = EditEcoAccountForm _MODEL_CLS = EcoAccount _TEMPLATE = "compensation/form/view.html" _REDIRECT_URL = "compensation:acc:detail" def _user_has_permission(self, user, **kwargs): # User has to be a default user return user.is_default_user() class EcoAccountIdentifierGeneratorView(LoginRequiredMixin, AbstractIdentifierGeneratorView): """ View class for identifier generation on eco accounts """ _MODEL_CLS = EcoAccount _REDIRECT_URL = "compensation:acc:index" class EcoAccountDetailView(BaseDetailView): """ Detail view class Renders details of an eco account """ _MODEL_CLS = EcoAccount _TEMPLATE = "compensation/detail/eco_account/view.html" def _get_object(self, id: str): """ Fetch object for detail view Args: id (str): The record's id' Returns: """ acc = get_object_or_404( EcoAccount.objects.prefetch_related( "deadlines", ).select_related( 'geometry', 'responsible', ), id=id, deleted=None, ) return acc def _get_detail_context(self, obj: EcoAccount): """ Generate object specific detail context for view Args: obj (): The record Returns: """ # Order states according to surface before_states = obj.before_states.order_by("-surface") after_states = obj.after_states.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) # Calculate rest of available surface for deductions available_total = obj.deductable_rest available_relative = obj.get_deductable_rest_relative() # Prefetch related data to decrease the amount of db connections deductions = obj.deductions.filter( intervention__deleted=None, ) actions = obj.actions.all() 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, "available": available_relative, "available_total": available_total, "deductions": deductions, "actions": actions, "has_finished_deadlines": obj.get_finished_deadlines().exists(), } return context class RemoveEcoAccountView(LoginRequiredMixin, BaseRemoveModalFormView): """ Form view class Renders a form for removing eco accounts """ _MODEL_CLS = EcoAccount _FORM_CLS = RemoveEcoAccountModalForm _REDIRECT_URL = "compensation:acc:index" def _user_has_permission(self, user, **kwargs): return user.is_default_user()