Compare commits

...

3 Commits

Author SHA1 Message Date
527077cef3 #49 Annual report improve
* improves the filtering of annual report timespan on a date base instead of timestamp base
2022-01-05 15:26:16 +01:00
393f9a4d47 #49 Parcels on report
* adds parcel displaying on public reports
* fixes bug in EMA where autocomplete js would not load for modal forms
* fixes bug where BaseContext cached data from last request and reused it, if not overwritten
2022-01-05 14:41:32 +01:00
bf0de00b72 #49 Frontend rendering
* adds rendering for detail view
* adds new includable html snippet for parcel rendering
* refactors generic includables in konova/ app into konova/templates/includes/...
* fixes bug where parcels have been reused from the database due to wrong model structure
* adds get_underlying_parcels() for Geometry model
* adds get_underlying_parcels() for GeoReferencedMixin models
* fixes bug where missing geometry would lead to an error during geometry conflict check
* removes unused wfs attribute from AbstractWFSFetcher
* adds/updates translations
2022-01-05 14:13:26 +01:00
26 changed files with 227 additions and 94 deletions

View File

@ -64,8 +64,8 @@ class TimespanReport:
responsible__conservation_office__id=id, responsible__conservation_office__id=id,
legal__registration_date__gt=LKOMPVZVO_PUBLISH_DATE, legal__registration_date__gt=LKOMPVZVO_PUBLISH_DATE,
deleted=None, deleted=None,
created__timestamp__gte=date_from, created__timestamp__date__gte=date_from,
created__timestamp__lte=date_to, created__timestamp__date__lte=date_to,
) )
self.queryset_checked = self.queryset.filter( self.queryset_checked = self.queryset.filter(
checked__isnull=False checked__isnull=False
@ -231,8 +231,8 @@ class TimespanReport:
intervention__responsible__conservation_office__id=id, intervention__responsible__conservation_office__id=id,
intervention__legal__registration_date__gt=LKOMPVZVO_PUBLISH_DATE, intervention__legal__registration_date__gt=LKOMPVZVO_PUBLISH_DATE,
deleted=None, deleted=None,
intervention__created__timestamp__gte=date_from, intervention__created__date__timestamp__gte=date_from,
intervention__created__timestamp__lte=date_to, intervention__created__date__timestamp__lte=date_to,
) )
self.queryset_checked = self.queryset.filter( self.queryset_checked = self.queryset.filter(
intervention__checked__isnull=False intervention__checked__isnull=False
@ -400,8 +400,8 @@ class TimespanReport:
self.queryset = EcoAccount.objects.filter( self.queryset = EcoAccount.objects.filter(
responsible__conservation_office__id=id, responsible__conservation_office__id=id,
deleted=None, deleted=None,
created__timestamp__gte=date_from, created__timestamp__date__gte=date_from,
created__timestamp__lte=date_to, created__timestamp__date__lte=date_to,
) )
self.queryset_recorded = self.queryset.filter( self.queryset_recorded = self.queryset.filter(
recorded__isnull=False recorded__isnull=False
@ -479,8 +479,8 @@ class TimespanReport:
legal__registration_date__lte=LKOMPVZVO_PUBLISH_DATE, legal__registration_date__lte=LKOMPVZVO_PUBLISH_DATE,
responsible__conservation_office__id=id, responsible__conservation_office__id=id,
deleted=None, deleted=None,
created__timestamp__gte=date_from, created__timestamp__date__gte=date_from,
created__timestamp__lte=date_to, created__timestamp__date__lte=date_to,
) )
self.queryset_intervention_recorded = self.queryset_intervention.filter( self.queryset_intervention_recorded = self.queryset_intervention.filter(
recorded__isnull=False recorded__isnull=False

View File

@ -170,7 +170,7 @@ class AbstractCompensation(BaseObject, GeoReferencedMixin):
""" """
if not self.is_shared_with(request.user): if not self.is_shared_with(request.user):
messages.info(request, DATA_UNSHARED_EXPLANATION) messages.info(request, DATA_UNSHARED_EXPLANATION)
request = self._set_geometry_conflict_message(request) request = self.set_geometry_conflict_message(request)
return request return request

View File

@ -110,7 +110,10 @@
{% include 'map/geom_form.html' %} {% include 'map/geom_form.html' %}
</div> </div>
<div class="row"> <div class="row">
{% include 'konova/comment_card.html' %} {% include 'konova/includes/parcels.html' %}
</div>
<div class="row">
{% include 'konova/includes/comment_card.html' %}
</div> </div>
</div> </div>
</div> </div>

View File

@ -93,7 +93,10 @@
{% include 'map/geom_form.html' %} {% include 'map/geom_form.html' %}
</div> </div>
<div class="row"> <div class="row">
{% include 'konova/comment_card.html' %} {% include 'konova/includes/parcels.html' %}
</div>
<div class="row">
{% include 'konova/includes/comment_card.html' %}
</div> </div>
</div> </div>
</div> </div>

View File

@ -37,6 +37,9 @@
<div class="row"> <div class="row">
{% include 'map/geom_form.html' %} {% include 'map/geom_form.html' %}
</div> </div>
<div class="row">
{% include 'konova/includes/parcels.html' %}
</div>
<div class="row"> <div class="row">
<div class="col-sm-6 col-md-6 col-lg-6"> <div class="col-sm-6 col-md-6 col-lg-6">
<h4>{% trans 'Open in browser' %}</h4> <h4>{% trans 'Open in browser' %}</h4>

View File

@ -54,6 +54,9 @@
<div class="row"> <div class="row">
{% include 'map/geom_form.html' %} {% include 'map/geom_form.html' %}
</div> </div>
<div class="row">
{% include 'konova/includes/parcels.html' %}
</div>
<div class="row"> <div class="row">
<div class="col-sm-6 col-md-6 col-lg-6"> <div class="col-sm-6 col-md-6 col-lg-6">
<h4>{% trans 'Open in browser' %}</h4> <h4>{% trans 'Open in browser' %}</h4>

View File

@ -170,6 +170,7 @@ def detail_view(request: HttpRequest, id: str):
template = "compensation/detail/compensation/view.html" template = "compensation/detail/compensation/view.html"
comp = get_object_or_404(Compensation, id=id) comp = get_object_or_404(Compensation, id=id)
geom_form = SimpleGeomForm(instance=comp) geom_form = SimpleGeomForm(instance=comp)
parcels = comp.get_underlying_parcels()
_user = request.user _user = request.user
is_data_shared = comp.intervention.is_shared_with(_user) is_data_shared = comp.intervention.is_shared_with(_user)
@ -189,6 +190,7 @@ def detail_view(request: HttpRequest, id: str):
context = { context = {
"obj": comp, "obj": comp,
"geom_form": geom_form, "geom_form": geom_form,
"parcels": parcels,
"has_access": is_data_shared, "has_access": is_data_shared,
"actions": actions, "actions": actions,
"before_states": before_states, "before_states": before_states,
@ -451,6 +453,7 @@ def report_view(request: HttpRequest, id: str):
geom_form = SimpleGeomForm( geom_form = SimpleGeomForm(
instance=comp instance=comp
) )
parcels = comp.get_underlying_parcels()
qrcode_img = generate_qr_code( qrcode_img = generate_qr_code(
request.build_absolute_uri(reverse("compensation:report", args=(id,))), request.build_absolute_uri(reverse("compensation:report", args=(id,))),
10 10
@ -472,6 +475,7 @@ def report_view(request: HttpRequest, id: str):
"before_states": before_states, "before_states": before_states,
"after_states": after_states, "after_states": after_states,
"geom_form": geom_form, "geom_form": geom_form,
"parcels": parcels,
"actions": actions, "actions": actions,
} }
context = BaseContext(request, context).context context = BaseContext(request, context).context

View File

@ -181,6 +181,7 @@ def detail_view(request: HttpRequest, id: str):
id=id id=id
) )
geom_form = SimpleGeomForm(instance=acc) geom_form = SimpleGeomForm(instance=acc)
parcels = acc.get_underlying_parcels()
_user = request.user _user = request.user
is_data_shared = acc.is_shared_with(_user) is_data_shared = acc.is_shared_with(_user)
@ -207,6 +208,7 @@ def detail_view(request: HttpRequest, id: str):
context = { context = {
"obj": acc, "obj": acc,
"geom_form": geom_form, "geom_form": geom_form,
"parcels": parcels,
"has_access": is_data_shared, "has_access": is_data_shared,
"before_states": before_states, "before_states": before_states,
"after_states": after_states, "after_states": after_states,
@ -553,6 +555,7 @@ def report_view(request:HttpRequest, id: str):
geom_form = SimpleGeomForm( geom_form = SimpleGeomForm(
instance=acc instance=acc
) )
parcels = acc.get_underlying_parcels()
qrcode_img = generate_qr_code( qrcode_img = generate_qr_code(
request.build_absolute_uri(reverse("ema:report", args=(id,))), request.build_absolute_uri(reverse("ema:report", args=(id,))),
10 10
@ -580,6 +583,7 @@ def report_view(request:HttpRequest, id: str):
"before_states": before_states, "before_states": before_states,
"after_states": after_states, "after_states": after_states,
"geom_form": geom_form, "geom_form": geom_form,
"parcels": parcels,
"actions": actions, "actions": actions,
"deductions": deductions, "deductions": deductions,
} }

View File

@ -106,7 +106,7 @@ class Ema(AbstractCompensation, ShareableObjectMixin, RecordableObjectMixin):
""" """
if not self.is_shared_with(request.user): if not self.is_shared_with(request.user):
messages.info(request, DATA_UNSHARED_EXPLANATION) messages.info(request, DATA_UNSHARED_EXPLANATION)
self._set_geometry_conflict_message(request) self.set_geometry_conflict_message(request)
return request return request

View File

@ -2,7 +2,13 @@
{% load i18n l10n static fontawesome_5 humanize %} {% load i18n l10n static fontawesome_5 humanize %}
{% block head %} {% block head %}
{% comment %}
dal documentation (django-autocomplete-light) states using form.media for adding needed scripts.
This does not work properly with modal forms, as the scripts are not loaded properly inside the modal.
Therefore the script linkages from form.media have been extracted and put inside dal/scripts.html to ensure
these scripts are loaded when needed.
{% endcomment %}
{% include 'dal/scripts.html' %}
{% endblock %} {% endblock %}
{% block body %} {% block body %}
@ -77,8 +83,16 @@
</div> </div>
</div> </div>
<div class="col-sm-12 col-md-12 col-lg-6"> <div class="col-sm-12 col-md-12 col-lg-6">
<div class="row">
{% include 'map/geom_form.html' %} {% include 'map/geom_form.html' %}
</div> </div>
<div class="row">
{% include 'konova/includes/parcels.html' %}
</div>
<div class="row">
{% include 'konova/includes/comment_card.html' %}
</div>
</div>
</div> </div>
<hr> <hr>

View File

@ -41,6 +41,9 @@
<div class="row"> <div class="row">
{% include 'map/geom_form.html' %} {% include 'map/geom_form.html' %}
</div> </div>
<div class="row">
{% include 'konova/includes/parcels.html' %}
</div>
<div class="row"> <div class="row">
<div class="col-sm-6 col-md-6 col-lg-6"> <div class="col-sm-6 col-md-6 col-lg-6">
<h4>{% trans 'Open in browser' %}</h4> <h4>{% trans 'Open in browser' %}</h4>

View File

@ -125,6 +125,7 @@ def detail_view(request: HttpRequest, id: str):
ema = get_object_or_404(Ema, id=id, deleted=None) ema = get_object_or_404(Ema, id=id, deleted=None)
geom_form = SimpleGeomForm(instance=ema) geom_form = SimpleGeomForm(instance=ema)
parcels = ema.get_underlying_parcels()
_user = request.user _user = request.user
is_data_shared = ema.is_shared_with(_user) is_data_shared = ema.is_shared_with(_user)
@ -143,6 +144,7 @@ def detail_view(request: HttpRequest, id: str):
context = { context = {
"obj": ema, "obj": ema,
"geom_form": geom_form, "geom_form": geom_form,
"parcels": parcels,
"has_access": is_data_shared, "has_access": is_data_shared,
"before_states": before_states, "before_states": before_states,
"after_states": after_states, "after_states": after_states,
@ -464,6 +466,7 @@ def report_view(request:HttpRequest, id: str):
geom_form = SimpleGeomForm( geom_form = SimpleGeomForm(
instance=ema, instance=ema,
) )
parcels = ema.get_underlying_parcels()
qrcode_img = generate_qr_code( qrcode_img = generate_qr_code(
request.build_absolute_uri(reverse("ema:report", args=(id,))), request.build_absolute_uri(reverse("ema:report", args=(id,))),
10 10
@ -485,6 +488,7 @@ def report_view(request:HttpRequest, id: str):
"before_states": before_states, "before_states": before_states,
"after_states": after_states, "after_states": after_states,
"geom_form": geom_form, "geom_form": geom_form,
"parcels": parcels,
"actions": actions, "actions": actions,
} }
context = BaseContext(request, context).context context = BaseContext(request, context).context

View File

@ -278,7 +278,7 @@ class Intervention(BaseObject, ShareableObjectMixin, RecordableObjectMixin, Chec
""" """
if not self.is_shared_with(request.user): if not self.is_shared_with(request.user):
messages.info(request, DATA_UNSHARED_EXPLANATION) messages.info(request, DATA_UNSHARED_EXPLANATION)
request = self._set_geometry_conflict_message(request) request = self.set_geometry_conflict_message(request)
return request return request

View File

@ -127,7 +127,10 @@
{% include 'map/geom_form.html' %} {% include 'map/geom_form.html' %}
</div> </div>
<div class="row"> <div class="row">
{% include 'konova/comment_card.html' %} {% include 'konova/includes/parcels.html' %}
</div>
<div class="row">
{% include 'konova/includes/comment_card.html' %}
</div> </div>
</div> </div>
</div> </div>

View File

@ -100,6 +100,9 @@
<div class="row"> <div class="row">
{% include 'map/geom_form.html' %} {% include 'map/geom_form.html' %}
</div> </div>
<div class="row">
{% include 'konova/includes/parcels.html' %}
</div>
<div class="row"> <div class="row">
<div class="col-sm-6 col-md-6 col-lg-6"> <div class="col-sm-6 col-md-6 col-lg-6">
<h4>{% trans 'Open in browser' %}</h4> <h4>{% trans 'Open in browser' %}</h4>

View File

@ -236,6 +236,8 @@ def detail_view(request: HttpRequest, id: str):
instance=intervention, instance=intervention,
) )
parcels = intervention.get_underlying_parcels()
# Inform user about revocation # Inform user about revocation
if intervention.legal.revocations.exists(): if intervention.legal.revocations.exists():
messages.error( messages.error(
@ -249,6 +251,7 @@ def detail_view(request: HttpRequest, id: str):
"compensations": compensations, "compensations": compensations,
"has_access": is_data_shared, "has_access": is_data_shared,
"geom_form": geom_form, "geom_form": geom_form,
"parcels": parcels,
"is_default_member": in_group(_user, DEFAULT_GROUP), "is_default_member": in_group(_user, DEFAULT_GROUP),
"is_zb_member": in_group(_user, ZB_GROUP), "is_zb_member": in_group(_user, ZB_GROUP),
"is_ets_member": in_group(_user, ETS_GROUP), "is_ets_member": in_group(_user, ETS_GROUP),
@ -544,6 +547,7 @@ def report_view(request:HttpRequest, id: str):
geom_form = SimpleGeomForm( geom_form = SimpleGeomForm(
instance=intervention instance=intervention
) )
parcels = intervention.get_underlying_parcels()
distinct_deductions = intervention.deductions.all().distinct( distinct_deductions = intervention.deductions.all().distinct(
"account" "account"
@ -562,6 +566,7 @@ def report_view(request:HttpRequest, id: str):
"qrcode": qrcode_img, "qrcode": qrcode_img,
"qrcode_lanis": qrcode_img_lanis, "qrcode_lanis": qrcode_img_lanis,
"geom_form": geom_form, "geom_form": geom_form,
"parcels": parcels,
} }
context = BaseContext(request, context).context context = BaseContext(request, context).context
return render(request, template, context) return render(request, template, context)

View File

@ -20,6 +20,7 @@ class GeometryAdmin(admin.ModelAdmin):
class ParcelAdmin(admin.ModelAdmin): class ParcelAdmin(admin.ModelAdmin):
list_display = [ list_display = [
"id", "id",
"gmrkng",
"flr", "flr",
"flrstck_nnr", "flrstck_nnr",
"flrstck_zhlr", "flrstck_zhlr",
@ -30,7 +31,6 @@ class ParcelAdmin(admin.ModelAdmin):
class DistrictAdmin(admin.ModelAdmin): class DistrictAdmin(admin.ModelAdmin):
list_display = [ list_display = [
"id", "id",
"gmrkng",
"gmnd", "gmnd",
"krs", "krs",
] ]

View File

@ -15,18 +15,17 @@ class BaseContext:
""" """
Holds all base data which is needed for every context rendering Holds all base data which is needed for every context rendering
""" """
context = { context = None
"base_title": BASE_TITLE,
"base_frontend_title": BASE_FRONTEND_TITLE,
"language": LANGUAGE_CODE,
"user": None,
"current_role": None,
"help_link": HELP_LINK,
}
def __init__(self, request: HttpRequest, additional_context: dict = {}): def __init__(self, request: HttpRequest, additional_context: dict = {}):
self.context["language"] = request.LANGUAGE_CODE self.context = {
self.context["user"] = request.user "base_title": BASE_TITLE,
"base_frontend_title": BASE_FRONTEND_TITLE,
"language": request.LANGUAGE_CODE,
"user": request.user,
"current_role": None,
"help_link": HELP_LINK
}
# Add additional context, derived from given parameters # Add additional context, derived from given parameters
self.context.update(additional_context) self.context.update(additional_context)

View File

@ -111,12 +111,12 @@ class Geometry(BaseResource):
for result in fetched_parcels: for result in fetched_parcels:
fetched_parcel = result[typename] fetched_parcel = result[typename]
parcel_obj = Parcel.objects.get_or_create( parcel_obj = Parcel.objects.get_or_create(
gmrkng=fetched_parcel["ave:gemarkung"],
flr=fetched_parcel["ave:flur"], flr=fetched_parcel["ave:flur"],
flrstck_nnr=fetched_parcel['ave:flstnrnen'], flrstck_nnr=fetched_parcel['ave:flstnrnen'],
flrstck_zhlr=fetched_parcel['ave:flstnrzae'], flrstck_zhlr=fetched_parcel['ave:flstnrzae'],
)[0] )[0]
district = District.objects.get_or_create( district = District.objects.get_or_create(
gmrkng=fetched_parcel["ave:gemarkung"],
gmnd=fetched_parcel["ave:gemeinde"], gmnd=fetched_parcel["ave:gemeinde"],
krs=fetched_parcel["ave:kreis"], krs=fetched_parcel["ave:kreis"],
)[0] )[0]
@ -127,6 +127,20 @@ class Geometry(BaseResource):
self.parcels.set(underlying_parcels) self.parcels.set(underlying_parcels)
def get_underlying_parcels(self):
""" Getter for related parcels and their districts
Returns:
parcels (QuerySet): The related parcels as queryset
"""
parcels = self.parcels.all().prefetch_related(
"district"
).order_by(
"gmrkng",
)
return parcels
class GeometryConflict(UuidModel): class GeometryConflict(UuidModel):
""" """

View File

@ -420,13 +420,29 @@ class GeoReferencedMixin(models.Model):
class Meta: class Meta:
abstract = True abstract = True
def _set_geometry_conflict_message(self, request: HttpRequest): def get_underlying_parcels(self):
""" Getter for related parcels
Returns:
parcels (Iterable): An empty list or a Queryset
"""
if self.geometry is not None:
return self.geometry.get_underlying_parcels()
else:
return []
def set_geometry_conflict_message(self, request: HttpRequest):
if self.geometry is None:
return request
instance_objs = [] instance_objs = []
add_message = False add_message = False
conflicts = self.geometry.conflicts_geometries.all() conflicts = self.geometry.conflicts_geometries.all()
for conflict in conflicts: for conflict in conflicts:
instance_objs += conflict.affected_geometry.get_data_objects() instance_objs += conflict.affected_geometry.get_data_objects()
add_message = True add_message = True
conflicts = self.geometry.conflicted_by_geometries.all() conflicts = self.geometry.conflicted_by_geometries.all()
for conflict in conflicts: for conflict in conflicts:
instance_objs += conflict.conflicting_geometry.get_data_objects() instance_objs += conflict.conflicting_geometry.get_data_objects()

View File

@ -24,6 +24,12 @@ class Parcel(UuidModel):
""" """
geometries = models.ManyToManyField("konova.Geometry", related_name="parcels", blank=True) geometries = models.ManyToManyField("konova.Geometry", related_name="parcels", blank=True)
district = models.ForeignKey("konova.District", on_delete=models.SET_NULL, null=True, blank=True, related_name="parcels") district = models.ForeignKey("konova.District", on_delete=models.SET_NULL, null=True, blank=True, related_name="parcels")
gmrkng = models.CharField(
max_length=1000,
help_text="Gemarkung",
null=True,
blank=True,
)
flrstck_nnr = models.CharField( flrstck_nnr = models.CharField(
max_length=1000, max_length=1000,
help_text="Flurstücksnenner", help_text="Flurstücksnenner",
@ -45,7 +51,7 @@ class Parcel(UuidModel):
updated_on = models.DateTimeField(auto_now_add=True) updated_on = models.DateTimeField(auto_now_add=True)
def __str__(self): def __str__(self):
return f"{self.flr} | {self.flrstck_nnr} | {self.flrstck_zhlr}" return f"{self.gmrkng} | {self.flr} | {self.flrstck_zhlr} | {self.flrstck_nnr}"
class District(UuidModel): class District(UuidModel):
@ -56,12 +62,6 @@ class District(UuidModel):
District. District.
""" """
gmrkng = models.CharField(
max_length=1000,
help_text="Gemarkung",
null=True,
blank=True,
)
gmnd = models.CharField( gmnd = models.CharField(
max_length=1000, max_length=1000,
help_text="Gemeinde", help_text="Gemeinde",
@ -76,4 +76,4 @@ class District(UuidModel):
) )
def __str__(self): def __str__(self):
return f"{self.gmrkng} | {self.gmnd} | {self.krs}" return f"{self.gmnd} | {self.krs}"

View File

@ -0,0 +1,29 @@
{% load i18n %}
<div>
<h3>{% trans 'Spatial reference' %}</h3>
</div>
<div class="table-container w-100 scroll-300">
<table class="table table-hover">
<thead>
<tr>
<th scope="col">{% trans 'Kreis' %}</th>
<th scope="col">{% trans 'Gemarkung' %}</th>
<th scope="col">{% trans 'Parcel' %}</th>
<th scope="col">{% trans 'Parcel counter' %}</th>
<th scope="col">{% trans 'Parcel number' %}</th>
</tr>
</thead>
<tbody>
{% for parcel in parcels %}
<tr>
<td>{{parcel.district.krs|default_if_none:"-"}}</td>
<td>{{parcel.gmrkng|default_if_none:"-"}}</td>
<td>{{parcel.flr|default_if_none:"-"}}</td>
<td>{{parcel.flrstck_zhlr|default_if_none:"-"}}</td>
<td>{{parcel.flrstck_nnr|default_if_none:"-"}}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>

View File

@ -22,7 +22,6 @@ class AbstractWFSFetcher:
# base_url represents not the capabilities url but the parameter-free base url # base_url represents not the capabilities url but the parameter-free base url
base_url = None base_url = None
version = None version = None
wfs = None
auth_user = None auth_user = None
auth_pw = None auth_pw = None
auth_digest_obj = None auth_digest_obj = None

Binary file not shown.

View File

@ -11,15 +11,15 @@
#: intervention/forms/forms.py:52 intervention/forms/forms.py:154 #: intervention/forms/forms.py:52 intervention/forms/forms.py:154
#: intervention/forms/forms.py:166 intervention/forms/modalForms.py:125 #: intervention/forms/forms.py:166 intervention/forms/modalForms.py:125
#: intervention/forms/modalForms.py:138 intervention/forms/modalForms.py:151 #: intervention/forms/modalForms.py:138 intervention/forms/modalForms.py:151
#: konova/forms.py:139 konova/forms.py:240 konova/forms.py:308 #: konova/forms.py:139 konova/forms.py:240 konova/forms.py:309
#: konova/forms.py:335 konova/forms.py:345 konova/forms.py:358 #: konova/forms.py:336 konova/forms.py:346 konova/forms.py:359
#: konova/forms.py:370 konova/forms.py:388 user/forms.py:38 #: konova/forms.py:371 konova/forms.py:389 user/forms.py:38
#, fuzzy #, fuzzy
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-12-16 09:17+0100\n" "POT-Creation-Date: 2022-01-05 14:04+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -329,7 +329,7 @@ msgstr "Automatisch generiert"
#: intervention/templates/intervention/detail/includes/documents.html:28 #: intervention/templates/intervention/detail/includes/documents.html:28
#: intervention/templates/intervention/detail/view.html:31 #: intervention/templates/intervention/detail/view.html:31
#: intervention/templates/intervention/report/report.html:12 #: intervention/templates/intervention/report/report.html:12
#: konova/forms.py:334 #: konova/forms.py:335
msgid "Title" msgid "Title"
msgstr "Bezeichnung" msgstr "Bezeichnung"
@ -356,7 +356,7 @@ msgstr "Kompensation XY; Flur ABC"
#: intervention/templates/intervention/detail/includes/documents.html:31 #: intervention/templates/intervention/detail/includes/documents.html:31
#: intervention/templates/intervention/detail/includes/payments.html:34 #: intervention/templates/intervention/detail/includes/payments.html:34
#: intervention/templates/intervention/detail/includes/revocation.html:38 #: intervention/templates/intervention/detail/includes/revocation.html:38
#: konova/forms.py:369 konova/templates/konova/comment_card.html:16 #: konova/forms.py:370 konova/templates/konova/includes/comment_card.html:16
msgid "Comment" msgid "Comment"
msgstr "Kommentar" msgstr "Kommentar"
@ -472,7 +472,7 @@ msgstr "Zahlung wird an diesem Datum erwartet"
#: compensation/forms/modalForms.py:62 compensation/forms/modalForms.py:239 #: compensation/forms/modalForms.py:62 compensation/forms/modalForms.py:239
#: compensation/forms/modalForms.py:317 intervention/forms/modalForms.py:152 #: compensation/forms/modalForms.py:317 intervention/forms/modalForms.py:152
#: konova/forms.py:371 #: konova/forms.py:372
msgid "Additional comment, maximum {} letters" msgid "Additional comment, maximum {} letters"
msgstr "Zusätzlicher Kommentar, maximal {} Zeichen" msgstr "Zusätzlicher Kommentar, maximal {} Zeichen"
@ -793,7 +793,7 @@ msgstr "Dokumente"
#: compensation/templates/compensation/detail/eco_account/includes/documents.html:14 #: compensation/templates/compensation/detail/eco_account/includes/documents.html:14
#: ema/templates/ema/detail/includes/documents.html:14 #: ema/templates/ema/detail/includes/documents.html:14
#: intervention/templates/intervention/detail/includes/documents.html:14 #: intervention/templates/intervention/detail/includes/documents.html:14
#: konova/forms.py:387 #: konova/forms.py:388
msgid "Add new document" msgid "Add new document"
msgstr "Neues Dokument hinzufügen" msgstr "Neues Dokument hinzufügen"
@ -1056,41 +1056,41 @@ msgstr "Kompensation {} hinzugefügt"
msgid "Compensation {} edited" msgid "Compensation {} edited"
msgstr "Kompensation {} bearbeitet" msgstr "Kompensation {} bearbeitet"
#: compensation/views/compensation.py:228 compensation/views/eco_account.py:307 #: compensation/views/compensation.py:230 compensation/views/eco_account.py:309
#: ema/views.py:181 intervention/views.py:474 #: ema/views.py:181 intervention/views.py:477
msgid "Log" msgid "Log"
msgstr "Log" msgstr "Log"
#: compensation/views/compensation.py:251 #: compensation/views/compensation.py:253
msgid "Compensation removed" msgid "Compensation removed"
msgstr "Kompensation entfernt" msgstr "Kompensation entfernt"
#: compensation/views/compensation.py:272 compensation/views/eco_account.py:459 #: compensation/views/compensation.py:274 compensation/views/eco_account.py:461
#: ema/views.py:348 intervention/views.py:129 #: ema/views.py:348 intervention/views.py:129
msgid "Document added" msgid "Document added"
msgstr "Dokument hinzugefügt" msgstr "Dokument hinzugefügt"
#: compensation/views/compensation.py:341 compensation/views/eco_account.py:353 #: compensation/views/compensation.py:343 compensation/views/eco_account.py:355
#: ema/views.py:286 #: ema/views.py:286
msgid "State added" msgid "State added"
msgstr "Zustand hinzugefügt" msgstr "Zustand hinzugefügt"
#: compensation/views/compensation.py:362 compensation/views/eco_account.py:374 #: compensation/views/compensation.py:364 compensation/views/eco_account.py:376
#: ema/views.py:307 #: ema/views.py:307
msgid "Action added" msgid "Action added"
msgstr "Maßnahme hinzugefügt" msgstr "Maßnahme hinzugefügt"
#: compensation/views/compensation.py:383 compensation/views/eco_account.py:439 #: compensation/views/compensation.py:385 compensation/views/eco_account.py:441
#: ema/views.py:328 #: ema/views.py:328
msgid "Deadline added" msgid "Deadline added"
msgstr "Frist/Termin hinzugefügt" msgstr "Frist/Termin hinzugefügt"
#: compensation/views/compensation.py:405 compensation/views/eco_account.py:396 #: compensation/views/compensation.py:407 compensation/views/eco_account.py:398
#: ema/views.py:418 #: ema/views.py:418
msgid "State removed" msgid "State removed"
msgstr "Zustand gelöscht" msgstr "Zustand gelöscht"
#: compensation/views/compensation.py:427 compensation/views/eco_account.py:418 #: compensation/views/compensation.py:429 compensation/views/eco_account.py:420
#: ema/views.py:440 #: ema/views.py:440
msgid "Action removed" msgid "Action removed"
msgstr "Maßnahme entfernt" msgstr "Maßnahme entfernt"
@ -1103,45 +1103,45 @@ msgstr "Ökokonto {} hinzugefügt"
msgid "Eco-Account {} edited" msgid "Eco-Account {} edited"
msgstr "Ökokonto {} bearbeitet" msgstr "Ökokonto {} bearbeitet"
#: compensation/views/eco_account.py:255 #: compensation/views/eco_account.py:257
msgid "Eco-account removed" msgid "Eco-account removed"
msgstr "Ökokonto entfernt" msgstr "Ökokonto entfernt"
#: compensation/views/eco_account.py:283 #: compensation/views/eco_account.py:285
msgid "Deduction removed" msgid "Deduction removed"
msgstr "Abbuchung entfernt" msgstr "Abbuchung entfernt"
#: compensation/views/eco_account.py:328 ema/views.py:261 #: compensation/views/eco_account.py:330 ema/views.py:261
#: intervention/views.py:516 #: intervention/views.py:519
msgid "{} unrecorded" msgid "{} unrecorded"
msgstr "{} entzeichnet" msgstr "{} entzeichnet"
#: compensation/views/eco_account.py:328 ema/views.py:261 #: compensation/views/eco_account.py:330 ema/views.py:261
#: intervention/views.py:516 #: intervention/views.py:519
msgid "{} recorded" msgid "{} recorded"
msgstr "{} verzeichnet" msgstr "{} verzeichnet"
#: compensation/views/eco_account.py:529 intervention/views.py:497 #: compensation/views/eco_account.py:531 intervention/views.py:500
msgid "Deduction added" msgid "Deduction added"
msgstr "Abbuchung hinzugefügt" msgstr "Abbuchung hinzugefügt"
#: compensation/views/eco_account.py:612 ema/views.py:516 #: compensation/views/eco_account.py:614 ema/views.py:516
#: intervention/views.py:372 #: intervention/views.py:375
msgid "{} has already been shared with you" msgid "{} has already been shared with you"
msgstr "{} wurde bereits für Sie freigegeben" msgstr "{} wurde bereits für Sie freigegeben"
#: compensation/views/eco_account.py:617 ema/views.py:521 #: compensation/views/eco_account.py:619 ema/views.py:521
#: intervention/views.py:377 #: intervention/views.py:380
msgid "{} has been shared with you" msgid "{} has been shared with you"
msgstr "{} ist nun für Sie freigegeben" msgstr "{} ist nun für Sie freigegeben"
#: compensation/views/eco_account.py:624 ema/views.py:528 #: compensation/views/eco_account.py:626 ema/views.py:528
#: intervention/views.py:384 #: intervention/views.py:387
msgid "Share link invalid" msgid "Share link invalid"
msgstr "Freigabelink ungültig" msgstr "Freigabelink ungültig"
#: compensation/views/eco_account.py:647 ema/views.py:551 #: compensation/views/eco_account.py:649 ema/views.py:551
#: intervention/views.py:407 #: intervention/views.py:410
msgid "Share settings updated" msgid "Share settings updated"
msgstr "Freigabe Einstellungen aktualisiert" msgstr "Freigabe Einstellungen aktualisiert"
@ -1333,7 +1333,7 @@ msgstr "Kompensationen und Zahlungen geprüft"
msgid "Run check" msgid "Run check"
msgstr "Prüfung vornehmen" msgstr "Prüfung vornehmen"
#: intervention/forms/modalForms.py:196 konova/forms.py:453 #: intervention/forms/modalForms.py:196 konova/forms.py:454
msgid "" msgid ""
"I, {} {}, confirm that all necessary control steps have been performed by " "I, {} {}, confirm that all necessary control steps have been performed by "
"myself." "myself."
@ -1472,31 +1472,31 @@ msgstr ""
msgid "Intervention {} added" msgid "Intervention {} added"
msgstr "Eingriff {} hinzugefügt" msgstr "Eingriff {} hinzugefügt"
#: intervention/views.py:243 #: intervention/views.py:245
msgid "This intervention has {} revocations" msgid "This intervention has {} revocations"
msgstr "Dem Eingriff liegen {} Widersprüche vor" msgstr "Dem Eingriff liegen {} Widersprüche vor"
#: intervention/views.py:290 #: intervention/views.py:293
msgid "Intervention {} edited" msgid "Intervention {} edited"
msgstr "Eingriff {} bearbeitet" msgstr "Eingriff {} bearbeitet"
#: intervention/views.py:325 #: intervention/views.py:328
msgid "{} removed" msgid "{} removed"
msgstr "{} entfernt" msgstr "{} entfernt"
#: intervention/views.py:346 #: intervention/views.py:349
msgid "Revocation removed" msgid "Revocation removed"
msgstr "Widerspruch entfernt" msgstr "Widerspruch entfernt"
#: intervention/views.py:428 #: intervention/views.py:431
msgid "Check performed" msgid "Check performed"
msgstr "Prüfung durchgeführt" msgstr "Prüfung durchgeführt"
#: intervention/views.py:450 #: intervention/views.py:453
msgid "Revocation added" msgid "Revocation added"
msgstr "Widerspruch hinzugefügt" msgstr "Widerspruch hinzugefügt"
#: intervention/views.py:521 #: intervention/views.py:524
msgid "There are errors on this intervention:" msgid "There are errors on this intervention:"
msgstr "Es liegen Fehler in diesem Eingriff vor:" msgstr "Es liegen Fehler in diesem Eingriff vor:"
@ -1525,11 +1525,11 @@ msgstr "Speichern"
msgid "Not editable" msgid "Not editable"
msgstr "Nicht editierbar" msgstr "Nicht editierbar"
#: konova/forms.py:138 konova/forms.py:307 #: konova/forms.py:138 konova/forms.py:308
msgid "Confirm" msgid "Confirm"
msgstr "Bestätige" msgstr "Bestätige"
#: konova/forms.py:150 konova/forms.py:316 #: konova/forms.py:150 konova/forms.py:317
msgid "Remove" msgid "Remove"
msgstr "Löschen" msgstr "Löschen"
@ -1542,56 +1542,56 @@ msgstr "Sie sind dabei {} {} zu löschen"
msgid "Geometry" msgid "Geometry"
msgstr "Geometrie" msgstr "Geometrie"
#: konova/forms.py:317 #: konova/forms.py:318
msgid "Are you sure?" msgid "Are you sure?"
msgstr "Sind Sie sicher?" msgstr "Sind Sie sicher?"
#: konova/forms.py:344 #: konova/forms.py:345
msgid "Created on" msgid "Created on"
msgstr "Erstellt" msgstr "Erstellt"
#: konova/forms.py:346 #: konova/forms.py:347
msgid "When has this file been created? Important for photos." msgid "When has this file been created? Important for photos."
msgstr "Wann wurde diese Datei erstellt oder das Foto aufgenommen?" msgstr "Wann wurde diese Datei erstellt oder das Foto aufgenommen?"
#: konova/forms.py:357 #: konova/forms.py:358
#: venv/lib/python3.7/site-packages/django/db/models/fields/files.py:231 #: venv/lib/python3.7/site-packages/django/db/models/fields/files.py:231
msgid "File" msgid "File"
msgstr "Datei" msgstr "Datei"
#: konova/forms.py:359 #: konova/forms.py:360
msgid "Allowed formats: pdf, jpg, png. Max size 15 MB." msgid "Allowed formats: pdf, jpg, png. Max size 15 MB."
msgstr "Formate: pdf, jpg, png. Maximal 15 MB." msgstr "Formate: pdf, jpg, png. Maximal 15 MB."
#: konova/forms.py:405 #: konova/forms.py:406
msgid "Unsupported file type" msgid "Unsupported file type"
msgstr "Dateiformat nicht unterstützt" msgstr "Dateiformat nicht unterstützt"
#: konova/forms.py:412 #: konova/forms.py:413
msgid "File too large" msgid "File too large"
msgstr "Datei zu groß" msgstr "Datei zu groß"
#: konova/forms.py:421 #: konova/forms.py:422
msgid "Added document" msgid "Added document"
msgstr "Dokument hinzugefügt" msgstr "Dokument hinzugefügt"
#: konova/forms.py:444 #: konova/forms.py:445
msgid "Confirm record" msgid "Confirm record"
msgstr "Verzeichnen bestätigen" msgstr "Verzeichnen bestätigen"
#: konova/forms.py:452 #: konova/forms.py:453
msgid "Record data" msgid "Record data"
msgstr "Daten verzeichnen" msgstr "Daten verzeichnen"
#: konova/forms.py:459 #: konova/forms.py:460
msgid "Confirm unrecord" msgid "Confirm unrecord"
msgstr "Entzeichnen bestätigen" msgstr "Entzeichnen bestätigen"
#: konova/forms.py:460 #: konova/forms.py:461
msgid "Unrecord data" msgid "Unrecord data"
msgstr "Daten entzeichnen" msgstr "Daten entzeichnen"
#: konova/forms.py:461 #: konova/forms.py:462
msgid "I, {} {}, confirm that this data must be unrecorded." msgid "I, {} {}, confirm that this data must be unrecorded."
msgstr "" msgstr ""
"Ich, {} {}, bestätige, dass diese Daten wieder entzeichnet werden müssen." "Ich, {} {}, bestätige, dass diese Daten wieder entzeichnet werden müssen."
@ -1663,6 +1663,30 @@ msgstr "Anzeigen"
msgid "Deduct" msgid "Deduct"
msgstr "Abbuchen" msgstr "Abbuchen"
#: konova/templates/konova/includes/parcels.html:3
msgid "Spatial reference"
msgstr "Raumreferenz"
#: konova/templates/konova/includes/parcels.html:9
msgid "Kreis"
msgstr "Kreis"
#: konova/templates/konova/includes/parcels.html:10
msgid "Gemarkung"
msgstr "Gemarkung"
#: konova/templates/konova/includes/parcels.html:11
msgid "Parcel"
msgstr "Flur"
#: konova/templates/konova/includes/parcels.html:12
msgid "Parcel counter"
msgstr "Flurstückzähler"
#: konova/templates/konova/includes/parcels.html:13
msgid "Parcel number"
msgstr "Flurstücknenner"
#: konova/templates/konova/widgets/generate-content-input.html:6 #: konova/templates/konova/widgets/generate-content-input.html:6
msgid "Generate new" msgid "Generate new"
msgstr "Neu generieren" msgstr "Neu generieren"
@ -1726,8 +1750,8 @@ msgid ""
"Action canceled. Eco account is recorded or deductions exist. Only " "Action canceled. Eco account is recorded or deductions exist. Only "
"conservation office member can perform this action." "conservation office member can perform this action."
msgstr "" msgstr ""
"Aktion abgebrochen. Ökokonto ist bereits verzeichnet oder Abbuchungen liegen vor. Nur " "Aktion abgebrochen. Ökokonto ist bereits verzeichnet oder Abbuchungen liegen "
"Eintragungsstellennutzer können diese Aktion jetzt durchführen." "vor. Nur Eintragungsstellennutzer können diese Aktion jetzt durchführen."
#: konova/utils/message_templates.py:25 #: konova/utils/message_templates.py:25
msgid "Edited general data" msgid "Edited general data"