From 48e3e84b4c6db8a5f9f1c8ac2fc7652f2f9475e5 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Thu, 21 Apr 2022 14:19:35 +0200 Subject: [PATCH 01/13] #151 Dynamic parcel table * refactors parcel table into a dynamic table, which does not show all content at once but rather supports pagination and a button which triggers loading of more content * adds translation --- .../detail/compensation/view.html | 2 +- .../compensation/detail/eco_account/view.html | 2 +- .../report/compensation/report.html | 2 +- .../report/eco_account/report.html | 2 +- ema/templates/ema/detail/view.html | 2 +- ema/templates/ema/report/report.html | 2 +- .../templates/intervention/detail/view.html | 2 +- .../templates/intervention/report/report.html | 2 +- .../parcels/parcel_table_content.html | 22 ++++++++++ .../parcel_table_frame.html} | 13 +----- .../includes/{ => parcels}/parcels.html | 0 konova/urls.py | 5 ++- konova/views.py | 41 +++++++++++++++++- locale/de/LC_MESSAGES/django.mo | Bin 42105 -> 42175 bytes locale/de/LC_MESSAGES/django.po | 28 +++++++----- 15 files changed, 91 insertions(+), 34 deletions(-) create mode 100644 konova/templates/konova/includes/parcels/parcel_table_content.html rename konova/templates/konova/includes/{parcel_table.html => parcels/parcel_table_frame.html} (75%) rename konova/templates/konova/includes/{ => parcels}/parcels.html (100%) diff --git a/compensation/templates/compensation/detail/compensation/view.html b/compensation/templates/compensation/detail/compensation/view.html index 80b5c0f0..8e1b1267 100644 --- a/compensation/templates/compensation/detail/compensation/view.html +++ b/compensation/templates/compensation/detail/compensation/view.html @@ -122,7 +122,7 @@ {% include 'map/geom_form.html' %}
- {% include 'konova/includes/parcels.html' %} + {% include 'konova/includes/parcels/parcels.html' %}
{% include 'konova/includes/comment_card.html' %} diff --git a/compensation/templates/compensation/detail/eco_account/view.html b/compensation/templates/compensation/detail/eco_account/view.html index 116b6670..0eb354fe 100644 --- a/compensation/templates/compensation/detail/eco_account/view.html +++ b/compensation/templates/compensation/detail/eco_account/view.html @@ -104,7 +104,7 @@ {% include 'map/geom_form.html' %}
- {% include 'konova/includes/parcels.html' %} + {% include 'konova/includes/parcels/parcels.html' %}
{% include 'konova/includes/comment_card.html' %} diff --git a/compensation/templates/compensation/report/compensation/report.html b/compensation/templates/compensation/report/compensation/report.html index 66205739..7088ff07 100644 --- a/compensation/templates/compensation/report/compensation/report.html +++ b/compensation/templates/compensation/report/compensation/report.html @@ -38,7 +38,7 @@ {% include 'map/geom_form.html' %}
- {% include 'konova/includes/parcels.html' %} + {% include 'konova/includes/parcels/parcels.html' %}
{% include 'konova/includes/report/qrcodes.html' %} diff --git a/compensation/templates/compensation/report/eco_account/report.html b/compensation/templates/compensation/report/eco_account/report.html index 823a30fb..a3632ee2 100644 --- a/compensation/templates/compensation/report/eco_account/report.html +++ b/compensation/templates/compensation/report/eco_account/report.html @@ -51,7 +51,7 @@ {% include 'map/geom_form.html' %}
- {% include 'konova/includes/parcels.html' %} + {% include 'konova/includes/parcels/parcels.html' %}
{% include 'konova/includes/report/qrcodes.html' %} diff --git a/ema/templates/ema/detail/view.html b/ema/templates/ema/detail/view.html index 020b7d4b..31d26e0b 100644 --- a/ema/templates/ema/detail/view.html +++ b/ema/templates/ema/detail/view.html @@ -90,7 +90,7 @@ {% include 'map/geom_form.html' %}
- {% include 'konova/includes/parcels.html' %} + {% include 'konova/includes/parcels/parcels.html' %}
{% include 'konova/includes/comment_card.html' %} diff --git a/ema/templates/ema/report/report.html b/ema/templates/ema/report/report.html index 40b11084..43b64865 100644 --- a/ema/templates/ema/report/report.html +++ b/ema/templates/ema/report/report.html @@ -38,7 +38,7 @@ {% include 'map/geom_form.html' %}
- {% include 'konova/includes/parcels.html' %} + {% include 'konova/includes/parcels/parcels.html' %}
{% include 'konova/includes/report/qrcodes.html' %} diff --git a/intervention/templates/intervention/detail/view.html b/intervention/templates/intervention/detail/view.html index c5f9b9c1..2d9628cd 100644 --- a/intervention/templates/intervention/detail/view.html +++ b/intervention/templates/intervention/detail/view.html @@ -137,7 +137,7 @@ {% include 'map/geom_form.html' %}
- {% include 'konova/includes/parcels.html' %} + {% include 'konova/includes/parcels/parcels.html' %}
{% include 'konova/includes/comment_card.html' %} diff --git a/intervention/templates/intervention/report/report.html b/intervention/templates/intervention/report/report.html index e6f13c35..6e238fa2 100644 --- a/intervention/templates/intervention/report/report.html +++ b/intervention/templates/intervention/report/report.html @@ -97,7 +97,7 @@ {% include 'map/geom_form.html' %}
- {% include 'konova/includes/parcels.html' %} + {% include 'konova/includes/parcels/parcels.html' %}
{% include 'konova/includes/report/qrcodes.html' %} diff --git a/konova/templates/konova/includes/parcels/parcel_table_content.html b/konova/templates/konova/includes/parcels/parcel_table_content.html new file mode 100644 index 00000000..0cb5ce11 --- /dev/null +++ b/konova/templates/konova/includes/parcels/parcel_table_content.html @@ -0,0 +1,22 @@ +{% load l10n i18n %} +{% for parcel in parcels %} + + {{parcel.parcel_group.name|default_if_none:"-"}} + {{parcel.parcel_group.key|default_if_none:"-"}} + {{parcel.flr|default_if_none:"-"|unlocalize}} + {{parcel.flrstck_zhlr|default_if_none:"-"|unlocalize}} + {{parcel.flrstck_nnr|default_if_none:"-"|unlocalize}} + +{% endfor %} +{% if next_page %} + + + + + +{% endif %} \ No newline at end of file diff --git a/konova/templates/konova/includes/parcel_table.html b/konova/templates/konova/includes/parcels/parcel_table_frame.html similarity index 75% rename from konova/templates/konova/includes/parcel_table.html rename to konova/templates/konova/includes/parcels/parcel_table_frame.html index 76503572..4b4a760d 100644 --- a/konova/templates/konova/includes/parcel_table.html +++ b/konova/templates/konova/includes/parcels/parcel_table_frame.html @@ -36,17 +36,8 @@ {% trans 'Parcel number' %} - - {% for parcel in parcels %} - - {{parcel.parcel_group.name|default_if_none:"-"}} - {{parcel.parcel_group.key|default_if_none:"-"}} - {{parcel.flr|default_if_none:"-"|unlocalize}} - {{parcel.flrstck_zhlr|default_if_none:"-"|unlocalize}} - {{parcel.flrstck_nnr|default_if_none:"-"|unlocalize}} - - {% endfor %} - + + {% include 'konova/includes/parcels/parcel_table_content.html' %} {% endif %} diff --git a/konova/templates/konova/includes/parcels.html b/konova/templates/konova/includes/parcels/parcels.html similarity index 100% rename from konova/templates/konova/includes/parcels.html rename to konova/templates/konova/includes/parcels/parcels.html diff --git a/konova/urls.py b/konova/urls.py index d2458f50..00386a11 100644 --- a/konova/urls.py +++ b/konova/urls.py @@ -24,7 +24,7 @@ from konova.autocompletes import EcoAccountAutocomplete, \ ShareTeamAutocomplete, HandlerCodeAutocomplete from konova.settings import SSO_SERVER, SSO_PUBLIC_KEY, SSO_PRIVATE_KEY, DEBUG from konova.sso.sso import KonovaSSOClient -from konova.views import logout_view, home_view, get_geom_parcels +from konova.views import logout_view, home_view, get_geom_parcels, get_geom_parcels_content sso_client = KonovaSSOClient(SSO_SERVER, SSO_PUBLIC_KEY, SSO_PRIVATE_KEY) urlpatterns = [ @@ -40,7 +40,8 @@ urlpatterns = [ path('cl/', include("codelist.urls")), path('analysis/', include("analysis.urls")), path('api/', include("api.urls")), - path('geom//parcels', get_geom_parcels, name="geometry-parcels"), + path('geom//parcels/', get_geom_parcels, name="geometry-parcels"), + path('geom//parcels/', get_geom_parcels_content, name="geometry-parcels-content"), # Autocomplete paths for all apps path("atcmplt/eco-accounts", EcoAccountAutocomplete.as_view(), name="accounts-autocomplete"), diff --git a/konova/views.py b/konova/views.py index 2fd5ff91..db830750 100644 --- a/konova/views.py +++ b/konova/views.py @@ -115,7 +115,7 @@ def get_geom_parcels(request: HttpRequest, id: str): # HTTP code 286 states that the HTMX should stop polling for updates # https://htmx.org/docs/#polling status_code = 286 - template = "konova/includes/parcel_table.html" + template = "konova/includes/parcels/parcel_table_frame.html" geom = get_object_or_404(Geometry, id=id) parcels = geom.get_underlying_parcels() geos_geom = geom.geom @@ -133,9 +133,18 @@ def get_geom_parcels(request: HttpRequest, id: str): parcels = parcels.order_by("-municipal", "flr", "flrstck_zhlr", "flrstck_nnr") municipals = parcels.order_by("municipal").distinct("municipal").values("municipal__id") municipals = Municipal.objects.filter(id__in=municipals) + + rpp = 50 + parcels = parcels[:rpp] + next_page = 1 + if len(parcels) < rpp: + next_page = None + context = { "parcels": parcels, "municipals": municipals, + "geom_id": str(id), + "next_page": next_page, } html = render_to_string(template, context, request) return HttpResponse(html, status=status_code) @@ -143,6 +152,36 @@ def get_geom_parcels(request: HttpRequest, id: str): return HttpResponse(None, status=404) +@login_required +def get_geom_parcels_content(request:HttpRequest, id: str, page: int): + if page < 0: + raise AssertionError("Parcel page can not be negative") + + # HTTP code 286 states that the HTMX should stop polling for updates + # https://htmx.org/docs/#polling + status_code = 286 + template = "konova/includes/parcels/parcel_table_content.html" + geom = get_object_or_404(Geometry, id=id) + parcels = geom.get_underlying_parcels() + + parcels = parcels.order_by("-municipal", "flr", "flrstck_zhlr", "flrstck_nnr") + rpp = 50 + from_p = rpp * (page-1) + to_p = rpp * (page) + next_page = page + 1 + parcels = parcels[from_p:to_p] + if len(parcels) < rpp: + next_page = None + + context = { + "parcels": parcels, + "geom_id": str(id), + "next_page": next_page, + } + html = render_to_string(template, context, request) + return HttpResponse(html, status=status_code) + + def get_404_view(request: HttpRequest, exception=None): """ Returns a 404 handling view diff --git a/locale/de/LC_MESSAGES/django.mo b/locale/de/LC_MESSAGES/django.mo index 9626e763ea04a135d76675baf28ba22d85ea7eea..4557506492ae0c22aef1fdb700430c20118e8ffa 100644 GIT binary patch delta 11797 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 diff --git a/locale/de/LC_MESSAGES/django.po b/locale/de/LC_MESSAGES/django.po index 2a78deb7..35ee2c5c 100644 --- a/locale/de/LC_MESSAGES/django.po +++ b/locale/de/LC_MESSAGES/django.po @@ -26,7 +26,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-04-19 13:28+0200\n" +"POT-Creation-Date: 2022-04-21 14:16+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -1582,7 +1582,7 @@ msgid "Search for file number" msgstr "Nach Aktenzeichen suchen" #: konova/filters/mixins.py:85 -#: konova/templates/konova/includes/parcel_table.html:13 +#: konova/templates/konova/includes/parcels/parcel_table_frame.html:13 msgid "District" msgstr "Kreis" @@ -1595,7 +1595,7 @@ msgid "Search for parcel gmrkng" msgstr "Nach Gemarkung suchen" #: konova/filters/mixins.py:111 -#: konova/templates/konova/includes/parcel_table.html:34 +#: konova/templates/konova/includes/parcels/parcel_table_frame.html:34 msgid "Parcel" msgstr "Flur" @@ -1604,7 +1604,7 @@ msgid "Search for parcel" msgstr "Nach Flur suchen" #: konova/filters/mixins.py:124 -#: konova/templates/konova/includes/parcel_table.html:35 +#: konova/templates/konova/includes/parcels/parcel_table_frame.html:35 msgid "Parcel counter" msgstr "Flurstückzähler" @@ -1613,7 +1613,7 @@ msgid "Search for parcel counter" msgstr "Nach Flurstückzähler suchen" #: konova/filters/mixins.py:138 -#: konova/templates/konova/includes/parcel_table.html:36 +#: konova/templates/konova/includes/parcels/parcel_table_frame.html:36 msgid "Parcel number" msgstr "Flurstücknenner" @@ -1748,33 +1748,37 @@ msgstr "" msgid "English" msgstr "" -#: konova/templates/konova/includes/parcel_table.html:5 +#: konova/templates/konova/includes/parcels/parcel_table_content.html:18 +msgid "Show more..." +msgstr "Mehr anzeigen..." + +#: konova/templates/konova/includes/parcels/parcel_table_frame.html:5 msgid "Parcels can not be calculated, since no geometry is given." msgstr "" "Flurstücke können nicht berechnet werden, da keine Geometrie eingegeben " "wurde." -#: konova/templates/konova/includes/parcel_table.html:11 +#: konova/templates/konova/includes/parcels/parcel_table_frame.html:11 msgid "Municipal" msgstr "Gemeinde" -#: konova/templates/konova/includes/parcel_table.html:12 +#: konova/templates/konova/includes/parcels/parcel_table_frame.html:12 msgid "Municipal key" msgstr "Gemeindeschlüssel" -#: konova/templates/konova/includes/parcel_table.html:14 +#: konova/templates/konova/includes/parcels/parcel_table_frame.html:14 msgid "District key" msgstr "Kreisschlüssel" -#: konova/templates/konova/includes/parcel_table.html:32 +#: konova/templates/konova/includes/parcels/parcel_table_frame.html:32 msgid "Parcel group" msgstr "Gemarkung" -#: konova/templates/konova/includes/parcel_table.html:33 +#: konova/templates/konova/includes/parcels/parcel_table_frame.html:33 msgid "Parcel group key" msgstr "Gemarkungsschlüssel" -#: konova/templates/konova/includes/parcels.html:7 +#: konova/templates/konova/includes/parcels/parcels.html:7 msgid "Spatial reference" msgstr "Raumreferenz" From 9c2bdcdacfe801952cda8c26eefd85324a29c25a Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Thu, 21 Apr 2022 14:36:55 +0200 Subject: [PATCH 02/13] #151 Parcel table infinite scroll * refactors button for further loading to infinite scroll * adds code documentation --- .../parcels/parcel_table_content.html | 40 +++++++++---------- .../includes/parcels/parcel_table_frame.html | 2 +- konova/views.py | 21 ++++++++-- 3 files changed, 38 insertions(+), 25 deletions(-) diff --git a/konova/templates/konova/includes/parcels/parcel_table_content.html b/konova/templates/konova/includes/parcels/parcel_table_content.html index 0cb5ce11..549a8092 100644 --- a/konova/templates/konova/includes/parcels/parcel_table_content.html +++ b/konova/templates/konova/includes/parcels/parcel_table_content.html @@ -1,22 +1,22 @@ {% load l10n i18n %} {% for parcel in parcels %} - - {{parcel.parcel_group.name|default_if_none:"-"}} - {{parcel.parcel_group.key|default_if_none:"-"}} - {{parcel.flr|default_if_none:"-"|unlocalize}} - {{parcel.flrstck_zhlr|default_if_none:"-"|unlocalize}} - {{parcel.flrstck_nnr|default_if_none:"-"|unlocalize}} - -{% endfor %} -{% if next_page %} - - - - - -{% endif %} \ No newline at end of file + {% if forloop.last and next_page %} + + {{parcel.parcel_group.name|default_if_none:"-"}} + {{parcel.parcel_group.key|default_if_none:"-"}} + {{parcel.flr|default_if_none:"-"|unlocalize}} + {{parcel.flrstck_zhlr|default_if_none:"-"|unlocalize}} + {{parcel.flrstck_nnr|default_if_none:"-"|unlocalize}} + + {% else %} + + {{parcel.parcel_group.name|default_if_none:"-"}} + {{parcel.parcel_group.key|default_if_none:"-"}} + {{parcel.flr|default_if_none:"-"|unlocalize}} + {{parcel.flrstck_zhlr|default_if_none:"-"|unlocalize}} + {{parcel.flrstck_nnr|default_if_none:"-"|unlocalize}} + + {% endif %} +{% endfor %} \ No newline at end of file diff --git a/konova/templates/konova/includes/parcels/parcel_table_frame.html b/konova/templates/konova/includes/parcels/parcel_table_frame.html index 4b4a760d..e3292004 100644 --- a/konova/templates/konova/includes/parcels/parcel_table_frame.html +++ b/konova/templates/konova/includes/parcels/parcel_table_frame.html @@ -36,7 +36,7 @@ {% trans 'Parcel number' %} - + {% include 'konova/includes/parcels/parcel_table_content.html' %} diff --git a/konova/views.py b/konova/views.py index db830750..97cb7d82 100644 --- a/konova/views.py +++ b/konova/views.py @@ -110,7 +110,7 @@ def get_geom_parcels(request: HttpRequest, id: str): id (str): The geometry's id Returns: - + A rendered piece of HTML """ # HTTP code 286 states that the HTMX should stop polling for updates # https://htmx.org/docs/#polling @@ -134,7 +134,7 @@ def get_geom_parcels(request: HttpRequest, id: str): municipals = parcels.order_by("municipal").distinct("municipal").values("municipal__id") municipals = Municipal.objects.filter(id__in=municipals) - rpp = 50 + rpp = 100 parcels = parcels[:rpp] next_page = 1 if len(parcels) < rpp: @@ -153,7 +153,20 @@ def get_geom_parcels(request: HttpRequest, id: str): @login_required -def get_geom_parcels_content(request:HttpRequest, id: str, page: int): +def get_geom_parcels_content(request: HttpRequest, id: str, page: int): + """ Getter for infinite scroll of HTMX + + Returns parcels of a specific page/slice of the found parcel set. + Implementation of infinite scroll htmx example: https://htmx.org/examples/infinite-scroll/ + + Args: + request (HttpRequest): The incoming request + id (str): The geometry's id + page (int): The requested page number + + Returns: + A rendered piece of HTML + """ if page < 0: raise AssertionError("Parcel page can not be negative") @@ -165,7 +178,7 @@ def get_geom_parcels_content(request:HttpRequest, id: str, page: int): parcels = geom.get_underlying_parcels() parcels = parcels.order_by("-municipal", "flr", "flrstck_zhlr", "flrstck_nnr") - rpp = 50 + rpp = 100 from_p = rpp * (page-1) to_p = rpp * (page) next_page = page + 1 From eb975cd3c5c201a24e8b1551da4c61c04b810741 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Mon, 25 Apr 2022 11:16:51 +0200 Subject: [PATCH 03/13] #149 Send on changes * changes trigger for sending data to EGON: on each new payment, edited payment or deleted payment action, the data will be sent to EGON instead only once on "recording" --- compensation/forms/modalForms.py | 1 + intervention/models/intervention.py | 4 ++- intervention/utils/egon_export.py | 40 ++++++++++++++++++----------- 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/compensation/forms/modalForms.py b/compensation/forms/modalForms.py index ebfb1ebd..8404c7ad 100644 --- a/compensation/forms/modalForms.py +++ b/compensation/forms/modalForms.py @@ -128,6 +128,7 @@ class EditPaymentModalForm(NewPaymentForm): payment.comment = self.cleaned_data.get("comment", None) payment.save() self.instance.mark_as_edited(self.user, self.request, edit_comment=PAYMENT_EDITED) + self.instance.send_data_to_egon() return payment diff --git a/intervention/models/intervention.py b/intervention/models/intervention.py index c215a139..dd15beb1 100644 --- a/intervention/models/intervention.py +++ b/intervention/models/intervention.py @@ -145,7 +145,6 @@ class Intervention(BaseObject, ShareableObjectMixin, RecordableObjectMixin, Chec def set_recorded(self, user: User) -> UserActionLogEntry: log_entry = super().set_recorded(user) self.add_log_entry_to_compensations(log_entry) - self.send_data_to_egon() return log_entry def add_log_entry_to_compensations(self, log_entry: UserActionLogEntry): @@ -183,6 +182,8 @@ class Intervention(BaseObject, ShareableObjectMixin, RecordableObjectMixin, Chec intervention=self, ) self.mark_as_edited(user, form.request, edit_comment=PAYMENT_ADDED) + + self.send_data_to_egon() return pay def add_revocation(self, form): @@ -347,6 +348,7 @@ class Intervention(BaseObject, ShareableObjectMixin, RecordableObjectMixin, Chec with transaction.atomic(): payment.delete() self.mark_as_edited(user, request=form.request, edit_comment=PAYMENT_REMOVED) + self.send_data_to_egon() class InterventionDocument(AbstractDocument): diff --git a/intervention/utils/egon_export.py b/intervention/utils/egon_export.py index 1ef9f727..14ea6b61 100644 --- a/intervention/utils/egon_export.py +++ b/intervention/utils/egon_export.py @@ -156,10 +156,20 @@ class EgonGmlBuilder: def build_gml(self): comp_type, comp_type_code = self._gen_kompensationsArt() - payment_date = self.intervention.payments.first().due_on - if payment_date is not None: + payment = self.intervention.payments.first() + payment_date = None + if payment is not None: + payment_date = payment.due_on payment_date = payment_date.strftime(DEFAULT_DATE_FORMAT) + cons_office = self.intervention.responsible.conservation_office + reg_office = self.intervention.responsible.registration_office + law = self.intervention.legal.laws.first() + process_type = self.intervention.legal.process_type + handler = self.intervention.responsible.handler + reg_date = self.intervention.legal.registration_date + bind_date = self.intervention.legal.binding_date + xml_dict = { "wfs:FeatureCollection": { "@xmlns:wfs": "http://www.opengis.net/wfs", @@ -174,12 +184,12 @@ class EgonGmlBuilder: "oneo:azZulassungsstelle": self.intervention.responsible.registration_file_number, "oneo:bemerkungZulassungsstelle": None, "oneo:eintragungsstelle": { - "@xlink:href": f"http://register.naturschutz.rlp.de/repository/services/referenzliste/907/{self.intervention.responsible.conservation_office.atom_id}", - "#text": self.intervention.responsible.conservation_office.long_name + "@xlink:href": f"http://register.naturschutz.rlp.de/repository/services/referenzliste/907/{cons_office.atom_id if cons_office else None}", + "#text": cons_office.long_name if cons_office else None }, "oneo:zulassungsstelle": { - "@xlink:href": f"http://register.naturschutz.rlp.de/repository/services/referenzliste/1053/{self.intervention.responsible.registration_office.atom_id}", - "#text": self.intervention.responsible.registration_office.long_name + "@xlink:href": f"http://register.naturschutz.rlp.de/repository/services/referenzliste/1053/{reg_office.atom_id if reg_office else None}", + "#text": reg_office.long_name if reg_office else None }, "oneo:ersatzzahlung": self._sum_all_payments(), "oneo:kompensationsart": { @@ -187,20 +197,20 @@ class EgonGmlBuilder: "#text": comp_type }, "oneo:verfahrensrecht": { - "@xlink:href": f"http://register.naturschutz.rlp.de/repository/services/referenzliste/1048/{self.intervention.legal.laws.first().atom_id}", - "#text": self.intervention.legal.laws.first().short_name + "@xlink:href": f"http://register.naturschutz.rlp.de/repository/services/referenzliste/1048/{law.atom_id if law else None}", + "#text": law.short_name if law else None }, "oneo:verfahrenstyp": { - "@xlink:href": f"http://register.naturschutz.rlp.de/repository/services/referenzliste/44382/{self.intervention.legal.process_type.atom_id}", - "#text": self.intervention.legal.process_type.long_name, + "@xlink:href": f"http://register.naturschutz.rlp.de/repository/services/referenzliste/44382/{process_type.atom_id if process_type else None}", + "#text": process_type.long_name if process_type else None, }, "oneo:eingreifer": { "oneo:Eingreifer": { "oneo:art": { - "@xlink:href": f"http://register.naturschutz.rlp.de/repository/services/referenzliste/1053/{self.intervention.responsible.handler.type.atom_id}", - "#text": self.intervention.responsible.handler.type.long_name, + "@xlink:href": f"http://register.naturschutz.rlp.de/repository/services/referenzliste/1053/{handler.type.atom_id if handler.type else None}", + "#text": handler.type.long_name if handler.type else None, }, - "oneo:bemerkung": self.intervention.responsible.handler.detail, + "oneo:bemerkung": handler.detail if handler else None, } }, "oneo:erfasser": { @@ -212,8 +222,8 @@ class EgonGmlBuilder: "oneo:zulassung": { "oneo:Zulassungstermin": { "oneo:bauBeginn": payment_date, - "oneo:erlass": self.intervention.legal.registration_date.strftime(DEFAULT_DATE_FORMAT), - "oneo:rechtsKraft": self.intervention.legal.binding_date.strftime(DEFAULT_DATE_FORMAT), + "oneo:erlass": reg_date.strftime(DEFAULT_DATE_FORMAT) if reg_date else None, + "oneo:rechtsKraft": bind_date.strftime(DEFAULT_DATE_FORMAT) if bind_date else None, } }, "oneo:geometrie": { From 989d256521adb3d72bfbd57e0c7f0915694f6ea0 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Mon, 25 Apr 2022 13:28:51 +0200 Subject: [PATCH 04/13] HOTFIX: EGON sending via API * adds EGON message triggering on API payment changes --- api/utils/serializer/v1/intervention.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/api/utils/serializer/v1/intervention.py b/api/utils/serializer/v1/intervention.py index 1ce2d684..af13c4a2 100644 --- a/api/utils/serializer/v1/intervention.py +++ b/api/utils/serializer/v1/intervention.py @@ -132,6 +132,7 @@ class InterventionAPISerializerV1(AbstractModelAPISerializerV1, id__in=payments ) obj.payments.set(payments) + obj.send_data_to_egon() return obj def create_model_from_json(self, json_model, user): @@ -197,7 +198,7 @@ class InterventionAPISerializerV1(AbstractModelAPISerializerV1, obj.legal.save() obj.save() - obj.mark_as_edited(user) + obj.mark_as_edited(user, edit_comment="API update") celery_update_parcels.delay(obj.geometry.id) From 339f0746813f909b12be13cb3a1229acdf5eba49 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Mon, 25 Apr 2022 13:47:07 +0200 Subject: [PATCH 05/13] HOTFIX: API * hardens atom_id input to be integer or string compatible --- api/utils/serializer/v1/serializer.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/api/utils/serializer/v1/serializer.py b/api/utils/serializer/v1/serializer.py index 23d1f692..9d3b9dfb 100644 --- a/api/utils/serializer/v1/serializer.py +++ b/api/utils/serializer/v1/serializer.py @@ -75,7 +75,10 @@ class AbstractModelAPISerializerV1(AbstractModelAPISerializer): Returns: """ - if json_str is None or len(json_str) == 0: + if json_str is None: + return None + json_str = str(json_str) + if len(json_str) == 0: return None code = KonovaCode.objects.get( atom_id=json_str, From 73c61e96f51e0211a0cd65afc1641d3f22a98766 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Wed, 27 Apr 2022 12:12:56 +0200 Subject: [PATCH 06/13] #156 Parcel WFS as geojson * refactors fetching of parcels via wfs from xml to json for easier and faster processing --- konova/models/geometry.py | 26 +++++++++++------- konova/utils/wfs/spatial.py | 54 ++++++++++++++++--------------------- 2 files changed, 39 insertions(+), 41 deletions(-) diff --git a/konova/models/geometry.py b/konova/models/geometry.py index a71a2afa..283f8508 100644 --- a/konova/models/geometry.py +++ b/konova/models/geometry.py @@ -113,32 +113,38 @@ class Geometry(BaseResource): _now = timezone.now() underlying_parcels = [] for result in fetched_parcels: - fetched_parcel = result[typename] + parcel_properties = result["properties"] # There could be parcels which include the word 'Flur', # which needs to be deleted and just keep the numerical values ## THIS CAN BE REMOVED IN THE FUTURE, WHEN 'Flur' WON'T OCCUR ANYMORE! - flr_val = fetched_parcel["ave:flur"].replace("Flur ", "") + flr_val = parcel_properties["flur"].replace("Flur ", "") district = District.objects.get_or_create( - key=fetched_parcel["ave:kreisschl"], - name=fetched_parcel["ave:kreis"], + key=parcel_properties["kreisschl"], + name=parcel_properties["kreis"], )[0] municipal = Municipal.objects.get_or_create( - key=fetched_parcel["ave:gmdschl"], - name=fetched_parcel["ave:gemeinde"], + key=parcel_properties["gmdschl"], + name=parcel_properties["gemeinde"], district=district, )[0] parcel_group = ParcelGroup.objects.get_or_create( - key=fetched_parcel["ave:gemaschl"], - name=fetched_parcel["ave:gemarkung"], + key=parcel_properties["gemaschl"], + name=parcel_properties["gemarkung"], municipal=municipal, )[0] + flrstck_nnr = parcel_properties['flstnrnen'] + if not flrstck_nnr: + flrstck_nnr = None + flrstck_zhlr = parcel_properties['flstnrzae'] + if not flrstck_zhlr: + flrstck_zhlr = None parcel_obj = Parcel.objects.get_or_create( district=district, municipal=municipal, parcel_group=parcel_group, flr=flr_val, - flrstck_nnr=fetched_parcel['ave:flstnrnen'], - flrstck_zhlr=fetched_parcel['ave:flstnrzae'], + flrstck_nnr=flrstck_nnr, + flrstck_zhlr=flrstck_zhlr, )[0] parcel_obj.district = district parcel_obj.updated_on = _now diff --git a/konova/utils/wfs/spatial.py b/konova/utils/wfs/spatial.py index 8a7bf360..2f1452d6 100644 --- a/konova/utils/wfs/spatial.py +++ b/konova/utils/wfs/spatial.py @@ -5,11 +5,12 @@ Contact: michel.peltriaux@sgdnord.rlp.de Created on: 17.12.21 """ +import json from abc import abstractmethod +from json import JSONDecodeError from time import sleep import requests -import xmltodict from django.contrib.gis.db.models.functions import AsGML, Transform from requests.auth import HTTPDigestAuth @@ -115,7 +116,7 @@ class ParcelWFSFetcher(AbstractWFSFetcher): geometry_operation, filter_srid ) - _filter = f'{spatial_filter}' + _filter = f'{spatial_filter}' return _filter def get_features(self, @@ -139,7 +140,7 @@ class ParcelWFSFetcher(AbstractWFSFetcher): Returns: features (list): A list of returned features """ - features = [] + found_features = [] while start_index is not None: post_body = self._create_post_data( spatial_operator, @@ -155,19 +156,11 @@ class ParcelWFSFetcher(AbstractWFSFetcher): ) content = response.content.decode("utf-8") - content = xmltodict.parse(content) - collection = content.get( - "wfs:FeatureCollection", - {}, - ) - - # Check if collection is an exception and does not contain the requested data - if len(collection) == 0: - exception = content.get( - "ows:ExceptionReport", - {} - ) - if len(exception) > 0 and rerun_on_exception: + try: + # Check if collection is an exception and does not contain the requested data + content = json.loads(content) + except JSONDecodeError as e: + if rerun_on_exception: # Wait a second before another try sleep(1) self.get_features( @@ -177,22 +170,21 @@ class ParcelWFSFetcher(AbstractWFSFetcher): start_index, rerun_on_exception=False ) - - members = collection.get( - "wfs:member", - None, - ) - if members is not None: - if len(members) > 1: - # extend feature list with found list of new feature members - features += members else: - # convert single found feature member into list and extent feature list - features += [members] + e.msg += content + raise e + fetched_features = content.get( + "features", + {}, + ) - if collection.get("@next", None) is not None: - start_index += self.count - else: + found_features += fetched_features + + if len(fetched_features) < self.count: + # The response was not 'full', so we got everything to fetch start_index = None + else: + # If a 'full' response returned, there might be more to fetch. Increase the start_index! + start_index += self.count - return features + return found_features From bb399571b1ce78ba4d1c36cd2573627710af9750 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Tue, 10 May 2022 15:07:21 +0200 Subject: [PATCH 07/13] Visual enhancement for custom JS tree widget * adds proper css behaviour for collapsed icon * adds minor js comments --- konova/static/css/konova.css | 11 ++++++++++- .../konova/widgets/checkbox-tree-select-content.html | 6 ++++-- .../konova/widgets/checkbox-tree-select.html | 3 +++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/konova/static/css/konova.css b/konova/static/css/konova.css index 7e7f3fd1..ed797046 100644 --- a/konova/static/css/konova.css +++ b/konova/static/css/konova.css @@ -262,4 +262,13 @@ Similar to bootstraps 'shadow-lg' padding-left: 2em; } - */ \ No newline at end of file + */ +.collapse-icn > i{ + transition: all 0.3s ease; +} +.collapsed .collapse-icn > i{ + transform: rotate(-90deg); +} +.tree-label.badge{ + font-size: 90%; +} \ No newline at end of file diff --git a/konova/templates/konova/widgets/checkbox-tree-select-content.html b/konova/templates/konova/widgets/checkbox-tree-select-content.html index 9bf57253..31599efa 100644 --- a/konova/templates/konova/widgets/checkbox-tree-select-content.html +++ b/konova/templates/konova/widgets/checkbox-tree-select-content.html @@ -2,11 +2,13 @@ {% for code in codes %}
- {% if not code.is_leaf %}
{% with code.children as codes %} - {% include 'konova/widgets/checkbox-tree-select-content.html' %} + {% include 'konova/widgets/tree/checkbox/checkbox-tree-select-content.html' %} {% endwith %}
{% endif %} diff --git a/konova/templates/konova/widgets/checkbox-tree-select.html b/konova/templates/konova/widgets/tree/checkbox/checkbox-tree-select.html similarity index 96% rename from konova/templates/konova/widgets/checkbox-tree-select.html rename to konova/templates/konova/widgets/tree/checkbox/checkbox-tree-select.html index 68e4321a..96269457 100644 --- a/konova/templates/konova/widgets/checkbox-tree-select.html +++ b/konova/templates/konova/widgets/tree/checkbox/checkbox-tree-select.html @@ -5,7 +5,7 @@
- {% include 'konova/widgets/checkbox-tree-select-content.html' %} + {% include 'konova/widgets/tree/checkbox/checkbox-tree-select-content.html' %}
\ No newline at end of file From a334fff54d7820f86bd9439056bcf902ad319fff Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Wed, 11 May 2022 08:41:37 +0200 Subject: [PATCH 09/13] WIP: JS Tree * simplifies js for single-select radio tree --- .../widgets/tree/radio/radio-tree-select.html | 24 +++++++------------ 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/konova/templates/konova/widgets/tree/radio/radio-tree-select.html b/konova/templates/konova/widgets/tree/radio/radio-tree-select.html index 87df9f2f..0c919c39 100644 --- a/konova/templates/konova/widgets/tree/radio/radio-tree-select.html +++ b/konova/templates/konova/widgets/tree/radio/radio-tree-select.html @@ -12,24 +12,16 @@ element = $(element); var cssClass = "badge rlp-r" - var directParent = element.closest(".tree-element-children") - var root = element.parents(".tree-element-children") + // Find all already tagged input elements and reset them to be untagged + var allTaggedInputs = $("#tree-root").find(".badge.rlp-r") + allTaggedInputs.removeClass(cssClass) - var otherCheckedInputsOfParent = directParent.find('.tree-input:checked'); - var otherCheckedInputsOfRoot = root.find('.tree-input:checked'); - - if(otherCheckedInputsOfParent.length == 0){ - var parentLabel = directParent.siblings(".tree-label"); - parentLabel.removeClass(cssClass) - if(otherCheckedInputsOfRoot.length == 0){ - var rootLabel = root.siblings(".tree-label") - rootLabel.removeClass(cssClass) - } - }else{ - var rootAndParentLabel = root.siblings(".tree-label"); - rootAndParentLabel.addClass(cssClass); - } + // Find all parents of selected element + var parentElements = element.parents(".tree-element-children") + // Tag parents of element + var parentLabels = parentElements.siblings(".tree-label"); + parentLabels.addClass(cssClass); } function changeHandler(event){ From 71afdd8b36b0dc013ece774225f248b456ab5d81 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Wed, 11 May 2022 10:16:34 +0200 Subject: [PATCH 10/13] JS Tree enhancement * extends compensation state forms to match the new logic * adds minor changes for tests --- compensation/forms/modalForms.py | 18 +++++++++++++++--- compensation/models/compensation.py | 6 +++++- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/compensation/forms/modalForms.py b/compensation/forms/modalForms.py index d129459d..581a7b3a 100644 --- a/compensation/forms/modalForms.py +++ b/compensation/forms/modalForms.py @@ -157,7 +157,7 @@ class NewStateModalForm(BaseModalForm): What has been on this area before changes/compensations have been applied and what will be the result ('after')? """ - biotope_type = forms.MultipleChoiceField( + biotope_type = forms.ChoiceField( label=_("Biotope Type"), label_suffix="", required=True, @@ -200,6 +200,16 @@ class NewStateModalForm(BaseModalForm): super().__init__(*args, **kwargs) self.form_title = _("New state") self.form_caption = _("Insert data for the new state") + choices = KonovaCode.objects.filter( + code_lists__in=[CODELIST_BIOTOPES_ID], + is_archived=False, + is_leaf=True, + ).values_list("id", flat=True) + choices = [ + (choice, choice) + for choice in choices + ] + self.fields["biotope_type"].choices = choices def save(self, is_before_state: bool = False): state = self.instance.add_state(self, is_before_state) @@ -262,8 +272,9 @@ class EditCompensationStateModalForm(NewStateModalForm): self.state = kwargs.pop("state", None) super().__init__(*args, **kwargs) self.form_title = _("Edit state") + biotope_type_id = self.state.biotope_type.id if self.state.biotope_type else None form_data = { - "biotope_type": self.state.biotope_type.id, + "biotope_type": biotope_type_id, "biotope_extra": self.state.biotope_type_details.all(), "surface": self.state.surface, } @@ -271,7 +282,8 @@ class EditCompensationStateModalForm(NewStateModalForm): def save(self, is_before_state: bool = False): state = self.state - state.biotope_type = self.cleaned_data.get("biotope_type", None) + biotope_type_id = self.cleaned_data.get("biotope_type", None) + state.biotope_type = KonovaCode.objects.get(id=biotope_type_id) state.biotope_type_details.set(self.cleaned_data.get("biotope_extra", [])) state.surface = self.cleaned_data.get("surface", None) state.save() diff --git a/compensation/models/compensation.py b/compensation/models/compensation.py index 3deff50a..3727e0c2 100644 --- a/compensation/models/compensation.py +++ b/compensation/models/compensation.py @@ -8,6 +8,8 @@ Created on: 16.11.21 import shutil from django.contrib import messages + +from codelist.models import KonovaCode from user.models import User, Team from django.db import models, transaction from django.db.models import QuerySet, Sum @@ -142,8 +144,10 @@ class AbstractCompensation(BaseObject, GeoReferencedMixin): """ form_data = form.cleaned_data with transaction.atomic(): + biotope_type_id = form_data["biotope_type"] + code = KonovaCode.objects.get(id=biotope_type_id) state = CompensationState.objects.create( - biotope_type=form_data["biotope_type"], + biotope_type=code, surface=form_data["surface"], ) state_additional_types = form_data["biotope_extra"] From d1dc61cbd795013b46c83954c517c50e5e39ac3f Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Wed, 11 May 2022 15:52:29 +0200 Subject: [PATCH 11/13] #160 Parcel number to parcel table * adds number of all underlying parcels into parcel table * reworks minor code parts of parcel related logic * fixes bug where under certain circumstances a parcel would have been added twice to a geometry * removes unused parcel fetching on intervention detail view --- intervention/views.py | 3 - konova/models/geometry.py | 13 +- konova/models/object.py | 17 +- .../includes/parcels/parcel_table_frame.html | 5 + konova/views.py | 2 + locale/de/LC_MESSAGES/django.mo | Bin 42175 -> 42171 bytes locale/de/LC_MESSAGES/django.po | 156 +++++++++--------- 7 files changed, 113 insertions(+), 83 deletions(-) diff --git a/intervention/views.py b/intervention/views.py index f882f214..15388dbf 100644 --- a/intervention/views.py +++ b/intervention/views.py @@ -266,14 +266,11 @@ def detail_view(request: HttpRequest, id: str): instance=intervention, ) - parcels = intervention.get_underlying_parcels() - context = { "obj": intervention, "compensations": compensations, "has_access": is_data_shared, "geom_form": geom_form, - "parcels": parcels, "is_default_member": in_group(_user, DEFAULT_GROUP), "is_zb_member": in_group(_user, ZB_GROUP), "is_ets_member": in_group(_user, ETS_GROUP), diff --git a/konova/models/geometry.py b/konova/models/geometry.py index 283f8508..ac1e91c7 100644 --- a/konova/models/geometry.py +++ b/konova/models/geometry.py @@ -152,6 +152,7 @@ class Geometry(BaseResource): underlying_parcels.append(parcel_obj) # Update the linked parcels + self.parcels.clear() self.parcels.set(underlying_parcels) # Set the calculated_on intermediate field, so this related data will be found on lookups @@ -172,7 +173,6 @@ class Geometry(BaseResource): Returns: parcels (QuerySet): The related parcels as queryset """ - parcels = self.parcels.filter( parcelintersection__calculated_on__isnull=False, ).prefetch_related( @@ -184,6 +184,17 @@ class Geometry(BaseResource): return parcels + def count_underlying_parcels(self): + """ Getter for number of underlying parcels + + Returns: + + """ + num_parcels = self.parcels.filter( + parcelintersection__calculated_on__isnull=False, + ).count() + return num_parcels + class GeometryConflict(UuidModel): """ diff --git a/konova/models/object.py b/konova/models/object.py index a1cff71b..780a0c2f 100644 --- a/konova/models/object.py +++ b/konova/models/object.py @@ -652,10 +652,21 @@ class GeoReferencedMixin(models.Model): Returns: parcels (Iterable): An empty list or a Queryset """ + result = [] if self.geometry is not None: - return self.geometry.get_underlying_parcels() - else: - return [] + result = self.geometry.get_underlying_parcels() + return result + + def count_underlying_parcels(self): + """ Getter for number of underlying parcels + + Returns: + + """ + result = 0 + if self.geometry is not None: + result = self.geometry.count_underlying_parcels() + return result def set_geometry_conflict_message(self, request: HttpRequest): if self.geometry is None: diff --git a/konova/templates/konova/includes/parcels/parcel_table_frame.html b/konova/templates/konova/includes/parcels/parcel_table_frame.html index e3292004..21b75b76 100644 --- a/konova/templates/konova/includes/parcels/parcel_table_frame.html +++ b/konova/templates/konova/includes/parcels/parcel_table_frame.html @@ -5,6 +5,11 @@ {% trans 'Parcels can not be calculated, since no geometry is given.' %} {% else %} +
+

+ {{num_parcels}} + {% trans 'Parcels found' %}

+
diff --git a/konova/views.py b/konova/views.py index 97cb7d82..001ed57d 100644 --- a/konova/views.py +++ b/konova/views.py @@ -135,12 +135,14 @@ def get_geom_parcels(request: HttpRequest, id: str): municipals = Municipal.objects.filter(id__in=municipals) rpp = 100 + num_all_parcels = parcels.count() parcels = parcels[:rpp] next_page = 1 if len(parcels) < rpp: next_page = None context = { + "num_parcels": num_all_parcels, "parcels": parcels, "municipals": municipals, "geom_id": str(id), diff --git a/locale/de/LC_MESSAGES/django.mo b/locale/de/LC_MESSAGES/django.mo index 4557506492ae0c22aef1fdb700430c20118e8ffa..3ad3ba93f9b9757af8f547efa515d891c9a213c0 100644 GIT binary patch delta 6990 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 delta 6979 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, YEAR. # -#: compensation/filters.py:123 compensation/forms/modalForms.py:36 -#: compensation/forms/modalForms.py:47 compensation/forms/modalForms.py:63 -#: compensation/forms/modalForms.py:358 compensation/forms/modalForms.py:466 +#: compensation/filters.py:123 compensation/forms/modalForms.py:37 +#: compensation/forms/modalForms.py:48 compensation/forms/modalForms.py:64 +#: compensation/forms/modalForms.py:362 compensation/forms/modalForms.py:470 #: intervention/forms/forms.py:54 intervention/forms/forms.py:174 #: intervention/forms/forms.py:186 intervention/forms/modalForms.py:150 #: intervention/forms/modalForms.py:163 intervention/forms/modalForms.py:176 @@ -26,7 +26,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-04-21 14:16+0200\n" +"POT-Creation-Date: 2022-05-11 13:41+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -97,7 +97,7 @@ msgstr "" #: analysis/templates/analysis/reports/includes/eco_account/amount.html:3 #: analysis/templates/analysis/reports/includes/intervention/amount.html:3 #: analysis/templates/analysis/reports/includes/old_data/amount.html:3 -#: compensation/forms/modalForms.py:450 +#: compensation/forms/modalForms.py:454 #: compensation/templates/compensation/detail/eco_account/includes/deductions.html:34 #: intervention/templates/intervention/detail/includes/deductions.html:31 msgid "Amount" @@ -215,7 +215,7 @@ msgstr "Abbuchungen" #: analysis/templates/analysis/reports/includes/eco_account/deductions.html:9 #: analysis/templates/analysis/reports/includes/eco_account/deductions.html:11 -#: compensation/forms/modalForms.py:195 +#: compensation/forms/modalForms.py:187 #: compensation/templates/compensation/detail/compensation/includes/states-after.html:36 #: compensation/templates/compensation/detail/compensation/includes/states-before.html:36 #: compensation/templates/compensation/detail/eco_account/includes/states-after.html:36 @@ -248,7 +248,7 @@ msgid "Compensation" msgstr "Kompensation" #: analysis/templates/analysis/reports/includes/intervention/compensated_by.html:21 -#: compensation/forms/modalForms.py:76 +#: compensation/forms/modalForms.py:77 msgid "Payment" msgstr "Zahlung" @@ -354,8 +354,8 @@ msgstr "Aussagekräftiger Titel" msgid "Compensation XY; Location ABC" msgstr "Kompensation XY; Flur ABC" -#: compensation/forms/forms.py:57 compensation/forms/modalForms.py:62 -#: compensation/forms/modalForms.py:357 compensation/forms/modalForms.py:465 +#: compensation/forms/forms.py:57 compensation/forms/modalForms.py:63 +#: compensation/forms/modalForms.py:361 compensation/forms/modalForms.py:469 #: compensation/templates/compensation/detail/compensation/includes/actions.html:35 #: compensation/templates/compensation/detail/compensation/includes/deadlines.html:34 #: compensation/templates/compensation/detail/compensation/includes/documents.html:34 @@ -373,7 +373,7 @@ msgstr "Kompensation XY; Flur ABC" msgid "Comment" msgstr "Kommentar" -#: compensation/forms/forms.py:59 compensation/forms/modalForms.py:467 +#: compensation/forms/forms.py:59 compensation/forms/modalForms.py:471 #: intervention/forms/forms.py:200 msgid "Additional comment" msgstr "Zusätzlicher Kommentar" @@ -479,70 +479,70 @@ msgstr "Ökokonto XY; Flur ABC" msgid "Edit Eco-Account" msgstr "Ökokonto bearbeiten" -#: compensation/forms/modalForms.py:37 +#: compensation/forms/modalForms.py:38 msgid "in Euro" msgstr "in Euro" -#: compensation/forms/modalForms.py:46 +#: compensation/forms/modalForms.py:47 #: intervention/templates/intervention/detail/includes/payments.html:31 msgid "Due on" msgstr "Fällig am" -#: compensation/forms/modalForms.py:49 +#: compensation/forms/modalForms.py:50 msgid "Due on which date" msgstr "Zahlung wird an diesem Datum erwartet" -#: compensation/forms/modalForms.py:64 compensation/forms/modalForms.py:359 +#: compensation/forms/modalForms.py:65 compensation/forms/modalForms.py:363 #: intervention/forms/modalForms.py:177 konova/forms.py:429 msgid "Additional comment, maximum {} letters" msgstr "Zusätzlicher Kommentar, maximal {} Zeichen" -#: compensation/forms/modalForms.py:77 +#: compensation/forms/modalForms.py:78 msgid "Add a payment for intervention '{}'" msgstr "Neue Ersatzzahlung zu Eingriff '{}' hinzufügen" -#: compensation/forms/modalForms.py:97 +#: compensation/forms/modalForms.py:98 msgid "If there is no date you can enter, please explain why." msgstr "Falls Sie kein Datum angeben können, erklären Sie bitte weshalb." -#: compensation/forms/modalForms.py:116 +#: compensation/forms/modalForms.py:117 #: intervention/templates/intervention/detail/includes/payments.html:59 msgid "Edit payment" msgstr "Zahlung bearbeiten" -#: compensation/forms/modalForms.py:159 compensation/forms/modalForms.py:171 +#: compensation/forms/modalForms.py:161 msgid "Biotope Type" msgstr "Biotoptyp" -#: compensation/forms/modalForms.py:162 +#: compensation/forms/modalForms.py:164 msgid "Select the biotope type" msgstr "Biotoptyp wählen" -#: compensation/forms/modalForms.py:176 compensation/forms/modalForms.py:188 +#: compensation/forms/modalForms.py:168 compensation/forms/modalForms.py:180 msgid "Biotope additional type" msgstr "Zusatzbezeichnung" -#: compensation/forms/modalForms.py:179 +#: compensation/forms/modalForms.py:171 msgid "Select an additional biotope type" msgstr "Zusatzbezeichnung wählen" -#: compensation/forms/modalForms.py:198 intervention/forms/modalForms.py:366 +#: compensation/forms/modalForms.py:190 intervention/forms/modalForms.py:366 msgid "in m²" msgstr "" -#: compensation/forms/modalForms.py:209 +#: compensation/forms/modalForms.py:201 msgid "New state" msgstr "Neuer Zustand" -#: compensation/forms/modalForms.py:210 +#: compensation/forms/modalForms.py:202 msgid "Insert data for the new state" msgstr "Geben Sie die Daten des neuen Zustandes ein" -#: compensation/forms/modalForms.py:217 konova/forms.py:227 +#: compensation/forms/modalForms.py:219 konova/forms.py:227 msgid "Object removed" msgstr "Objekt entfernt" -#: compensation/forms/modalForms.py:272 +#: compensation/forms/modalForms.py:274 #: compensation/templates/compensation/detail/compensation/includes/states-after.html:62 #: compensation/templates/compensation/detail/compensation/includes/states-before.html:62 #: compensation/templates/compensation/detail/eco_account/includes/states-after.html:62 @@ -552,15 +552,15 @@ msgstr "Objekt entfernt" msgid "Edit state" msgstr "Zustand bearbeiten" -#: compensation/forms/modalForms.py:329 +#: compensation/forms/modalForms.py:333 msgid "Deadline Type" msgstr "Fristart" -#: compensation/forms/modalForms.py:332 +#: compensation/forms/modalForms.py:336 msgid "Select the deadline type" msgstr "Fristart wählen" -#: compensation/forms/modalForms.py:341 +#: compensation/forms/modalForms.py:345 #: compensation/templates/compensation/detail/compensation/includes/deadlines.html:31 #: compensation/templates/compensation/detail/eco_account/includes/deadlines.html:31 #: ema/templates/ema/detail/includes/deadlines.html:31 @@ -568,30 +568,30 @@ msgstr "Fristart wählen" msgid "Date" msgstr "Datum" -#: compensation/forms/modalForms.py:344 +#: compensation/forms/modalForms.py:348 msgid "Select date" msgstr "Datum wählen" -#: compensation/forms/modalForms.py:371 +#: compensation/forms/modalForms.py:375 msgid "New deadline" msgstr "Neue Frist" -#: compensation/forms/modalForms.py:372 +#: compensation/forms/modalForms.py:376 msgid "Insert data for the new deadline" msgstr "Geben Sie die Daten der neuen Frist ein" -#: compensation/forms/modalForms.py:385 +#: compensation/forms/modalForms.py:389 #: compensation/templates/compensation/detail/compensation/includes/deadlines.html:59 #: compensation/templates/compensation/detail/eco_account/includes/deadlines.html:57 #: ema/templates/ema/detail/includes/deadlines.html:57 msgid "Edit deadline" msgstr "Frist/Termin bearbeiten" -#: compensation/forms/modalForms.py:413 +#: compensation/forms/modalForms.py:417 msgid "Action Type" msgstr "Maßnahmentyp" -#: compensation/forms/modalForms.py:416 +#: compensation/forms/modalForms.py:420 msgid "" "An action can consist of multiple different action types. All the selected " "action types are expected to be performed according to the amount and unit " @@ -601,35 +601,35 @@ msgstr "" "hier gewählten Einträge sollen mit der weiter unten angegebenen Einheit und " "Menge umgesetzt werden. " -#: compensation/forms/modalForms.py:421 compensation/forms/modalForms.py:433 +#: compensation/forms/modalForms.py:425 compensation/forms/modalForms.py:437 msgid "Action Type detail" msgstr "Zusatzmerkmal" -#: compensation/forms/modalForms.py:424 +#: compensation/forms/modalForms.py:428 msgid "Select the action type detail" msgstr "Zusatzmerkmal wählen" -#: compensation/forms/modalForms.py:438 +#: compensation/forms/modalForms.py:442 msgid "Unit" msgstr "Einheit" -#: compensation/forms/modalForms.py:441 +#: compensation/forms/modalForms.py:445 msgid "Select the unit" msgstr "Einheit wählen" -#: compensation/forms/modalForms.py:453 +#: compensation/forms/modalForms.py:457 msgid "Insert the amount" msgstr "Menge eingeben" -#: compensation/forms/modalForms.py:478 +#: compensation/forms/modalForms.py:482 msgid "New action" msgstr "Neue Maßnahme" -#: compensation/forms/modalForms.py:479 +#: compensation/forms/modalForms.py:483 msgid "Insert data for the new action" msgstr "Geben Sie die Daten der neuen Maßnahme ein" -#: compensation/forms/modalForms.py:503 +#: compensation/forms/modalForms.py:507 #: compensation/templates/compensation/detail/compensation/includes/actions.html:68 #: compensation/templates/compensation/detail/eco_account/includes/actions.html:67 #: ema/templates/ema/detail/includes/actions.html:65 @@ -1150,17 +1150,17 @@ msgid "Compensation {} edited" msgstr "Kompensation {} bearbeitet" #: compensation/views/compensation.py:182 compensation/views/eco_account.py:173 -#: ema/views.py:240 intervention/views.py:335 +#: ema/views.py:240 intervention/views.py:334 msgid "Edit {}" msgstr "Bearbeite {}" #: compensation/views/compensation.py:261 compensation/views/eco_account.py:359 -#: ema/views.py:194 intervention/views.py:539 +#: ema/views.py:194 intervention/views.py:538 msgid "Log" msgstr "Log" #: compensation/views/compensation.py:605 compensation/views/eco_account.py:727 -#: ema/views.py:558 intervention/views.py:685 +#: ema/views.py:558 intervention/views.py:684 msgid "Report {}" msgstr "Bericht {}" @@ -1181,32 +1181,32 @@ msgid "Eco-account removed" msgstr "Ökokonto entfernt" #: compensation/views/eco_account.py:380 ema/views.py:282 -#: intervention/views.py:638 +#: intervention/views.py:637 msgid "{} unrecorded" msgstr "{} entzeichnet" #: compensation/views/eco_account.py:380 ema/views.py:282 -#: intervention/views.py:638 +#: intervention/views.py:637 msgid "{} recorded" msgstr "{} verzeichnet" #: compensation/views/eco_account.py:804 ema/views.py:628 -#: intervention/views.py:436 +#: intervention/views.py:435 msgid "{} has already been shared with you" msgstr "{} wurde bereits für Sie freigegeben" #: compensation/views/eco_account.py:809 ema/views.py:633 -#: intervention/views.py:441 +#: intervention/views.py:440 msgid "{} has been shared with you" msgstr "{} ist nun für Sie freigegeben" #: compensation/views/eco_account.py:816 ema/views.py:640 -#: intervention/views.py:448 +#: intervention/views.py:447 msgid "Share link invalid" msgstr "Freigabelink ungültig" #: compensation/views/eco_account.py:839 ema/views.py:663 -#: intervention/views.py:471 +#: intervention/views.py:470 msgid "Share settings updated" msgstr "Freigabe Einstellungen aktualisiert" @@ -1312,7 +1312,7 @@ msgstr "Datum Zulassung bzw. Satzungsbeschluss" msgid "Binding on" msgstr "Datum Bestandskraft" -#: intervention/forms/forms.py:211 intervention/views.py:95 +#: intervention/forms/forms.py:211 intervention/views.py:97 msgid "New intervention" msgstr "Neuer Eingriff" @@ -1532,27 +1532,27 @@ msgstr "" "Kein Ausgleich jeglicher Art gefunden (Kompensation, Ersatzzahlung, " "Abbuchung)" -#: intervention/views.py:52 +#: intervention/views.py:54 msgid "Interventions - Overview" msgstr "Eingriffe - Übersicht" -#: intervention/views.py:85 +#: intervention/views.py:87 msgid "Intervention {} added" msgstr "Eingriff {} hinzugefügt" -#: intervention/views.py:323 +#: intervention/views.py:322 msgid "Intervention {} edited" msgstr "Eingriff {} bearbeitet" -#: intervention/views.py:359 +#: intervention/views.py:358 msgid "{} removed" msgstr "{} entfernt" -#: intervention/views.py:492 +#: intervention/views.py:491 msgid "Check performed" msgstr "Prüfung durchgeführt" -#: intervention/views.py:643 +#: intervention/views.py:642 msgid "There are errors on this intervention:" msgstr "Es liegen Fehler in diesem Eingriff vor:" @@ -1582,7 +1582,7 @@ msgid "Search for file number" msgstr "Nach Aktenzeichen suchen" #: konova/filters/mixins.py:85 -#: konova/templates/konova/includes/parcels/parcel_table_frame.html:13 +#: konova/templates/konova/includes/parcels/parcel_table_frame.html:18 msgid "District" msgstr "Kreis" @@ -1595,7 +1595,7 @@ msgid "Search for parcel gmrkng" msgstr "Nach Gemarkung suchen" #: konova/filters/mixins.py:111 -#: konova/templates/konova/includes/parcels/parcel_table_frame.html:34 +#: konova/templates/konova/includes/parcels/parcel_table_frame.html:39 msgid "Parcel" msgstr "Flur" @@ -1604,7 +1604,7 @@ msgid "Search for parcel" msgstr "Nach Flur suchen" #: konova/filters/mixins.py:124 -#: konova/templates/konova/includes/parcels/parcel_table_frame.html:35 +#: konova/templates/konova/includes/parcels/parcel_table_frame.html:40 msgid "Parcel counter" msgstr "Flurstückzähler" @@ -1613,7 +1613,7 @@ msgid "Search for parcel counter" msgstr "Nach Flurstückzähler suchen" #: konova/filters/mixins.py:138 -#: konova/templates/konova/includes/parcels/parcel_table_frame.html:36 +#: konova/templates/konova/includes/parcels/parcel_table_frame.html:41 msgid "Parcel number" msgstr "Flurstücknenner" @@ -1748,10 +1748,6 @@ msgstr "" msgid "English" msgstr "" -#: konova/templates/konova/includes/parcels/parcel_table_content.html:18 -msgid "Show more..." -msgstr "Mehr anzeigen..." - #: konova/templates/konova/includes/parcels/parcel_table_frame.html:5 msgid "Parcels can not be calculated, since no geometry is given." msgstr "" @@ -1759,22 +1755,26 @@ msgstr "" "wurde." #: konova/templates/konova/includes/parcels/parcel_table_frame.html:11 +msgid "Parcels found" +msgstr "Flurstücke" + +#: konova/templates/konova/includes/parcels/parcel_table_frame.html:16 msgid "Municipal" msgstr "Gemeinde" -#: konova/templates/konova/includes/parcels/parcel_table_frame.html:12 +#: konova/templates/konova/includes/parcels/parcel_table_frame.html:17 msgid "Municipal key" msgstr "Gemeindeschlüssel" -#: konova/templates/konova/includes/parcels/parcel_table_frame.html:14 +#: konova/templates/konova/includes/parcels/parcel_table_frame.html:19 msgid "District key" msgstr "Kreisschlüssel" -#: konova/templates/konova/includes/parcels/parcel_table_frame.html:32 +#: konova/templates/konova/includes/parcels/parcel_table_frame.html:37 msgid "Parcel group" msgstr "Gemarkung" -#: konova/templates/konova/includes/parcels/parcel_table_frame.html:33 +#: konova/templates/konova/includes/parcels/parcel_table_frame.html:38 msgid "Parcel group key" msgstr "Gemarkungsschlüssel" @@ -1808,11 +1808,6 @@ msgstr "Im Browser öffnen" msgid "View in LANIS" msgstr "In LANIS öffnen" -#: konova/templates/konova/widgets/checkbox-tree-select.html:4 -#: templates/generic_index.html:56 -msgid "Search" -msgstr "Suchen" - #: konova/templates/konova/widgets/generate-content-input.html:6 msgid "Generate new" msgstr "Neu generieren" @@ -1825,6 +1820,12 @@ msgstr "In Zwischenablage kopieren" msgid "Copied to clipboard" msgstr "In Zwischenablage kopiert" +#: konova/templates/konova/widgets/tree/checkbox/checkbox-tree-select.html:4 +#: konova/templates/konova/widgets/tree/radio/radio-tree-select.html:4 +#: templates/generic_index.html:56 +msgid "Search" +msgstr "Suchen" + #: konova/utils/mailer.py:68 konova/utils/mailer.py:137 msgid "{} - Shared access removed" msgstr "{} - Zugriff entzogen" @@ -4245,6 +4246,9 @@ msgstr "" msgid "Unable to connect to qpid with SASL mechanism %s" msgstr "" +#~ msgid "Show more..." +#~ msgstr "Mehr anzeigen..." + #~ msgid "Kreis" #~ msgstr "Kreis" From e73b7633a3c5c7cefe1f3006773e84521aad0d33 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Wed, 11 May 2022 16:03:53 +0200 Subject: [PATCH 12/13] #160 Parcel calc fix * fixes minor bug where invalid geometry (self intersecting) could not be used properly as input for WFS parcel intersection calculation * future enhancements regarding map client will make sure invalid geometries can not be added in the first place --- konova/utils/wfs/spatial.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/konova/utils/wfs/spatial.py b/konova/utils/wfs/spatial.py index 2f1452d6..e6cae847 100644 --- a/konova/utils/wfs/spatial.py +++ b/konova/utils/wfs/spatial.py @@ -11,7 +11,7 @@ from json import JSONDecodeError from time import sleep import requests -from django.contrib.gis.db.models.functions import AsGML, Transform +from django.contrib.gis.db.models.functions import AsGML, Transform, MakeValid from requests.auth import HTTPDigestAuth from konova.settings import DEFAULT_SRID_RLP, PARCEL_WFS_USER, PARCEL_WFS_PW, PROXIES @@ -91,7 +91,7 @@ class ParcelWFSFetcher(AbstractWFSFetcher): ).annotate( transformed=Transform(srid=filter_srid, expression="geom") ).annotate( - gml=AsGML('transformed') + gml=AsGML(MakeValid('transformed')) ).first().gml spatial_filter = f"<{geometry_operation}>{self.geometry_property_name}{geom_gml}" return spatial_filter From 9f32c2fdd9bd74a39e201c153f3bdaf04cab0094 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Mon, 23 May 2022 15:36:28 +0200 Subject: [PATCH 13/13] #164 Retranslating * retranslates Bestandskraftdatum --- locale/de/LC_MESSAGES/django.mo | Bin 42171 -> 42213 bytes locale/de/LC_MESSAGES/django.po | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/locale/de/LC_MESSAGES/django.mo b/locale/de/LC_MESSAGES/django.mo index 3ad3ba93f9b9757af8f547efa515d891c9a213c0..fd65919aecc67a938a81e04d655b90f05ec01ecb 100644 GIT binary patch delta 4457 zcmYk;dsNm%9>?(s5L7~ZxF|yCqXZfXDk~`JQI<$FsnArs9TQE(cqF;4O4%#kI zwtX0Or#=BAFyA>7`%qt8YCO|Kp@xPSj1Jg=LokZ^Sk%Cqa5&Dxc&x)j+>3E|%(b6$ z{^r`FSJ-~TP=ViwS~!4xas3L@A3YnXz^up4&ZOW27DV6S(lF_9FGq5?UIituyP&i;!%F><9%Z9E23Pe(1B zf!AV=a|!mK{s8J|wz>LV=Rr)M{V*yp?+gVkcm;J+x!whu2^UYT*qS zh7Y3_+=;#MY4l+$YTUc14SbBsz!#{DeuMNU{}py(ALJmK;&RkP^{Bv_ zoCncI{aw5c|AYN8q|(llgbH*#hGHHnu&LNj>(8d3g)300t;ZXMv#3aqq9!_xO8sZ3 zyYVe{yNY|T$}SMS+V=OOj$)K^5^BELsPSdk2iM>rY*DI0`3 zt1+lEoPc@_Q&Bsbi$Pd|8dr+Cyp=c_SE2663#f6gqZa-EHUF2W0KDHQWKjrOYbVM^ zJ(Itp7MhIO(JWLz#i%daG8~HmycM6psdyO`Q2sr}q~b03cdWr&3?t(k@J4(^@Bb79 zeM)QZHD)lrjH;hQMc!kbz1?xB9SuaiiVW0c%*RArfpJ)eI;v*84ckyVO}NjtC!>yf zJo@zh3%d$@Xwc6ORnA6KCR$NDKH_`>wZJ>5l(suNQT;>K+Xcc=nHYfD$Y5s{Y9lvb zFzcIH6!Z+|x*ry!c36cNf}p= z>Sr;R`pox_ z%R(JZ4i3WtOv5#pj?dt5JmXQ&mn`%F{>0)KoP^sj13yIt*sIP4G5~X^XJ8Mk#1Xg_ zC*lF@jz2mtVmx)7pE8wz%D5jj-pg=>@u(C|LM=EC3o(Gh~ooQ=QloFQMiS*=qmMiNIv)spw;UQ%FHOT7-HwWvJ&@feN4wmGV6p zfrs4hZ($VmcGNTOL@oR)>TG{Ur9AXuw=nvsr=sQ`kDe~aObWemCF*vsL+xxgUV|^A z&h|7am7SP_aog;3n}Z6h5;bleYN1C^^FD`qeuq&Tx`HDyrjh(dQkc|eZ|^M3p}rk8 z;lEL-`x>vtA5jxrMgX#RK}wg zN<&RF7GrT1D$syyzZ=u2H=+8!?feKe@fR3{7f_k#-eiwB9yL!2`Z3F+poxl5XSe}% zhMS!YsOQs!8u%FMZ1((Hqi*|IRDkDE^ZbCi)R%A+UO_#-jK{kA zd1g8VO)wvI6t|%Ul%RGPKxO1E)Wqvi6W60syTjF=#{}w!P^2)N7eIj zdo+D9LhnD7f+8P->To@3Kp|@3VpM?3Q2_=p6RU9yK99Q1U*TBnv)lHchJNZZP?xkC zmC+qI4&T5OkHQ}m?!n|I>{&NEpK~5?wxBZeimShh3g{oGK;J{{_%!OyeBx|J{eN&C zHU4{4{~yp(!vzXmUnz=`@Im=e+KGu&%t!u zgd?yOv+>&}$^Qfj1NYb;7NP>$f@*KX>G&@!!og43FPDdUmQCo#12_;rz$EN+#x~o# zl8yT0-hjig6bInW=DzllwYiS(p)TE-mh3?-d0}b8r!QGtQq|J2bYYJX{zWyb(*0cx jm8BKMORG#?aaHvSf9{gXs^YTSZQGwZwai($Xw?4!dGnHv delta 4404 zcmXZfc~I6x9LMn$P*FhS2^0k6Q1RfD%%dhmBJobMvQi^Q!;(X#EW-4c7e!);kYOr$ zU|E?RkZEa+(?RB#nPo+GIAvs-(P)QRGrd3T{`K13XOHiGclS4N`jFpShx}g24fD6Mrfz*d$ z2#$14#2(bA7aGshQ7EM$9D|DNzI)PDm79+4@i5(b?$<(jJ5X{G+Sd0q10R!+2 zOv3%x5r4oYJcA0L-kWbsD1|+!Kt4c4_yuZb=dmkxUSLz}Lx1W?sD%f)_TkP6*oF2x zQAab+)gN+JU^MM(QGt28C}_dssI&S7`{4ytgi#BP3C6(~gITDBr(QNhb5tV^GsEqDM`g`UC1x?(FI)Z>wyYo2gMtwLc;ylzuvr&PSI4dxWdOZ%r zSFks>pfY#~6{zoCV>)3kRA31h#rh_Vf)*ZwO6_d);apT^%2AoAc0P@v)VHH{)QIZ0 z&;9-hYKLE;0=?jV54z7DVIsD_3cQK+%}5on7WEp=pe9_t$X>z?sDO535FSLO`UooU zZ&4Foa{AqGk0c1S(+KQ~iKu|{P#c(to(9gOphyca0+-?ySc^K_ov75mhPoREuww^q zGire|57_>HqK=|#nKcGAUm9wBF8071FcAyN$iH?_NrO_>fC}Vo)PNJH08Y8~v#2xn ze~=4_si@54Bi}AliW=8~;dmN#S^shMz;fFjiwY#OocwFSu{3DMvz&`iADBwi0?(la zyy@!4P$~Qom4S<>qv^2N1`vX}w2?Rhhv4m4f|~CTYGWroSNI8aOWRN>`x|vu-5#y$YT+HI`S+p%@IIz6l){&&i9(myXVMe3 zP;XR9Q&0g7Lw(t<#j7y~r{WSEkH=8+#4hFIg#EAzCu0tNgR3x}%W!$#ze8Qp^QayDg*w~7W%e@0Vl4IRFcN2>j;b8yol~ zQhR|94aW1sIAB>?4Do_hmp)Tb{=T6jReI0cq?_(Oaq31^- zZl#Sp5w+8Ss8pt55$2)JunE`UC=O5oe}>AyHyDj=cqIl`*g&&U0p+4LG!+%d-LAc? zg8b`)@dypt(FW9|Yj7Q2bM=F$XL=NMyIWB^k9))hoQzr^1EcVIoP_zVz8iC>e~2A0 z=uvw_A&-)OU8)2c6lo^vY)9c3ycM;>tJ1A_T;cMhVnzF}@nS%df2u^y!ez9ht7A!>tvIVyZ7)S{XC~?{j7Cj76T`5`xfJy&UF+)4 zqWbMcWvUsw;!)K6Ef|A8U_aDT3S)hfL_s?mj{ca7dVXV20n9?BybP6*HSYI~=%e0* zddAJDg+D?a>8GfapTzcsF^syYvGe=T)8$B}&>cskZud0Q&K98tu11~hPE;zJF&odL zo?CjY4QwoG+%(ie#i)5b)bm@5+R$+vjK9>9|4<4sPukm?g4xuIP&<7ImAbbu7~exp za10gD&)5e$uebGN)Q4ysD)0i=zQVZ;70^Kp$4}Rje=X2TgAdzK3;91~C+dz7)KgG_ z=D7A7F_n4=s{bbE^QejUpyoS_%EY&*BW^>@^Do9@uvcd%N=2RFbkrH%;VeKspAyu- zdr@b*0(IHeU>R=0OpMrI|AricdS<7v7=xa+|DrwU+=lVAdxt3`Q#gk`Fmj`fG#v*} zzXtPg4o<*bn2VRN2(vcXz+Xh&_T8ue_n~(DF6vSr#UXec^(+H7xA*hR01Dc9Ch91z zLJi15?Jx(GktwK&Z$nKy8&MTYCsZd;bEu%N1_7E!K-jQ4##Dv+x#Y8jptDP`#)n-JP373$D=YjAFshWO!6pv zMqw#lMxAx}7OUr6>8wO$=5beFhYIK^RG?c>JKl+!=VfOTcBH-!HU1q`|98<-!(j^T zUnEWvo{D=`6gU>|IDo<-f2&<6X-jmC89qc9E^ mHuSWYteOUO+=9AvyBbF%Hs&^7EXeOtGiO0~W95PwL;eQ?+I?;S diff --git a/locale/de/LC_MESSAGES/django.po b/locale/de/LC_MESSAGES/django.po index e957e949..38b5b6f8 100644 --- a/locale/de/LC_MESSAGES/django.po +++ b/locale/de/LC_MESSAGES/django.po @@ -1310,7 +1310,7 @@ msgstr "Datum Zulassung bzw. Satzungsbeschluss" #: intervention/templates/intervention/detail/view.html:100 #: intervention/templates/intervention/report/report.html:83 msgid "Binding on" -msgstr "Datum Bestandskraft" +msgstr "Datum Bestandskraft bzw. Rechtskraft" #: intervention/forms/forms.py:211 intervention/views.py:97 msgid "New intervention" @@ -1520,7 +1520,7 @@ msgstr "Widersprüche liegen vor" #: intervention/utils/quality.py:76 msgid "Binding date" -msgstr "Datum Bestandskraft" +msgstr "Datum Bestandskraft bzw. Rechtskraft" #: intervention/utils/quality.py:79 msgid "Laws" @@ -2485,7 +2485,7 @@ msgid "" msgstr "" "\n" " Diese Daten sind noch nicht veröffentlicht und/oder haben das " -"Bestandskraftdatum noch nicht erreicht. Sie können daher aktuell nicht " +"Bestands-/Rechtskraftdatum noch nicht erreicht. Sie können daher aktuell nicht " "eingesehen werden. Schauen Sie zu einem späteren Zeitpunkt wieder vorbei. \n" " "