#36 Quality checks
* adds quality check logic for Compensations with CompensationQUalityChecker * adds compensation quality checking to checking routine of RunCheckModalForm.is_valid() * adds/updates translations
This commit is contained in:
parent
4c7efdb800
commit
619f2110e4
@ -19,6 +19,7 @@ from codelist.settings import CODELIST_COMPENSATION_ACTION_ID, CODELIST_BIOTOPES
|
||||
CODELIST_COMPENSATION_FUNDING_ID
|
||||
from compensation.managers import CompensationStateManager, EcoAccountDeductionManager, CompensationActionManager, \
|
||||
EcoAccountManager, CompensationManager
|
||||
from compensation.utils.quality import CompensationQualityChecker
|
||||
from intervention.models import Intervention, ResponsibilityData, LegalData
|
||||
from konova.models import BaseObject, BaseResource, Geometry, UuidModel, AbstractDocument, \
|
||||
generate_document_file_upload_path
|
||||
@ -163,13 +164,42 @@ class AbstractCompensation(BaseObject):
|
||||
class Meta:
|
||||
abstract = True
|
||||
|
||||
def get_surface(self) -> float:
|
||||
def get_surface_after_states(self) -> float:
|
||||
""" Calculates the compensation's/account's surface
|
||||
|
||||
Returns:
|
||||
sum_surface (float)
|
||||
"""
|
||||
return self.after_states.all().aggregate(Sum("surface"))["surface__sum"]
|
||||
return self._calc_surface(self.after_states.all())
|
||||
|
||||
def get_surface_before_states(self) -> float:
|
||||
""" Calculates the compensation's/account's surface
|
||||
|
||||
Returns:
|
||||
sum_surface (float)
|
||||
"""
|
||||
return self._calc_surface(self.before_states.all())
|
||||
|
||||
def _calc_surface(self, qs: QuerySet):
|
||||
""" Calculates the surface sum of a given queryset
|
||||
|
||||
Args:
|
||||
qs (QuerySet): The queryset containing CompensationState entries
|
||||
|
||||
Returns:
|
||||
|
||||
"""
|
||||
return qs.aggregate(Sum("surface"))["surface__sum"] or 0
|
||||
|
||||
def quality_check(self) -> CompensationQualityChecker:
|
||||
""" Performs data quality check
|
||||
|
||||
Returns:
|
||||
checker (CompensationQualityChecker): Holds validity data and error messages
|
||||
"""
|
||||
checker = CompensationQualityChecker(self)
|
||||
checker.run_check()
|
||||
return checker
|
||||
|
||||
|
||||
class Compensation(AbstractCompensation):
|
||||
|
48
compensation/utils/quality.py
Normal file
48
compensation/utils/quality.py
Normal file
@ -0,0 +1,48 @@
|
||||
"""
|
||||
Author: Michel Peltriaux
|
||||
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
|
||||
Contact: michel.peltriaux@sgdnord.rlp.de
|
||||
Created on: 25.10.21
|
||||
|
||||
"""
|
||||
from django.utils.translation import gettext_lazy as _, pgettext_lazy as _con
|
||||
from konova.utils.quality import AbstractQualityChecker
|
||||
|
||||
|
||||
class CompensationQualityChecker(AbstractQualityChecker):
|
||||
def run_check(self):
|
||||
""" Perform all defined data checks
|
||||
|
||||
Returns:
|
||||
|
||||
"""
|
||||
self._check_states()
|
||||
self._check_actions()
|
||||
self._check_geometry()
|
||||
self.valid = len(self.messages) == 0
|
||||
|
||||
def _check_states(self):
|
||||
""" Checks data quality for related CompensationState objects
|
||||
|
||||
Returns:
|
||||
|
||||
"""
|
||||
after_states = self.obj.get_surface_after_states()
|
||||
before_states = self.obj.get_surface_before_states()
|
||||
if after_states != before_states:
|
||||
self.messages.append(
|
||||
_("States unequal")
|
||||
)
|
||||
if before_states == 0:
|
||||
self._add_missing_attr_name(_("States before"))
|
||||
if after_states == 0:
|
||||
self._add_missing_attr_name(_("States after"))
|
||||
|
||||
def _check_actions(self):
|
||||
""" Checks data quality for related CompensationState objects
|
||||
|
||||
Returns:
|
||||
|
||||
"""
|
||||
if not self.obj.actions.all():
|
||||
self._add_missing_attr_name(_con("Compensation", "Actions"))
|
20
ema/utils/quality.py
Normal file
20
ema/utils/quality.py
Normal file
@ -0,0 +1,20 @@
|
||||
"""
|
||||
Author: Michel Peltriaux
|
||||
Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany
|
||||
Contact: michel.peltriaux@sgdnord.rlp.de
|
||||
Created on: 25.10.21
|
||||
|
||||
"""
|
||||
from konova.utils.quality import AbstractQualityChecker
|
||||
|
||||
|
||||
class EmaQualityChecker(AbstractQualityChecker):
|
||||
def run_check(self):
|
||||
""" Perform all defined data checks
|
||||
|
||||
Returns:
|
||||
|
||||
"""
|
||||
|
||||
self._check_geometry()
|
||||
self.valid = len(self.messages) == 0
|
@ -214,6 +214,14 @@ class RunCheckModalForm(BaseModalForm):
|
||||
"checked_intervention",
|
||||
msg
|
||||
)
|
||||
comps = self.instance.compensations.all()
|
||||
for comp in comps:
|
||||
checker = comp.quality_check()
|
||||
for msg in checker.messages:
|
||||
self.add_error(
|
||||
"checked_comps",
|
||||
f"{comp.identifier}: {msg}"
|
||||
)
|
||||
return super_result and checker.valid
|
||||
|
||||
def save(self):
|
||||
@ -336,7 +344,7 @@ class NewDeductionModalForm(BaseModalForm):
|
||||
return False
|
||||
|
||||
# Calculate valid surface
|
||||
sum_surface = acc.get_surface()
|
||||
sum_surface = acc.get_surface_after_states()
|
||||
sum_surface_deductions = acc.get_deductions_surface()
|
||||
rest_surface = sum_surface - sum_surface_deductions
|
||||
form_surface = float(self.cleaned_data["surface"])
|
||||
|
Binary file not shown.
@ -19,7 +19,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-10-25 12:54+0200\n"
|
||||
"POT-Creation-Date: 2021-10-25 13:37+0200\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@ -44,7 +44,7 @@ msgstr "Bis"
|
||||
#: ema/templates/ema/report/report.html:16 intervention/forms/forms.py:101
|
||||
#: intervention/templates/intervention/detail/view.html:56
|
||||
#: intervention/templates/intervention/report/report.html:37
|
||||
#: intervention/utils/quality.py:49
|
||||
#: intervention/utils/quality.py:51
|
||||
msgid "Conservation office"
|
||||
msgstr "Eintragungsstelle"
|
||||
|
||||
@ -209,7 +209,7 @@ msgstr "Abbuchungen"
|
||||
#: compensation/templates/compensation/detail/eco_account/includes/states-before.html:36
|
||||
#: ema/templates/ema/detail/includes/states-after.html:36
|
||||
#: ema/templates/ema/detail/includes/states-before.html:36
|
||||
#: intervention/forms/modalForms.py:274
|
||||
#: intervention/forms/modalForms.py:282
|
||||
msgid "Surface"
|
||||
msgstr "Fläche"
|
||||
|
||||
@ -272,7 +272,7 @@ msgid "Type"
|
||||
msgstr "Typ"
|
||||
|
||||
#: analysis/templates/analysis/reports/includes/old_data/amount.html:24
|
||||
#: intervention/forms/modalForms.py:285 intervention/forms/modalForms.py:292
|
||||
#: intervention/forms/modalForms.py:293 intervention/forms/modalForms.py:300
|
||||
#: intervention/tables.py:88
|
||||
#: intervention/templates/intervention/detail/view.html:19
|
||||
#: konova/templates/konova/home.html:11 templates/navbars/navbar.html:22
|
||||
@ -282,7 +282,7 @@ msgstr "Eingriff"
|
||||
#: analysis/templates/analysis/reports/includes/old_data/amount.html:34
|
||||
#: compensation/tables.py:224
|
||||
#: compensation/templates/compensation/detail/eco_account/view.html:19
|
||||
#: intervention/forms/modalForms.py:258 intervention/forms/modalForms.py:265
|
||||
#: intervention/forms/modalForms.py:266 intervention/forms/modalForms.py:273
|
||||
#: konova/templates/konova/home.html:88 templates/navbars/navbar.html:34
|
||||
msgid "Eco-account"
|
||||
msgstr "Ökokonto"
|
||||
@ -376,7 +376,7 @@ msgstr "Zusätzlicher Kommentar"
|
||||
#: ema/templates/ema/report/report.html:20 intervention/forms/forms.py:129
|
||||
#: intervention/templates/intervention/detail/view.html:60
|
||||
#: intervention/templates/intervention/report/report.html:41
|
||||
#: intervention/utils/quality.py:42
|
||||
#: intervention/utils/quality.py:44
|
||||
msgid "Conservation office file number"
|
||||
msgstr "Aktenzeichen Eintragungsstelle"
|
||||
|
||||
@ -482,7 +482,7 @@ msgstr "Biotoptyp"
|
||||
msgid "Select the biotope type"
|
||||
msgstr "Biotoptyp wählen"
|
||||
|
||||
#: compensation/forms/modalForms.py:155 intervention/forms/modalForms.py:276
|
||||
#: compensation/forms/modalForms.py:155 intervention/forms/modalForms.py:284
|
||||
msgid "in m²"
|
||||
msgstr ""
|
||||
|
||||
@ -592,38 +592,38 @@ msgstr "Geben Sie die Daten der neuen Maßnahme ein"
|
||||
msgid "Added action"
|
||||
msgstr "Maßnahme hinzugefügt"
|
||||
|
||||
#: compensation/models.py:82
|
||||
#: compensation/models.py:83
|
||||
msgid "cm"
|
||||
msgstr ""
|
||||
|
||||
#: compensation/models.py:83
|
||||
#: compensation/models.py:84
|
||||
msgid "m"
|
||||
msgstr ""
|
||||
|
||||
#: compensation/models.py:84
|
||||
#: compensation/models.py:85
|
||||
msgid "km"
|
||||
msgstr ""
|
||||
|
||||
#: compensation/models.py:85
|
||||
#: compensation/models.py:86
|
||||
msgid "m²"
|
||||
msgstr ""
|
||||
|
||||
#: compensation/models.py:86
|
||||
#: compensation/models.py:87
|
||||
msgid "ha"
|
||||
msgstr ""
|
||||
|
||||
#: compensation/models.py:87
|
||||
#: compensation/models.py:88
|
||||
msgid "Pieces"
|
||||
msgstr "Stück"
|
||||
|
||||
#: compensation/models.py:329
|
||||
#: compensation/models.py:359
|
||||
msgid ""
|
||||
"Deductable surface can not be larger than existing surfaces in after states"
|
||||
msgstr ""
|
||||
"Die abbuchbare Fläche darf die Gesamtfläche der Zielzustände nicht "
|
||||
"überschreiten"
|
||||
|
||||
#: compensation/models.py:336
|
||||
#: compensation/models.py:366
|
||||
msgid ""
|
||||
"Deductable surface can not be smaller than the sum of already existing "
|
||||
"deductions. Please contact the responsible users for the deductions!"
|
||||
@ -978,7 +978,7 @@ msgstr "Keine Flächenmenge für Abbuchungen eingegeben. Bitte bearbeiten."
|
||||
#: intervention/templates/intervention/detail/view.html:63
|
||||
#: intervention/templates/intervention/detail/view.html:95
|
||||
#: intervention/templates/intervention/detail/view.html:99
|
||||
msgid "missing"
|
||||
msgid "Missing"
|
||||
msgstr "fehlt"
|
||||
|
||||
#: compensation/templates/compensation/detail/eco_account/view.html:70
|
||||
@ -1013,6 +1013,10 @@ msgstr "In LANIS öffnen"
|
||||
msgid "Deductions for"
|
||||
msgstr "Abbuchungen für"
|
||||
|
||||
#: compensation/utils/quality.py:35
|
||||
msgid "States unequal"
|
||||
msgstr "Ungleiche Zustandsflächenmengen"
|
||||
|
||||
#: compensation/views/compensation_views.py:77
|
||||
msgid "Compensation {} added"
|
||||
msgstr "Kompensation {} hinzugefügt"
|
||||
@ -1161,7 +1165,7 @@ msgstr "Bauvorhaben XY; Flur ABC"
|
||||
#: intervention/forms/forms.py:51
|
||||
#: intervention/templates/intervention/detail/view.html:35
|
||||
#: intervention/templates/intervention/report/report.html:16
|
||||
#: intervention/utils/quality.py:82
|
||||
#: intervention/utils/quality.py:84
|
||||
msgid "Process type"
|
||||
msgstr "Verfahrenstyp"
|
||||
|
||||
@ -1172,14 +1176,14 @@ msgstr "Mehrfachauswahl möglich"
|
||||
#: intervention/forms/forms.py:85
|
||||
#: intervention/templates/intervention/detail/view.html:48
|
||||
#: intervention/templates/intervention/report/report.html:29
|
||||
#: intervention/utils/quality.py:46
|
||||
#: intervention/utils/quality.py:48
|
||||
msgid "Registration office"
|
||||
msgstr "Zulassungsbehörde"
|
||||
|
||||
#: intervention/forms/forms.py:117
|
||||
#: intervention/templates/intervention/detail/view.html:52
|
||||
#: intervention/templates/intervention/report/report.html:33
|
||||
#: intervention/utils/quality.py:39
|
||||
#: intervention/utils/quality.py:41
|
||||
msgid "Registration office file number"
|
||||
msgstr "Aktenzeichen Zulassungsbehörde"
|
||||
|
||||
@ -1190,7 +1194,7 @@ msgstr ""
|
||||
#: intervention/forms/forms.py:141
|
||||
#: intervention/templates/intervention/detail/view.html:64
|
||||
#: intervention/templates/intervention/report/report.html:45
|
||||
#: intervention/utils/quality.py:52
|
||||
#: intervention/utils/quality.py:54
|
||||
msgid "Intervention handler"
|
||||
msgstr "Eingriffsverursacher"
|
||||
|
||||
@ -1201,7 +1205,7 @@ msgstr "Wer führt den Eingriff durch"
|
||||
#: intervention/forms/forms.py:154
|
||||
#: intervention/templates/intervention/detail/view.html:96
|
||||
#: intervention/templates/intervention/report/report.html:83
|
||||
#: intervention/utils/quality.py:73
|
||||
#: intervention/utils/quality.py:75
|
||||
msgid "Registration date"
|
||||
msgstr "Datum Zulassung bzw. Satzungsbeschluss"
|
||||
|
||||
@ -1279,23 +1283,23 @@ msgstr ""
|
||||
"Ich, {} {}, bestätige, dass die notwendigen Kontrollschritte durchgeführt "
|
||||
"wurden:"
|
||||
|
||||
#: intervention/forms/modalForms.py:260
|
||||
#: intervention/forms/modalForms.py:268
|
||||
msgid "Only recorded accounts can be selected for deductions"
|
||||
msgstr "Nur verzeichnete Ökokonten können für Abbuchungen verwendet werden."
|
||||
|
||||
#: intervention/forms/modalForms.py:287
|
||||
#: intervention/forms/modalForms.py:295
|
||||
msgid "Only shared interventions can be selected"
|
||||
msgstr "Nur freigegebene Eingriffe können gewählt werden"
|
||||
|
||||
#: intervention/forms/modalForms.py:300
|
||||
#: intervention/forms/modalForms.py:308
|
||||
msgid "New Deduction"
|
||||
msgstr "Neue Abbuchung"
|
||||
|
||||
#: intervention/forms/modalForms.py:301
|
||||
#: intervention/forms/modalForms.py:309
|
||||
msgid "Enter the information for a new deduction from a chosen eco-account"
|
||||
msgstr "Geben Sie die Informationen für eine neue Abbuchung ein."
|
||||
|
||||
#: intervention/forms/modalForms.py:334
|
||||
#: intervention/forms/modalForms.py:342
|
||||
msgid ""
|
||||
"Eco-account {} is not recorded yet. You can only deduct from recorded "
|
||||
"accounts."
|
||||
@ -1303,7 +1307,7 @@ msgstr ""
|
||||
"Ökokonto {} ist noch nicht verzeichnet. Abbuchungen können nur von "
|
||||
"verzeichneten Ökokonten erfolgen."
|
||||
|
||||
#: intervention/forms/modalForms.py:347
|
||||
#: intervention/forms/modalForms.py:355
|
||||
msgid ""
|
||||
"The account {} has not enough surface for a deduction of {} m². There are "
|
||||
"only {} m² left"
|
||||
@ -1385,34 +1389,31 @@ msgstr "Abbuchungen von Ökokonten"
|
||||
msgid "Exist"
|
||||
msgstr "Vorhanden"
|
||||
|
||||
#: intervention/utils/quality.py:55
|
||||
#: intervention/utils/quality.py:57
|
||||
msgid "Responsible data"
|
||||
msgstr "Daten zu den verantwortlichen Stellen"
|
||||
|
||||
#: intervention/utils/quality.py:70
|
||||
#: intervention/utils/quality.py:72
|
||||
msgid "Revocation exists"
|
||||
msgstr "Widerspruch liegt vor"
|
||||
|
||||
#: intervention/utils/quality.py:76
|
||||
#: intervention/utils/quality.py:78
|
||||
msgid "Binding date"
|
||||
msgstr "Datum Bestandskraft"
|
||||
|
||||
#: intervention/utils/quality.py:79
|
||||
#: intervention/utils/quality.py:81
|
||||
msgid "Laws"
|
||||
msgstr "Gesetze"
|
||||
|
||||
#: intervention/utils/quality.py:84
|
||||
#: intervention/utils/quality.py:86
|
||||
msgid "Legal data"
|
||||
msgstr "Rechtliche Daten"
|
||||
|
||||
#: intervention/utils/quality.py:98
|
||||
#: intervention/utils/quality.py:100
|
||||
msgid "No compensation of any type found (Compensation, Payment, Deduction)"
|
||||
msgstr "Kein Ausgleich jeglicher Art gefunden (Kompensation, Ersatzzahlung, Abbuchung)"
|
||||
|
||||
#: intervention/utils/quality.py:110 intervention/utils/quality.py:112
|
||||
#: konova/forms.py:246 templates/form/collapsable/form.html:45
|
||||
msgid "Geometry"
|
||||
msgstr "Geometrie"
|
||||
msgstr ""
|
||||
"Kein Ausgleich jeglicher Art gefunden (Kompensation, Ersatzzahlung, "
|
||||
"Abbuchung)"
|
||||
|
||||
#: intervention/views.py:80
|
||||
msgid "Intervention {} added"
|
||||
@ -1499,6 +1500,11 @@ msgstr "Löschen"
|
||||
msgid "You are about to remove {} {}"
|
||||
msgstr "Sie sind dabei {} {} zu löschen"
|
||||
|
||||
#: konova/forms.py:246 konova/utils/quality.py:44 konova/utils/quality.py:46
|
||||
#: templates/form/collapsable/form.html:45
|
||||
msgid "Geometry"
|
||||
msgstr "Geometrie"
|
||||
|
||||
#: konova/forms.py:322
|
||||
msgid "Are you sure?"
|
||||
msgstr "Sind Sie sicher?"
|
||||
@ -1674,6 +1680,10 @@ msgstr "<a href=\"{}\">Schauen Sie rein</a>"
|
||||
msgid "{} has been checked successfully by user {}! {}"
|
||||
msgstr "{} wurde erfolgreich vom Nutzer {} geprüft! {}"
|
||||
|
||||
#: konova/utils/quality.py:32
|
||||
msgid "missing"
|
||||
msgstr "fehlt"
|
||||
|
||||
#: konova/views.py:115
|
||||
msgid "Deadline removed"
|
||||
msgstr "Frist gelöscht"
|
||||
@ -3119,4 +3129,4 @@ msgstr ""
|
||||
|
||||
#: venv/lib/python3.7/site-packages/fontawesome_5/fields.py:16
|
||||
msgid "A fontawesome icon field"
|
||||
msgstr ""
|
||||
msgstr ""
|
||||
|
Loading…
Reference in New Issue
Block a user