* renames certain classes to match their content * splits larger files into smaller ones
164 lines
4.9 KiB
Python
164 lines
4.9 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.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()
|