diff --git a/compensation/models.py b/compensation/models.py index d2d18be5..37550125 100644 --- a/compensation/models.py +++ b/compensation/models.py @@ -19,9 +19,10 @@ 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, EcoAccountQualityChecker from intervention.models import Intervention, ResponsibilityData, LegalData from konova.models import BaseObject, BaseResource, Geometry, UuidModel, AbstractDocument, \ - generate_document_file_upload_path + generate_document_file_upload_path, RecordableMixin from konova.settings import DEFAULT_SRID_RLP, LANIS_LINK_TEMPLATE from user.models import UserActionLogEntry @@ -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): @@ -191,11 +221,12 @@ class Compensation(AbstractCompensation): def save(self, *args, **kwargs): if self.identifier is None or len(self.identifier) == 0: - # Create new identifier - new_id = self.generate_new_identifier() - while Compensation.objects.filter(identifier=new_id).exists(): - new_id = self.generate_new_identifier() - self.identifier = new_id + # Create new identifier is none was given + self.identifier = self.generate_new_identifier() + + # Before saving, make sure a given identifier has not been taken already in the meanwhile + while Compensation.objects.filter(identifier=self.identifier).exclude(id=self.id).exists(): + self.identifier = self.generate_new_identifier() super().save(*args, **kwargs) def get_LANIS_link(self) -> str: @@ -280,7 +311,7 @@ class CompensationDocument(AbstractDocument): pass -class EcoAccount(AbstractCompensation): +class EcoAccount(AbstractCompensation, RecordableMixin): """ An eco account is a kind of 'prepaid' compensation. It can be compared to an account that already has been filled with some kind of currency. From this account one is able to deduct currency for current projects. @@ -338,11 +369,12 @@ class EcoAccount(AbstractCompensation): def save(self, *args, **kwargs): if self.identifier is None or len(self.identifier) == 0: - # Create new identifier - new_id = self.generate_new_identifier() - while EcoAccount.objects.filter(identifier=new_id).exists(): - new_id = self.generate_new_identifier() - self.identifier = new_id + # Create new identifier if none was given + self.identifier = self.generate_new_identifier() + + # Before saving, make sure the given identifier is not used, yet + while EcoAccount.objects.filter(identifier=self.identifier).exclude(id=self.id).exists(): + self.identifier = self.generate_new_identifier() super().save(*args, **kwargs) @property @@ -417,17 +449,15 @@ class EcoAccount(AbstractCompensation): y, ) - def quality_check(self) -> list: + def quality_check(self) -> EcoAccountQualityChecker: """ Quality check Returns: - ret_msgs (list): Holds error messages + ret_msgs (EcoAccountQualityChecker): Holds validity and error messages """ - ret_msgs = [] - - # ToDo: Add check methods! - - return ret_msgs + checker = EcoAccountQualityChecker(self) + checker.run_check() + return checker def get_documents(self) -> QuerySet: """ Getter for all documents of an EcoAccount diff --git a/compensation/utils/quality.py b/compensation/utils/quality.py new file mode 100644 index 00000000..28002db4 --- /dev/null +++ b/compensation/utils/quality.py @@ -0,0 +1,104 @@ +""" +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")) + + +class EcoAccountQualityChecker(CompensationQualityChecker): + def run_check(self): + """ Checks on data quality for an EcoAccount + + Returns: + + """ + self._check_deductable_surface() + self._check_responsible_data() + self._check_legal_data() + super().run_check() + + def _check_legal_data(self): + """ Checks the data quality for LegalData + + Returns: + + """ + try: + legal = self.obj.legal + if legal.registration_date is None: + self._add_missing_attr_name(_("Agreement date")) + except AttributeError: + self._add_missing_attr_name(_("Legal data")) + + def _check_deductable_surface(self): + """ Checks the quality of the deductable surface value + + Returns: + + """ + surface = self.obj.deductable_surface + if surface is None or surface == 0: + self._add_missing_attr_name(_("Available Surface")) + after_state_surface = self.obj.get_state_after_surface_sum() + if surface > after_state_surface: + self.messages.append( + _("Deductable surface can not be larger than state surface") + ) + + def _check_responsible_data(self): + """ Checks on responsible data quality + + Returns: + + """ + try: + resp = self.obj.responsible + if resp.conservation_office is None: + self._add_missing_attr_name(_("Conservation office")) + if resp.conservation_file_number is None or len(resp.conservation_file_number) == 0: + self._add_missing_attr_name(_("Conservation office file number")) + except AttributeError: + self._add_missing_attr_name(_("Responsible data")) diff --git a/ema/models.py b/ema/models.py index e8d31c4f..1fa85019 100644 --- a/ema/models.py +++ b/ema/models.py @@ -6,12 +6,13 @@ from django.db.models import QuerySet from compensation.models import AbstractCompensation from ema.managers import EmaManager -from konova.models import AbstractDocument, generate_document_file_upload_path -from konova.settings import DEFAULT_SRID_RLP, LANIS_LINK_TEMPLATE, EMA_DOC_PATH +from ema.utils.quality import EmaQualityChecker +from konova.models import AbstractDocument, generate_document_file_upload_path, RecordableMixin +from konova.settings import DEFAULT_SRID_RLP, LANIS_LINK_TEMPLATE from user.models import UserActionLogEntry -class Ema(AbstractCompensation): +class Ema(AbstractCompensation, RecordableMixin): """ EMA = Ersatzzahlungsmaßnahme (compensation actions from payments) @@ -80,17 +81,15 @@ class Ema(AbstractCompensation): y, ) - def quality_check(self) -> list: + def quality_check(self) -> EmaQualityChecker: """ Quality check Returns: - ret_msgs (list): Holds error messages + ret_msgs (EmaQualityChecker): Holds validity error messages """ - ret_msgs = [] - - # ToDo: Add check methods! - - return ret_msgs + checker = EmaQualityChecker(self) + checker.run_check() + return checker def get_documents(self) -> QuerySet: """ Getter for all documents of an EMA diff --git a/ema/utils/quality.py b/ema/utils/quality.py new file mode 100644 index 00000000..dc7b07ca --- /dev/null +++ b/ema/utils/quality.py @@ -0,0 +1,30 @@ +""" +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 _ +from compensation.utils.quality import CompensationQualityChecker + + +class EmaQualityChecker(CompensationQualityChecker): + def run_check(self): + super().run_check() + self._check_responsible_data() + + def _check_responsible_data(self): + """ Checks on responsible data quality + + Returns: + + """ + try: + resp = self.obj.responsible + if resp.conservation_office is None: + self._add_missing_attr_name(_("Conservation office")) + if resp.conservation_file_number is None or len(resp.conservation_file_number) == 0: + self._add_missing_attr_name(_("Conservation office file number")) + except AttributeError: + self._add_missing_attr_name(_("Responsible data")) diff --git a/intervention/forms/forms.py b/intervention/forms/forms.py index 22364589..67a58a41 100644 --- a/intervention/forms/forms.py +++ b/intervention/forms/forms.py @@ -355,5 +355,9 @@ class EditInterventionForm(NewInterventionForm): self.instance.modified = user_action self.instance.save() + # Uncheck and unrecord intervention due to changed data + self.instance.set_unchecked(user) + self.instance.set_unrecorded(user) + return self.instance diff --git a/intervention/forms/modalForms.py b/intervention/forms/modalForms.py index 1af0ddcf..69425969 100644 --- a/intervention/forms/modalForms.py +++ b/intervention/forms/modalForms.py @@ -208,13 +208,21 @@ class RunCheckModalForm(BaseModalForm): """ super_result = super().is_valid() # Perform check - msgs = self.instance.quality_check() - for msg in msgs: + checker = self.instance.quality_check() + for msg in checker.messages: self.add_error( "checked_intervention", msg ) - return super_result and (len(msgs) == 0) + 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): """ Saving logic @@ -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"]) diff --git a/intervention/models.py b/intervention/models.py index 9d0c8816..46cc0950 100644 --- a/intervention/models.py +++ b/intervention/models.py @@ -10,14 +10,14 @@ import shutil from django.contrib.auth.models import User from django.contrib.gis.db import models from django.db.models import QuerySet -from django.utils.translation import gettext_lazy as _ from codelist.models import KonovaCode from codelist.settings import CODELIST_REGISTRATION_OFFICE_ID, CODELIST_CONSERVATION_OFFICE_ID, CODELIST_LAW_ID, \ CODELIST_PROCESS_TYPE_ID from intervention.managers import InterventionManager +from intervention.utils.quality import InterventionQualityChecker from konova.models import BaseObject, Geometry, UuidModel, BaseResource, AbstractDocument, \ - generate_document_file_upload_path + generate_document_file_upload_path, RecordableMixin, CheckableMixin from konova.settings import DEFAULT_SRID_RLP, LANIS_LINK_TEMPLATE, LANIS_ZOOM_LUT from konova.utils import generators from user.models import UserActionLogEntry @@ -56,7 +56,6 @@ class ResponsibilityData(UuidModel): conservation_file_number = models.CharField(max_length=1000, blank=True, null=True) handler = models.CharField(max_length=500, null=True, blank=True, help_text="Refers to 'Eingriffsverursacher' or 'Maßnahmenträger'") - def __str__(self): return "ZB: {} | ETS: {} | Handler: {}".format( self.registration_office, @@ -172,7 +171,7 @@ class LegalData(UuidModel): revocation = models.OneToOneField(Revocation, null=True, blank=True, help_text="Refers to 'Widerspruch am'", on_delete=models.SET_NULL) -class Intervention(BaseObject): +class Intervention(BaseObject, RecordableMixin, CheckableMixin): """ Interventions are e.g. construction sites where nature used to be. """ @@ -274,11 +273,11 @@ class Intervention(BaseObject): """ if self.identifier is None or len(self.identifier) == 0: - # No identifier given + # No identifier given by the user self.identifier = self.generate_new_identifier() - # Before saving, make sure the set identifier is not used, yet - while Intervention.objects.filter(identifier=self.identifier).exists(): + # Before saving, make sure the given identifier is not used in the meanwhile + while Intervention.objects.filter(identifier=self.identifier).exclude(id=self.id).exists(): self.identifier = self.generate_new_identifier() super().save(*args, **kwargs) @@ -296,62 +295,15 @@ class Intervention(BaseObject): pass super().delete(using, keep_parents) - def quality_check(self) -> list: + def quality_check(self) -> InterventionQualityChecker: """ Quality check Returns: ret_msgs (list): Holds error messages """ - ret_msgs = [] - - self._check_quality_responsible_data(ret_msgs) - self._check_quality_legal_data(ret_msgs) - - # ToDo: Extend for more! - - return ret_msgs - - def _check_quality_responsible_data(self, ret_msgs: list): - """ Checks data quality of related ResponsibilityData - - Args: - ret_msgs (dict): Holds error messages - - Returns: - - """ - try: - # Check for file numbers - if not self.responsible.registration_file_number or len(self.responsible.registration_file_number) == 0: - ret_msgs.append(_("Registration office file number missing")) - - if not self.responsible.conservation_file_number or len(self.responsible.conservation_file_number) == 0: - ret_msgs.append(_("Conservation office file number missing")) - except AttributeError: - # responsible data not found - ret_msgs.append(_("Responsible data missing")) - - def _check_quality_legal_data(self, ret_msgs: list): - """ Checks data quality of related LegalData - - Args: - ret_msgs (dict): Holds error messages - - Returns: - - """ - try: - # Check for a revocation - if self.legal.revocation: - ret_msgs.append(_("Revocation exists")) - - if self.legal.registration_date is None: - ret_msgs.append(_("Registration date missing")) - - if self.legal.binding_date is None: - ret_msgs.append(_("Binding on missing")) - except AttributeError: - ret_msgs.append(_("Legal data missing")) + checker = InterventionQualityChecker(obj=self) + checker.run_check() + return checker def get_LANIS_link(self) -> str: """ Generates a link for LANIS depending on the geometry diff --git a/intervention/utils/quality.py b/intervention/utils/quality.py new file mode 100644 index 00000000..7896000d --- /dev/null +++ b/intervention/utils/quality.py @@ -0,0 +1,99 @@ +""" +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 _ +from konova.utils.quality import AbstractQualityChecker + + +class InterventionQualityChecker(AbstractQualityChecker): + def run_check(self): + """ Perform all defined data checks + + Returns: + + """ + + self._check_responsible_data() + self._check_legal_data() + self._check_compensations() + self._check_geometry() + self.valid = len(self.messages) == 0 + + def _check_responsible_data(self): + """ Checks data quality of related ResponsibilityData + + Args: + self.messages (dict): Holds error messages + + Returns: + + """ + try: + resp = self.obj.responsible + # Check for file numbers + if not resp.registration_file_number or len(resp.registration_file_number) == 0: + self._add_missing_attr_name(_("Registration office file number")) + + if not resp.conservation_file_number or len(resp.conservation_file_number) == 0: + self._add_missing_attr_name(_("Conservation office file number")) + + # Check for selected offices + if resp.registration_office is None: + self._add_missing_attr_name(_("Registration office")) + + if resp.conservation_office is None: + self._add_missing_attr_name(_("Conservation office")) + + if resp.handler is None: + self._add_missing_attr_name(_("Intervention handler")) + except AttributeError: + # responsible data not found + self._add_missing_attr_name(_("Responsible data")) + + def _check_legal_data(self): + """ Checks data quality of related LegalData + + Args: + self.messages (dict): Holds error messages + + Returns: + + """ + try: + legal = self.obj.legal + # Check for a revocation + if legal.revocation: + self.messages.append(_("Revocation exists")) + + if legal.registration_date is None: + self._add_missing_attr_name(_("Registration date")) + + if legal.binding_date is None: + self._add_missing_attr_name(_("Binding date")) + + if legal.laws.count() == 0: + self._add_missing_attr_name(_("Laws")) + + if legal.process_type is None: + self._add_missing_attr_name(_("Process type")) + except AttributeError: + self._add_missing_attr_name(_("Legal data")) + + def _check_compensations(self): + """ Checks for compensation, deduction or payment + + Returns: + + """ + c_comps = self.obj.compensations.count() + c_pays = self.obj.payments.count() + c_deducs = self.obj.deductions.count() + c_all = c_comps + c_pays + c_deducs + if c_all == 0: + self.messages.append( + _("No compensation of any type found (Compensation, Payment, Deduction)") + ) diff --git a/intervention/views.py b/intervention/views.py index c58b03ac..6c2f524d 100644 --- a/intervention/views.py +++ b/intervention/views.py @@ -15,7 +15,7 @@ from konova.sub_settings.django_settings import DEFAULT_DATE_FORMAT from konova.utils.documents import remove_document, get_document from konova.utils.generators import generate_qr_code from konova.utils.message_templates import INTERVENTION_INVALID, FORM_INVALID, IDENTIFIER_REPLACED, \ - DATA_UNSHARED_EXPLANATION + DATA_UNSHARED_EXPLANATION, CHECKED_RECORDED_RESET from konova.utils.user_checks import in_group @@ -270,8 +270,13 @@ def edit_view(request: HttpRequest, id: str): if request.method == "POST": if data_form.is_valid() and geom_form.is_valid(): # The data form takes the geom form for processing, as well as the performing user + # Save the current state of recorded|checked to inform the user in case of a status reset due to editing + i_rec = intervention.recorded is not None + i_check = intervention.checked is not None intervention = data_form.save(request.user, geom_form) messages.success(request, _("Intervention {} edited").format(intervention.identifier)) + if i_check or i_rec: + messages.info(request, CHECKED_RECORDED_RESET) return redirect("intervention:detail", id=intervention.id) else: messages.error(request, FORM_INVALID, extra_tags="danger",) diff --git a/konova/forms.py b/konova/forms.py index 74e53896..a2c1c0cc 100644 --- a/konova/forms.py +++ b/konova/forms.py @@ -472,32 +472,38 @@ class RecordModalForm(BaseModalForm): """ super_val = super().is_valid() - msgs = self.instance.quality_check() or [] - for msg in msgs: + if self.instance.recorded: + # If user wants to unrecord an already recorded dataset, we do not need to perform custom checks + return super_val + checker = self.instance.quality_check() + for msg in checker.messages: self.add_error( "confirm", msg ) - return super_val and (len(msgs) == 0) + # Special case: Intervention + # Add direct checks for related compensations + if isinstance(self.instance, Intervention): + self._are_compensations_valid() + return super_val and checker.valid + + def _are_compensations_valid(self): + """ Runs a special case for intervention-compensations validity + + Returns: + + """ + comps = self.instance.compensations.all() + for comp in comps: + checker = comp.quality_check() + for msg in checker.messages: + self.add_error( + "confirm", + f"{comp.identifier}: {msg}" + ) def save(self): with transaction.atomic(): if self.cleaned_data["confirm"]: - if self.instance.recorded: - # unrecord! - unrecord_action = UserActionLogEntry.objects.create( - user=self.user, - action=UserAction.UNRECORDED - ) - # Do not delete the old .recorded attribute, since it shall stay in the .log list! - self.instance.recorded = None - self.instance.log.add(unrecord_action) - else: - record_action = UserActionLogEntry.objects.create( - user=self.user, - action=UserAction.RECORDED - ) - self.instance.recorded = record_action - self.instance.log.add(record_action) - self.instance.save() + self.instance.toggle_recorded(self.user) return self.instance \ No newline at end of file diff --git a/konova/models.py b/konova/models.py index f9f87584..830916fd 100644 --- a/konova/models.py +++ b/konova/models.py @@ -313,3 +313,107 @@ class Geometry(BaseResource): """ from konova.settings import DEFAULT_SRID geom = MultiPolygonField(null=True, blank=True, srid=DEFAULT_SRID) + + +class RecordableMixin: + """ Mixin to be combined with BaseObject class + + Provides functionality related to un/recording of data + + """ + def set_unrecorded(self, user: User): + """ Perform unrecording + + Args: + user (User): Performing user + + Returns: + + """ + action = UserActionLogEntry.objects.create( + user=user, + action=UserAction.UNRECORDED + ) + self.recorded = None + self.save() + self.log.add(action) + + def set_recorded(self, user: User): + """ Perform recording + + Args: + user (User): Performing user + + Returns: + + """ + action = UserActionLogEntry.objects.create( + user=user, + action=UserAction.RECORDED + ) + self.recorded = action + self.save() + self.log.add(action) + + def toggle_recorded(self, user: User): + """ Un/Record intervention + + Args: + user (User): Performing user + + Returns: + + """ + if not self.recorded: + self.set_recorded(user) + else: + self.set_unrecorded(user) + + +class CheckableMixin: + """ Mixin to be combined with BaseObject class + + Provides functionality related to un/checking of data + + """ + def set_unchecked(self, user: User): + """ Perform unrecording + + Args: + + Returns: + + """ + self.checked = None + self.save() + + def set_checked(self, user: User): + """ Perform checking + + Args: + user (User): Performing user + + Returns: + + """ + action = UserActionLogEntry.objects.create( + user=user, + action=UserAction.CHECKED + ) + self.checked = action + self.save() + self.log.add(action) + + def toggle_checked(self, user: User): + """ Un/Record intervention + + Args: + user (User): Performing user + + Returns: + + """ + if not self.checked: + self.set_checked(user) + else: + self.set_unchecked(user) diff --git a/konova/utils/message_templates.py b/konova/utils/message_templates.py index 502030c4..ae29853e 100644 --- a/konova/utils/message_templates.py +++ b/konova/utils/message_templates.py @@ -14,4 +14,6 @@ INTERVENTION_INVALID = _("There are errors in this intervention.") IDENTIFIER_REPLACED = _("The identifier '{}' had to be changed to '{}' since another entry has been added in the meanwhile, which uses this identifier") DATA_UNSHARED = _("This data is not shared with you") DATA_UNSHARED_EXPLANATION = _("Remember: This data has not been shared with you, yet. This means you can only read but can not edit or perform any actions like running a check or recording.") -MISSING_GROUP_PERMISSION = _("You need to be part of another user group.") \ No newline at end of file +MISSING_GROUP_PERMISSION = _("You need to be part of another user group.") + +CHECKED_RECORDED_RESET = _("Status of Checked and Recorded reseted") \ No newline at end of file diff --git a/konova/utils/quality.py b/konova/utils/quality.py new file mode 100644 index 00000000..adf76d4f --- /dev/null +++ b/konova/utils/quality.py @@ -0,0 +1,46 @@ +""" +Author: Michel Peltriaux +Organization: Struktur- und Genehmigungsdirektion Nord, Rhineland-Palatinate, Germany +Contact: michel.peltriaux@sgdnord.rlp.de +Created on: 25.10.21 + +""" +from abc import abstractmethod +from django.utils.translation import gettext_lazy as _ + +from konova.models import BaseObject + + +class AbstractQualityChecker: + valid = False + messages = [] + obj = None + + class Meta: + abstract = True + + def __init__(self, obj: BaseObject): + self.obj = obj + self.messages = [] + self.valid = False + + @abstractmethod + def run_check(self): + raise NotImplementedError + + def _add_missing_attr_name(self, attr_name: str): + missing = _('missing') + self.messages.append(f"{attr_name} {missing}") + + def _check_geometry(self): + """ Checks on the geometry + + Returns: + + """ + try: + geometry_obj = self.obj.geometry + if geometry_obj.geom.empty: + self._add_missing_attr_name(_("Geometry")) + except AttributeError: + self._add_missing_attr_name(_("Geometry")) diff --git a/locale/de/LC_MESSAGES/django.mo b/locale/de/LC_MESSAGES/django.mo index 8a1e11b3..e4d126ba 100644 Binary files a/locale/de/LC_MESSAGES/django.mo and b/locale/de/LC_MESSAGES/django.mo differ diff --git a/locale/de/LC_MESSAGES/django.po b/locale/de/LC_MESSAGES/django.po index 2ac3f918..f850b346 100644 --- a/locale/de/LC_MESSAGES/django.po +++ b/locale/de/LC_MESSAGES/django.po @@ -19,7 +19,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-10-22 13:14+0200\n" +"POT-Creation-Date: 2021-10-25 17:10+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -37,22 +37,24 @@ msgstr "Vom" msgid "To" msgstr "Bis" -#: analysis/forms.py:47 compensation/forms/forms.py:94 +#: analysis/forms.py:47 compensation/forms/forms.py:93 #: compensation/templates/compensation/detail/eco_account/view.html:58 #: compensation/templates/compensation/report/eco_account/report.html:16 -#: ema/templates/ema/detail/view.html:42 -#: ema/templates/ema/report/report.html:16 intervention/forms/forms.py:101 +#: compensation/utils/quality.py:100 ema/templates/ema/detail/view.html:42 +#: ema/templates/ema/report/report.html:16 ema/utils/quality.py:26 +#: intervention/forms/forms.py:101 #: intervention/templates/intervention/detail/view.html:56 #: intervention/templates/intervention/report/report.html:37 +#: intervention/utils/quality.py:49 msgid "Conservation office" msgstr "Eintragungsstelle" -#: analysis/forms.py:49 compensation/forms/forms.py:96 +#: analysis/forms.py:49 compensation/forms/forms.py:95 msgid "Select the responsible office" msgstr "Verantwortliche Stelle" -#: analysis/forms.py:58 compensation/forms/forms.py:68 -#: compensation/forms/forms.py:105 compensation/forms/forms.py:156 +#: analysis/forms.py:58 compensation/forms/forms.py:67 +#: compensation/forms/forms.py:104 compensation/forms/forms.py:155 #: intervention/forms/forms.py:63 intervention/forms/forms.py:80 #: intervention/forms/forms.py:96 intervention/forms/forms.py:112 msgid "Click for selection" @@ -208,7 +210,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" @@ -271,7 +273,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 @@ -281,7 +283,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" @@ -298,18 +300,18 @@ msgstr "Vor" msgid "Show only unrecorded" msgstr "Nur unverzeichnete anzeigen" -#: compensation/forms/forms.py:32 compensation/tables.py:25 +#: compensation/forms/forms.py:31 compensation/tables.py:25 #: compensation/tables.py:166 ema/tables.py:28 intervention/forms/forms.py:27 #: intervention/tables.py:23 #: intervention/templates/intervention/detail/includes/compensations.html:30 msgid "Identifier" msgstr "Kennung" -#: compensation/forms/forms.py:35 intervention/forms/forms.py:30 +#: compensation/forms/forms.py:34 intervention/forms/forms.py:30 msgid "Generated automatically" msgstr "Automatisch generiert" -#: compensation/forms/forms.py:44 compensation/tables.py:30 +#: compensation/forms/forms.py:43 compensation/tables.py:30 #: compensation/tables.py:171 #: compensation/templates/compensation/detail/compensation/includes/documents.html:28 #: compensation/templates/compensation/detail/compensation/view.html:31 @@ -329,23 +331,23 @@ msgstr "Automatisch generiert" msgid "Title" msgstr "Bezeichnung" -#: compensation/forms/forms.py:46 intervention/forms/forms.py:41 +#: compensation/forms/forms.py:45 intervention/forms/forms.py:41 msgid "An explanatory name" msgstr "Aussagekräftiger Titel" -#: compensation/forms/forms.py:50 ema/forms.py:47 ema/forms.py:105 +#: compensation/forms/forms.py:49 ema/forms.py:47 ema/forms.py:105 msgid "Compensation XY; Location ABC" msgstr "Kompensation XY; Flur ABC" -#: compensation/forms/forms.py:56 +#: compensation/forms/forms.py:55 msgid "Fundings" msgstr "Förderungen" -#: compensation/forms/forms.py:59 +#: compensation/forms/forms.py:58 msgid "Select fundings for this compensation" msgstr "Wählen Sie ggf. Fördermittelprojekte" -#: compensation/forms/forms.py:74 compensation/forms/modalForms.py:61 +#: compensation/forms/forms.py:73 compensation/forms/modalForms.py:61 #: compensation/forms/modalForms.py:272 compensation/forms/modalForms.py:367 #: compensation/templates/compensation/detail/compensation/includes/actions.html:34 #: compensation/templates/compensation/detail/compensation/includes/deadlines.html:34 @@ -364,63 +366,67 @@ msgstr "Wählen Sie ggf. Fördermittelprojekte" msgid "Comment" msgstr "Kommentar" -#: compensation/forms/forms.py:76 intervention/forms/forms.py:181 +#: compensation/forms/forms.py:75 intervention/forms/forms.py:181 msgid "Additional comment" msgstr "Zusätzlicher Kommentar" -#: compensation/forms/forms.py:110 +#: compensation/forms/forms.py:109 #: compensation/templates/compensation/detail/eco_account/view.html:62 #: compensation/templates/compensation/report/eco_account/report.html:20 -#: ema/templates/ema/detail/view.html:46 -#: ema/templates/ema/report/report.html:20 intervention/forms/forms.py:129 +#: compensation/utils/quality.py:102 ema/templates/ema/detail/view.html:46 +#: ema/templates/ema/report/report.html:20 ema/utils/quality.py:28 +#: intervention/forms/forms.py:129 #: intervention/templates/intervention/detail/view.html:60 #: intervention/templates/intervention/report/report.html:41 +#: intervention/utils/quality.py:42 msgid "Conservation office file number" msgstr "Aktenzeichen Eintragungsstelle" -#: compensation/forms/forms.py:116 intervention/forms/forms.py:135 +#: compensation/forms/forms.py:115 intervention/forms/forms.py:135 msgid "ETS-123/ABC.456" msgstr "" -#: compensation/forms/forms.py:122 +#: compensation/forms/forms.py:121 msgid "Eco-account handler" msgstr "Maßnahmenträger" -#: compensation/forms/forms.py:126 +#: compensation/forms/forms.py:125 msgid "Who handles the eco-account" msgstr "Wer für die Herrichtung des Ökokontos verantwortlich ist" -#: compensation/forms/forms.py:129 intervention/forms/forms.py:148 +#: compensation/forms/forms.py:128 intervention/forms/forms.py:148 msgid "Company Mustermann" msgstr "Firma Mustermann" -#: compensation/forms/forms.py:147 +#: compensation/forms/forms.py:146 #: compensation/templates/compensation/detail/compensation/view.html:35 #: compensation/templates/compensation/report/compensation/report.html:16 msgid "compensates intervention" msgstr "kompensiert Eingriff" -#: compensation/forms/forms.py:149 +#: compensation/forms/forms.py:148 msgid "Select the intervention for which this compensation compensates" msgstr "Wählen Sie den Eingriff, für den diese Kompensation bestimmt ist" -#: compensation/forms/forms.py:174 +#: compensation/forms/forms.py:173 msgid "New compensation" msgstr "Neue Kompensation" -#: compensation/forms/forms.py:232 +#: compensation/forms/forms.py:231 msgid "Edit compensation" msgstr "Bearbeite Kompensation" -#: compensation/forms/forms.py:291 +#: compensation/forms/forms.py:290 compensation/utils/quality.py:84 msgid "Available Surface" msgstr "Verfügbare Fläche" -#: compensation/forms/forms.py:294 +#: compensation/forms/forms.py:293 msgid "The amount that can be used for deductions" msgstr "Die für Abbuchungen zur Verfügung stehende Menge" -#: compensation/forms/forms.py:303 +#: compensation/forms/forms.py:302 +#: compensation/templates/compensation/detail/eco_account/view.html:66 +#: compensation/utils/quality.py:72 msgid "Agreement date" msgstr "Vereinbarungsdatum" @@ -479,7 +485,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 "" @@ -589,38 +595,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!" @@ -801,6 +807,7 @@ msgstr "Dokument löschen" #: compensation/templates/compensation/detail/compensation/includes/states-after.html:8 #: compensation/templates/compensation/detail/eco_account/includes/states-after.html:8 +#: compensation/utils/quality.py:39 #: ema/templates/ema/detail/includes/states-after.html:8 msgid "States after" msgstr "Zielzustand" @@ -837,6 +844,7 @@ msgstr "Zustand entfernen" #: compensation/templates/compensation/detail/compensation/includes/states-before.html:8 #: compensation/templates/compensation/detail/eco_account/includes/states-before.html:8 +#: compensation/utils/quality.py:37 #: ema/templates/ema/detail/includes/states-before.html:8 msgid "States before" msgstr "Ausgangszustand" @@ -876,7 +884,7 @@ msgid "Recorded on " msgstr "Verzeichnet am" #: compensation/templates/compensation/detail/compensation/view.html:71 -#: compensation/templates/compensation/detail/eco_account/view.html:70 +#: compensation/templates/compensation/detail/eco_account/view.html:74 #: compensation/templates/compensation/report/compensation/report.html:24 #: compensation/templates/compensation/report/eco_account/report.html:28 #: ema/templates/ema/detail/view.html:54 @@ -885,7 +893,7 @@ msgid "Funded by" msgstr "Gefördert mit" #: compensation/templates/compensation/detail/compensation/view.html:79 -#: compensation/templates/compensation/detail/eco_account/view.html:78 +#: compensation/templates/compensation/detail/eco_account/view.html:82 #: compensation/templates/compensation/report/compensation/report.html:31 #: compensation/templates/compensation/report/eco_account/report.html:35 #: compensation/templates/compensation/report/eco_account/report.html:49 @@ -897,7 +905,7 @@ msgid "None" msgstr "-" #: compensation/templates/compensation/detail/compensation/view.html:84 -#: compensation/templates/compensation/detail/eco_account/view.html:83 +#: compensation/templates/compensation/detail/eco_account/view.html:87 #: compensation/templates/compensation/report/compensation/report.html:37 #: compensation/templates/compensation/report/eco_account/report.html:54 #: ema/templates/ema/detail/view.html:67 @@ -908,7 +916,7 @@ msgid "Last modified" msgstr "Zuletzt bearbeitet" #: compensation/templates/compensation/detail/compensation/view.html:92 -#: compensation/templates/compensation/detail/eco_account/view.html:91 +#: compensation/templates/compensation/detail/eco_account/view.html:95 #: ema/templates/ema/detail/view.html:82 intervention/forms/modalForms.py:40 #: intervention/templates/intervention/detail/view.html:116 msgid "Shared with" @@ -962,6 +970,7 @@ msgstr "Keine Flächenmenge für Abbuchungen eingegeben. Bitte bearbeiten." #: compensation/templates/compensation/detail/eco_account/view.html:57 #: compensation/templates/compensation/detail/eco_account/view.html:61 #: compensation/templates/compensation/detail/eco_account/view.html:65 +#: compensation/templates/compensation/detail/eco_account/view.html:69 #: ema/templates/ema/detail/view.html:41 ema/templates/ema/detail/view.html:45 #: ema/templates/ema/detail/view.html:49 #: intervention/templates/intervention/detail/view.html:30 @@ -975,9 +984,9 @@ msgstr "Keine Flächenmenge für Abbuchungen eingegeben. Bitte bearbeiten." #: intervention/templates/intervention/detail/view.html:95 #: intervention/templates/intervention/detail/view.html:99 msgid "Missing" -msgstr "Fehlt" +msgstr "fehlt" -#: compensation/templates/compensation/detail/eco_account/view.html:66 +#: compensation/templates/compensation/detail/eco_account/view.html:70 #: compensation/templates/compensation/report/eco_account/report.html:24 #: ema/templates/ema/detail/view.html:50 #: ema/templates/ema/report/report.html:24 @@ -1009,6 +1018,25 @@ msgstr "In LANIS öffnen" msgid "Deductions for" msgstr "Abbuchungen für" +#: compensation/utils/quality.py:34 +msgid "States unequal" +msgstr "Ungleiche Zustandsflächenmengen" + +#: compensation/utils/quality.py:74 intervention/utils/quality.py:84 +msgid "Legal data" +msgstr "Rechtliche Daten" + +#: compensation/utils/quality.py:88 +msgid "Deductable surface can not be larger than state surface" +msgstr "" +"Die abbuchbare Fläche darf die Gesamtfläche der Zielzustände nicht " +"überschreiten" + +#: compensation/utils/quality.py:104 ema/utils/quality.py:30 +#: intervention/utils/quality.py:55 +msgid "Responsible data" +msgstr "Daten zu den verantwortlichen Stellen" + #: compensation/views/compensation_views.py:77 msgid "Compensation {} added" msgstr "Kompensation {} hinzugefügt" @@ -1017,42 +1045,42 @@ msgstr "Kompensation {} hinzugefügt" msgid "Compensation {} edited" msgstr "Kompensation {} bearbeitet" -#: compensation/views/compensation_views.py:213 -#: compensation/views/eco_account_views.py:287 ema/views.py:175 -#: intervention/views.py:437 +#: compensation/views/compensation_views.py:216 +#: compensation/views/eco_account_views.py:290 ema/views.py:178 +#: intervention/views.py:448 msgid "Log" msgstr "Log" -#: compensation/views/compensation_views.py:234 +#: compensation/views/compensation_views.py:237 msgid "Compensation removed" msgstr "Kompensation entfernt" -#: compensation/views/compensation_views.py:253 -#: compensation/views/eco_account_views.py:386 ema/views.py:328 -#: intervention/views.py:126 +#: compensation/views/compensation_views.py:256 +#: compensation/views/eco_account_views.py:389 ema/views.py:331 +#: intervention/views.py:127 msgid "Document added" msgstr "Dokument hinzugefügt" -#: compensation/views/compensation_views.py:309 -#: compensation/views/eco_account_views.py:330 ema/views.py:272 +#: compensation/views/compensation_views.py:321 +#: compensation/views/eco_account_views.py:333 ema/views.py:275 msgid "State added" msgstr "Zustand hinzugefügt" -#: compensation/views/compensation_views.py:328 -#: compensation/views/eco_account_views.py:349 ema/views.py:291 +#: compensation/views/compensation_views.py:340 +#: compensation/views/eco_account_views.py:352 ema/views.py:294 msgid "Action added" msgstr "Maßnahme hinzugefügt" -#: compensation/views/compensation_views.py:347 -#: compensation/views/eco_account_views.py:368 ema/views.py:310 +#: compensation/views/compensation_views.py:359 +#: compensation/views/eco_account_views.py:371 ema/views.py:313 msgid "Deadline added" msgstr "Frist/Termin hinzugefügt" -#: compensation/views/compensation_views.py:366 +#: compensation/views/compensation_views.py:378 msgid "State removed" msgstr "Zustand gelöscht" -#: compensation/views/compensation_views.py:385 +#: compensation/views/compensation_views.py:397 msgid "Action removed" msgstr "Maßnahme entfernt" @@ -1064,25 +1092,25 @@ msgstr "Ökokonto {} hinzugefügt" msgid "Eco-Account {} edited" msgstr "Ökokonto {} bearbeitet" -#: compensation/views/eco_account_views.py:237 +#: compensation/views/eco_account_views.py:240 msgid "Eco-account removed" msgstr "Ökokonto entfernt" -#: compensation/views/eco_account_views.py:264 +#: compensation/views/eco_account_views.py:267 msgid "Deduction removed" msgstr "Abbuchung entfernt" -#: compensation/views/eco_account_views.py:307 ema/views.py:249 -#: intervention/views.py:477 +#: compensation/views/eco_account_views.py:310 ema/views.py:252 +#: intervention/views.py:488 msgid "{} unrecorded" msgstr "{} entzeichnet" -#: compensation/views/eco_account_views.py:307 ema/views.py:249 -#: intervention/views.py:477 +#: compensation/views/eco_account_views.py:310 ema/views.py:252 +#: intervention/views.py:488 msgid "{} recorded" msgstr "{} verzeichnet" -#: compensation/views/eco_account_views.py:443 intervention/views.py:459 +#: compensation/views/eco_account_views.py:455 intervention/views.py:470 msgid "Deduction added" msgstr "Abbuchung hinzugefügt" @@ -1126,11 +1154,11 @@ msgstr "Ersatzzahlungsmaßnahme" msgid "EMA {} added" msgstr "EMA {} hinzugefügt" -#: ema/views.py:202 +#: ema/views.py:205 msgid "EMA {} edited" msgstr "EMA {} bearbeitet" -#: ema/views.py:232 +#: ema/views.py:235 msgid "EMA removed" msgstr "EMA entfernt" @@ -1157,6 +1185,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 msgid "Process type" msgstr "Verfahrenstyp" @@ -1167,12 +1196,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 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 msgid "Registration office file number" msgstr "Aktenzeichen Zulassungsbehörde" @@ -1183,6 +1214,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 msgid "Intervention handler" msgstr "Eingriffsverursacher" @@ -1193,6 +1225,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 msgid "Registration date" msgstr "Datum Zulassung bzw. Satzungsbeschluss" @@ -1270,23 +1303,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." @@ -1294,7 +1327,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" @@ -1302,34 +1335,6 @@ msgstr "" "Das Ökokonto {} hat für eine Abbuchung von {} m² nicht ausreichend " "Restfläche. Es stehen noch {} m² zur Verfügung." -#: intervention/models.py:326 -msgid "Registration office file number missing" -msgstr "Aktenzeichen Zulassungsbehörde fehlt" - -#: intervention/models.py:329 -msgid "Conservation office file number missing" -msgstr "Aktenzeichen Naturschutzbehörde fehlt" - -#: intervention/models.py:332 -msgid "Responsible data missing" -msgstr "Daten zu Verantwortlichen fehlen" - -#: intervention/models.py:346 -msgid "Revocation exists" -msgstr "Widerspruch liegt vor" - -#: intervention/models.py:349 -msgid "Registration date missing" -msgstr "Datum Zulassung bzw. Satzungsbeschluss fehlt" - -#: intervention/models.py:352 -msgid "Binding on missing" -msgstr "Datum Bestandskraft fehlt" - -#: intervention/models.py:354 -msgid "Legal data missing" -msgstr "Rechtliche Daten fehlen" - #: intervention/tables.py:45 #: intervention/templates/intervention/detail/includes/revocation.html:8 #: intervention/templates/intervention/detail/includes/revocation.html:57 @@ -1404,61 +1409,73 @@ msgstr "Abbuchungen von Ökokonten" msgid "Exist" msgstr "Vorhanden" -#: intervention/views.py:79 +#: intervention/utils/quality.py:70 +msgid "Revocation exists" +msgstr "Widerspruch liegt vor" + +#: intervention/utils/quality.py:76 +msgid "Binding date" +msgstr "Datum Bestandskraft" + +#: intervention/utils/quality.py:79 +msgid "Laws" +msgstr "Gesetze" + +#: intervention/utils/quality.py:98 +msgid "No compensation of any type found (Compensation, Payment, Deduction)" +msgstr "" +"Kein Ausgleich jeglicher Art gefunden (Kompensation, Ersatzzahlung, " +"Abbuchung)" + +#: intervention/views.py:80 msgid "Intervention {} added" msgstr "Eingriff {} hinzugefügt" -#: intervention/views.py:221 +#: intervention/views.py:231 msgid "This intervention has a revocation from {}" msgstr "Es existiert ein Widerspruch vom {}" -#: intervention/views.py:237 -msgid "" -"Remember: This data has not been shared with you, yet. This means you can " -"only read but can not edit or perform any actions like running a check or " -"recording." -msgstr "" -"Beachten Sie: Diese Daten sind für Sie noch nicht freigegeben worden. Das " -"bedeutet, dass Sie nur lesenden Zugriff hierauf haben und weder bearbeiten, " -"noch Prüfungen durchführen oder verzeichnen können." - -#: intervention/views.py:264 +#: intervention/views.py:274 msgid "Intervention {} edited" msgstr "Eingriff {} bearbeitet" -#: intervention/views.py:296 +#: intervention/views.py:275 +msgid "Status of Checked and Recorded reseted" +msgstr "'Geprüft' und 'Verzeichnet' sind zurückgesetzt worden" + +#: intervention/views.py:307 msgid "{} removed" msgstr "{} entfernt" -#: intervention/views.py:317 +#: intervention/views.py:328 msgid "Revocation removed" msgstr "Widerspruch entfernt" -#: intervention/views.py:343 +#: intervention/views.py:354 msgid "{} has already been shared with you" msgstr "{} wurde bereits für Sie freigegeben" -#: intervention/views.py:348 +#: intervention/views.py:359 msgid "{} has been shared with you" msgstr "{} ist nun für Sie freigegeben" -#: intervention/views.py:355 +#: intervention/views.py:366 msgid "Share link invalid" msgstr "Freigabelink ungültig" -#: intervention/views.py:376 +#: intervention/views.py:387 msgid "Share settings updated" msgstr "Freigabe Einstellungen aktualisiert" -#: intervention/views.py:395 +#: intervention/views.py:406 msgid "Check performed" msgstr "Prüfung durchgeführt" -#: intervention/views.py:415 +#: intervention/views.py:426 msgid "Revocation added" msgstr "Widerspruch hinzugefügt" -#: intervention/views.py:482 +#: intervention/views.py:493 msgid "There are errors on this intervention:" msgstr "Es liegen Fehler in diesem Eingriff vor:" @@ -1499,7 +1516,8 @@ msgstr "Löschen" msgid "You are about to remove {} {}" msgstr "Sie sind dabei {} {} zu löschen" -#: konova/forms.py:246 templates/form/collapsable/form.html:45 +#: konova/forms.py:246 konova/utils/quality.py:44 konova/utils/quality.py:46 +#: templates/form/collapsable/form.html:45 msgid "Geometry" msgstr "Geometrie" @@ -1653,6 +1671,16 @@ msgid "This data is not shared with you" msgstr "Diese Daten sind für Sie nicht freigegeben" #: konova/utils/message_templates.py:16 +msgid "" +"Remember: This data has not been shared with you, yet. This means you can " +"only read but can not edit or perform any actions like running a check or " +"recording." +msgstr "" +"Beachten Sie: Diese Daten sind für Sie noch nicht freigegeben worden. Das " +"bedeutet, dass Sie nur lesenden Zugriff hierauf haben und weder bearbeiten, " +"noch Prüfungen durchführen oder verzeichnen können." + +#: konova/utils/message_templates.py:17 msgid "You need to be part of another user group." msgstr "Hierfür müssen Sie einer anderen Nutzergruppe angehören!" @@ -1668,6 +1696,10 @@ msgstr "Schauen Sie rein" 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" @@ -3114,218 +3146,3 @@ msgstr "" #: venv/lib/python3.7/site-packages/fontawesome_5/fields.py:16 msgid "A fontawesome icon field" msgstr "" - -#~ msgid "After" -#~ msgstr "Nach" - -#~ msgid "Total interventions" -#~ msgstr "Insgesamt" - -#~ msgid "Amount total" -#~ msgstr "Anzahl insgesamt" - -#~ msgid "Amount checked" -#~ msgstr "Anzahl geprüft" - -#~ msgid "Amount recorded" -#~ msgstr "Anzahl verzeichnet" - -#~ msgid "Funding by..." -#~ msgstr "Gefördert mit..." - -#~ msgid "Invalid input" -#~ msgstr "Eingabe fehlerhaft" - -#~ msgid "Map" -#~ msgstr "Karte" - -#~ msgid "Where does the intervention take place" -#~ msgstr "Wo findet der Eingriff statt" - -#~ msgid "Which intervention type is this" -#~ msgstr "Welcher Eingriffstyp" - -#~ msgid "Based on which law" -#~ msgstr "Basiert auf welchem Recht" - -#~ msgid "Data provider" -#~ msgstr "Datenbereitsteller" - -#~ msgid "Who provides the data for the intervention" -#~ msgstr "Wer stellt die Daten für den Eingriff zur Verfügung" - -#~ msgid "Organization" -#~ msgstr "Organisation" - -#~ msgid "Data provider details" -#~ msgstr "Datenbereitsteller Details" - -#~ msgid "Further details" -#~ msgstr "Weitere Details" - -#~ msgid "Files" -#~ msgstr "Dateien" - -#~ msgid "Transfer note" -#~ msgstr "Verwendungszweck" - -#~ msgid "Note for money transfer" -#~ msgstr "Verwendungszweck für Überweisung" - -#~ msgid "Transfer comment" -#~ msgstr "Verwendungszweck" - -#~ msgid "Edit {}" -#~ msgstr "Bearbeite {}" - -#~ msgid "Delete {}" -#~ msgstr "Lösche {}" - -#~ msgid "Actions" -#~ msgstr "Aktionen" - -#~ msgid "Missing surfaces: " -#~ msgstr "Fehlende Flächen: " - -#~ msgid "This will remove '{}'. Are you sure?" -#~ msgstr "Hiermit wird '{}' gelöscht. Sind Sie sicher?" - -#~ msgid "Your own" -#~ msgstr "Eigene" - -#~ msgid "Quickstart" -#~ msgstr "Schnellstart" - -#~ msgid "Logged in as" -#~ msgstr "Eingeloggt als" - -#~ msgid "Last login on" -#~ msgstr "Zuletzt eingeloggt am" - -#~ msgid "Add new eco account" -#~ msgstr "Neues Ökokonto hinzufügen" - -#~ msgid "Delete EMA" -#~ msgstr "Lösche EMA" - -#~ msgid "Menu" -#~ msgstr "Menü" - -#~ msgid "Process" -#~ msgstr "Vorgang" - -#~ msgid "Process management" -#~ msgstr "Vorgangsverwaltung" - -#~ msgid "New process" -#~ msgstr "Neuer Vorgang" - -#~ msgid "Intervention management" -#~ msgstr "Eingriffsverwaltung" - -#~ msgid "Show intervention" -#~ msgstr "Zeige Eingriffe" - -#~ msgid "Eco-account management" -#~ msgstr "Ökokontoverwaltung" - -#~ msgid "Show eco-accounts" -#~ msgstr "Zeige Ökokonten" - -#~ msgid "You are currently working as " -#~ msgstr "Sie arbeiten gerade als " - -#~ msgid "Change..." -#~ msgstr "Ändern..." - -#~ msgid "" -#~ "Interventions must be part of a process. Please fill in the missing data " -#~ "for the process" -#~ msgstr "" -#~ "Eingriffe müssen zu einem Vorgang gehören. Bitte geben SIe die fehlenden " -#~ "Daten für den Vorgang ein." - -#~ msgid "You are working as" -#~ msgstr "Sie arbeiten gerade als " - -#~ msgid "Role changed" -#~ msgstr "Rolle geändert" - -#~ msgid "Official" -#~ msgstr "Amtlich" - -#~ msgid "Company" -#~ msgstr "Firma" - -#~ msgid "NGO" -#~ msgstr "NGO" - -#~ msgid "Licencing Authority" -#~ msgstr "Zulassungsbehörde" - -#~ msgid "Proper title of the process" -#~ msgstr "Titel des Vorgangs" - -#~ msgid "Which process type is this" -#~ msgstr "Welcher Vorgangstyp" - -#~ msgid "Licencing document identifier" -#~ msgstr "Aktenzeichen Zulassungsbehörde" - -#~ msgid "Comment licensing authority" -#~ msgstr "Kommentar Zulassungsbehörde" - -#~ msgid "Registration document identifier" -#~ msgstr "Aktenzeichen Eintragungsstelle" - -#~ msgid "Edit process" -#~ msgstr "Vorgang bearbeiten" - -#~ msgid "private" -#~ msgstr "privat" - -#~ msgid "accessible" -#~ msgstr "bereitgestellt" - -#~ msgid "licensed" -#~ msgstr "genehmigt" - -#~ msgid "official" -#~ msgstr "bestandskräftig" - -#~ msgid "" -#~ "A process is based on an intervention. Please fill in the missing data " -#~ "for this intervention" -#~ msgstr "" -#~ "Ein Vorgang basiert immer auf einem Eingriff. Bitte geben Sie die " -#~ "fehlenden Daten für diesen Eingriff ein" - -#~ msgid "{} status changed from {} to {}" -#~ msgstr "{} Status von {} auf {} geändert" - -#~ msgid "Process {} added" -#~ msgstr "Vorgang {} hinzugefügt" - -#~ msgid "Current role" -#~ msgstr "Aktuelle Rolle" - -#~ msgid "Object title" -#~ msgstr "Objekt Titel" - -#~ msgid "Object identifier" -#~ msgstr "Objekt Identifikator" - -#~ msgid "Open process" -#~ msgstr "Vorgang öffnen" - -#~ msgid "Delete process" -#~ msgstr "Vorgang löschen" - -#~ msgid "Licensing authority document identifier" -#~ msgstr "Aktenzeichen Zulassungsbehörde" - -#~ msgid "Registration office document identifier" -#~ msgstr "Aktenzeichen Eintragungsstelle" - -#~ msgid "You have been logged out" -#~ msgstr "Sie wurden ausgeloggt"