Merge pull request '36_Quality_checks' (#37) from 36_Quality_checks into master
Reviewed-on: SGD-Nord/konova#37
This commit is contained in:
commit
e2d2e0317c
@ -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
|
||||
|
104
compensation/utils/quality.py
Normal file
104
compensation/utils/quality.py
Normal file
@ -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
|
||||
|
30
ema/utils/quality.py
Normal file
30
ema/utils/quality.py
Normal file
@ -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
|
||||
|
99
intervention/utils/quality.py
Normal file
99
intervention/utils/quality.py
Normal file
@ -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
|
104
konova/models.py
104
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)
|
||||
|
@ -15,3 +15,5 @@ IDENTIFIER_REPLACED = _("The identifier '{}' had to be changed to '{}' since ano
|
||||
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.")
|
||||
|
||||
CHECKED_RECORDED_RESET = _("Status of Checked and Recorded reseted")
|
46
konova/utils/quality.py
Normal file
46
konova/utils/quality.py
Normal file
@ -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…
Reference in New Issue
Block a user