36_Quality_checks #37

Merged
mpeltriaux merged 7 commits from 36_Quality_checks into master 3 years ago

@ -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

@ -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"))

@ -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

@ -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"))

@ -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

@ -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"])

@ -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

@ -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)")
)

@ -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",)

@ -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

@ -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)

@ -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.")
MISSING_GROUP_PERMISSION = _("You need to be part of another user group.")
CHECKED_RECORDED_RESET = _("Status of Checked and Recorded reseted")

@ -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"))

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-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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 "<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"
@ -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"

Loading…
Cancel
Save