From 4c7c667bdb378d15dfb2d491bd54abd20bc3e60b Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Sun, 13 Sep 2026 11:36:28 +0200 Subject: [PATCH 1/4] # Error fetching * adds proper fetching of GDAL Exceptions in case of further problems in the future --- konova/utils/schneider/fetcher.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/konova/utils/schneider/fetcher.py b/konova/utils/schneider/fetcher.py index 2fa79cb9..14718495 100644 --- a/konova/utils/schneider/fetcher.py +++ b/konova/utils/schneider/fetcher.py @@ -9,6 +9,7 @@ import json from json import JSONDecodeError import requests +from django.contrib.gis import gdal from konova.sub_settings import schneider_settings from konova.sub_settings.lanis_settings import DEFAULT_SRID @@ -35,7 +36,10 @@ class ParcelFetcher: if geom.area < buffer_threshold: # Fallback for malicious geometries which are way too small and would disappear on negative buffering geom = geometry.geom - geom.transform(DEFAULT_SRID) + try: + geom.transform(DEFAULT_SRID) + except gdal.GDALException as e: + raise ValueError(f"{str(e)}\nCould not transform geometry (id: {geometry.id}) to {DEFAULT_SRID}:\n {geom.geojson}") self.geojson = geom.ewkt self.results = [] -- 2.52.0 From a994554650501565f0deedca852bed4afd9bbc51 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Sun, 13 Sep 2026 11:51:10 +0200 Subject: [PATCH 2/4] # Coordinate validity check * refactors coordinate validity check in generic base method * introduces specific check for epsg:25832 (RLP) * refactors check for epsg:4326 to use generic base method --- konova/utils/geometry/geometry_validator.py | 61 +++++++++++++++++++-- 1 file changed, 57 insertions(+), 4 deletions(-) diff --git a/konova/utils/geometry/geometry_validator.py b/konova/utils/geometry/geometry_validator.py index d0d7907b..5feecbf3 100644 --- a/konova/utils/geometry/geometry_validator.py +++ b/konova/utils/geometry/geometry_validator.py @@ -12,7 +12,7 @@ from django.contrib.gis.geos.prototypes.io import WKTWriter from django.utils.translation import gettext_lazy as _ from konova.settings import GEOM_MAX_VERTICES -from konova.sub_settings.lanis_settings import DEFAULT_SRID_RLP +from konova.sub_settings.lanis_settings import DEFAULT_SRID_RLP, DEFAULT_SRID class GeometryProcessor: @@ -50,7 +50,7 @@ class GeometryProcessor: return geometry.num_coords <= GEOM_MAX_VERTICES @staticmethod - def is_valid_4326(geometry): + def is_valid_4326(geometry: MultiPolygon) -> bool: """ Checks whether a given geometry's coordinates are in a valid range to be of EPSG:4326 Args: @@ -59,13 +59,66 @@ class GeometryProcessor: Returns: ret_val (bool): Whether the geometry is valid EPSG:4326 """ + assert geometry.srid == DEFAULT_SRID + return GeometryProcessor.is_valid_coord_area( + geometry, + -90.0, + 90.0, + -180.0, + 180.0, + ) + + @staticmethod + def is_valid_25832(geometry: MultiPolygon) -> bool: + """ Checks whether a given geometry's coordinates are in a valid range to be of EPSG:25832 + + Args: + geometry: The geometry + + Returns: + ret_val (bool): Whether the geometry is valid EPSG:25832 + """ + assert geometry.srid == DEFAULT_SRID_RLP + return GeometryProcessor.is_valid_coord_area( + geometry, + 166_000, + 834_000, + 0, + 9_329_000, + ) + + @staticmethod + def is_valid_coord_area(geometry: MultiPolygon, + min_x:float|int, + max_x:float|int, + min_y:float|int, + max_y: float|int) -> bool: + """ Checks whether a given geometry's coordinates are in a valid range defined by input parameters + + Args: + geometry: The geometry + min_x (float|int): The min x value + max_x (float|int): The max x value + min_y (float|int): The min y value + max_y (float|int): The max y value + + Returns: + ret_val (bool): Whether the geometry's coordinates stays inside the defined range + """ if not geometry.centroid.coords: # No coordinates at all found, therefore technically proper 4326 return True try: - lat,lon = geometry.centroid.coords - return (-90.0 <= lat <= 90.0) and (-180.0 <= lon <= 180.0) + env_min_x, env_max_x, env_min_y, env_max_y = geometry.envelope + + valid = ( + min_x <= env_min_x and + env_max_x <= max_x and + min_y <= env_min_y and + env_max_y <= max_y + ) + return valid except IndexError: return False -- 2.52.0 From 750715105e3cad7746446c132f7a0fe80216b1f7 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Sun, 13 Sep 2026 12:10:37 +0200 Subject: [PATCH 3/4] # EPSG:25832 Coordinate validity * adds epsg:25832 coordinate range check to GeoJsonValidator * improves resolving of min/max coordinates from envelope on is_valid_coord_area() --- konova/utils/geometry/geometry_validator.py | 7 +- locale/de/LC_MESSAGES/django.mo | Bin 46258 -> 46556 bytes locale/de/LC_MESSAGES/django.po | 115 ++++++++++++-------- 3 files changed, 73 insertions(+), 49 deletions(-) diff --git a/konova/utils/geometry/geometry_validator.py b/konova/utils/geometry/geometry_validator.py index 5feecbf3..f0f330b5 100644 --- a/konova/utils/geometry/geometry_validator.py +++ b/konova/utils/geometry/geometry_validator.py @@ -110,7 +110,10 @@ class GeometryProcessor: return True try: - env_min_x, env_max_x, env_min_y, env_max_y = geometry.envelope + env_min_x = geometry.envelope.min_x + env_max_x = geometry.envelope.max_x + env_min_y = geometry.envelope.min_y + env_max_y = geometry.envelope.max_x valid = ( min_x <= env_min_x and @@ -304,6 +307,8 @@ class GeoJsonValidator: if g.empty: continue g = GeometryProcessor.cast_to_rlp_srid(g) + if not GeometryProcessor.is_valid_25832(g): + raise AssertionError(_("This feature does not hold valid EPSG:25832 coordinates:\n {}".format(g.geojson))) geometry_has_unwanted_dimensions = g.coord_dim > 2 if geometry_has_unwanted_dimensions: diff --git a/locale/de/LC_MESSAGES/django.mo b/locale/de/LC_MESSAGES/django.mo index 2cbacbbcbbb40e1071cb010a5a2267ef36267c6e..5dfbc3058f50cb7ad6960942c952f0ae2b21d21c 100644 GIT binary patch delta 11365 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 delta 11103 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\n" "Language-Team: LANGUAGE \n" @@ -129,6 +129,7 @@ msgstr "" #: analysis/templates/analysis/reports/includes/old_data/amount.html:3 #: compensation/forms/modals/compensation_action.py:66 #: compensation/templates/compensation/detail/eco_account/includes/deductions.html:34 +#: compensation/templates/compensation/report/eco_account/report.html:50 #: intervention/templates/intervention/detail/includes/deductions.html:31 msgid "Amount" msgstr "Menge" @@ -334,6 +335,7 @@ msgstr "Typ" #: analysis/templates/analysis/reports/includes/old_data/amount.html:24 #: compensation/tables/compensation.py:87 +#: compensation/templates/compensation/report/eco_account/report.html:47 #: intervention/forms/modals/deduction.py:58 #: intervention/forms/modals/deduction.py:65 intervention/tables.py:92 #: intervention/templates/intervention/detail/view.html:19 @@ -448,7 +450,8 @@ msgid "Select the intervention for which this compensation compensates" msgstr "Wählen Sie den Eingriff, für den diese Kompensation bestimmt ist" #: compensation/forms/compensation.py:114 -#: compensation/views/compensation/compensation.py:121 +#: compensation/views/compensation/compensation.py:96 +#: compensation/views/compensation/compensation.py:160 msgid "New compensation" msgstr "Neue Kompensation" @@ -475,7 +478,8 @@ msgid "When did the parties agree on this?" msgstr "Wann wurde dieses Ökokonto offiziell vereinbart?" #: compensation/forms/eco_account.py:73 -#: compensation/views/eco_account/eco_account.py:105 +#: compensation/views/eco_account/eco_account.py:77 +#: compensation/views/eco_account/eco_account.py:127 msgid "New Eco-Account" msgstr "Neues Ökokonto" @@ -503,7 +507,8 @@ msgstr "" #: compensation/forms/eco_account.py:257 msgid "Please contact the responsible conservation office to find a solution!" -msgstr "Kontaktieren Sie die zuständige Naturschutzbehörde um eine Lösung zu finden!" +msgstr "" +"Kontaktieren Sie die zuständige Naturschutzbehörde um eine Lösung zu finden!" #: compensation/forms/mixins.py:37 #: compensation/templates/compensation/detail/eco_account/view.html:63 @@ -818,6 +823,7 @@ msgstr "Am {} von {} verzeichnet worden" #: compensation/tables/eco_account.py:39 #: compensation/templates/compensation/detail/eco_account/view.html:36 +#: compensation/templates/compensation/report/eco_account/report.html:34 #: konova/templates/konova/widgets/progressbar.html:3 msgid "Available" msgstr "Verfügbar" @@ -948,7 +954,7 @@ msgstr "Wiedervorlage" #: compensation/templates/compensation/detail/compensation/includes/controls.html:20 #: compensation/templates/compensation/detail/eco_account/includes/controls.html:34 -#: ema/templates/ema/detail/includes/controls.html:34 +#: ema/templates/ema/detail/includes/controls.html:32 #: intervention/templates/intervention/detail/includes/controls.html:39 msgid "Edit" msgstr "Bearbeiten" @@ -962,7 +968,7 @@ msgstr "Log anzeigen" #: compensation/templates/compensation/detail/compensation/includes/controls.html:27 #: compensation/templates/compensation/detail/eco_account/includes/controls.html:41 -#: ema/templates/ema/detail/includes/controls.html:41 +#: ema/templates/ema/detail/includes/controls.html:43 #: intervention/templates/intervention/detail/includes/controls.html:46 msgid "Delete" msgstr "Löschen" @@ -1154,7 +1160,7 @@ msgstr "Verzeichnet am" #: compensation/templates/compensation/detail/compensation/view.html:107 #: compensation/templates/compensation/detail/eco_account/view.html:85 #: compensation/templates/compensation/report/compensation/report.html:54 -#: compensation/templates/compensation/report/eco_account/report.html:47 +#: compensation/templates/compensation/report/eco_account/report.html:75 #: ema/templates/ema/detail/view.html:71 #: ema/templates/ema/report/report.html:34 #: intervention/templates/intervention/detail/view.html:113 @@ -1188,7 +1194,7 @@ msgid "other users" msgstr "weitere Nutzer" #: compensation/templates/compensation/detail/eco_account/includes/controls.html:18 -#: ema/templates/ema/detail/includes/controls.html:18 +#: ema/templates/ema/detail/includes/controls.html:19 #: intervention/forms/modals/share.py:62 #: intervention/templates/intervention/detail/includes/controls.html:18 #: intervention/tests/unit/test_forms.py:150 @@ -1258,11 +1264,11 @@ msgstr "Maßnahmenträger" msgid "Report" msgstr "Bericht" -#: compensation/templates/compensation/report/eco_account/report.html:34 +#: compensation/templates/compensation/report/eco_account/report.html:43 msgid "Deductions for" msgstr "Abbuchungen für" -#: compensation/templates/compensation/report/eco_account/report.html:42 +#: compensation/templates/compensation/report/eco_account/report.html:64 #: intervention/templates/intervention/report/report.html:53 #: intervention/templates/intervention/report/report.html:66 #: intervention/templates/intervention/report/report.html:76 @@ -1292,40 +1298,44 @@ msgstr "" msgid "Responsible data" msgstr "Daten zu den verantwortlichen Stellen" -#: compensation/views/compensation/compensation.py:52 +#: compensation/views/compensation/compensation.py:53 msgid "Compensations - Overview" msgstr "Kompensationen - Übersicht" -#: compensation/views/compensation/compensation.py:167 +#: compensation/views/compensation/compensation.py:203 +#: compensation/views/compensation/compensation.py:261 +#: compensation/views/eco_account/eco_account.py:169 +#: compensation/views/eco_account/eco_account.py:224 ema/views/ema.py:175 +#: ema/views/ema.py:229 intervention/views/intervention.py:176 +#: intervention/views/intervention.py:230 +msgid "Edit {}" +msgstr "Bearbeite {}" + +#: compensation/views/compensation/compensation.py:242 #: konova/utils/message_templates.py:40 msgid "Compensation {} edited" msgstr "Kompensation {} bearbeitet" -#: compensation/views/compensation/compensation.py:190 -#: compensation/views/eco_account/eco_account.py:168 ema/views/ema.py:173 -#: intervention/views/intervention.py:175 -msgid "Edit {}" -msgstr "Bearbeite {}" - #: compensation/views/compensation/report.py:35 #: compensation/views/eco_account/report.py:35 ema/views/report.py:35 #: intervention/views/report.py:36 msgid "Report {}" msgstr "Bericht {}" -#: compensation/views/eco_account/eco_account.py:49 +#: compensation/views/eco_account/eco_account.py:51 msgid "Eco-account - Overview" msgstr "Ökokonten - Übersicht" -#: compensation/views/eco_account/eco_account.py:82 +#: compensation/views/eco_account/eco_account.py:108 msgid "Eco-Account {} added" msgstr "Ökokonto {} hinzugefügt" -#: compensation/views/eco_account/eco_account.py:145 +#: compensation/views/eco_account/eco_account.py:205 msgid "Eco-Account {} edited" msgstr "Ökokonto {} bearbeitet" -#: ema/forms.py:42 ema/tests/unit/test_forms.py:27 ema/views/ema.py:107 +#: ema/forms.py:42 ema/tests/unit/test_forms.py:27 ema/views/ema.py:79 +#: ema/views/ema.py:129 msgid "New EMA" msgstr "Neue EMA hinzufügen" @@ -1357,11 +1367,11 @@ msgstr "Ersatzzahlungsmaßnahme" msgid "EMAs - Overview" msgstr "EMAs - Übersicht" -#: ema/views/ema.py:85 +#: ema/views/ema.py:111 msgid "EMA {} added" msgstr "EMA {} hinzugefügt" -#: ema/views/ema.py:150 +#: ema/views/ema.py:211 msgid "EMA {} edited" msgstr "EMA {} bearbeitet" @@ -1425,7 +1435,7 @@ msgstr "Datum Bestandskraft bzw. Rechtskraft" #: intervention/forms/intervention.py:216 #: intervention/tests/unit/test_forms.py:36 -#: intervention/views/intervention.py:109 +#: intervention/views/intervention.py:82 intervention/views/intervention.py:134 msgid "New intervention" msgstr "Neuer Eingriff" @@ -1661,15 +1671,15 @@ msgstr "" msgid "Check performed" msgstr "Prüfung durchgeführt" -#: intervention/views/intervention.py:53 +#: intervention/views/intervention.py:56 msgid "Interventions - Overview" msgstr "Eingriffe - Übersicht" -#: intervention/views/intervention.py:86 +#: intervention/views/intervention.py:114 msgid "Intervention {} added" msgstr "Eingriff {} hinzugefügt" -#: intervention/views/intervention.py:150 +#: intervention/views/intervention.py:212 msgid "Intervention {} edited" msgstr "Eingriff {} bearbeitet" @@ -1797,16 +1807,11 @@ msgstr "Speichern" msgid "Not editable" msgstr "Nicht editierbar" -#: konova/forms/geometry_form.py:31 konova/utils/quality.py:44 +#: konova/forms/geometry_form.py:30 konova/utils/quality.py:44 #: konova/utils/quality.py:46 templates/form/collapsable/form.html:45 msgid "Geometry" msgstr "Geometrie" -#: konova/forms/geometry_form.py:105 -msgid "Only surfaces allowed. Points or lines must be buffered." -msgstr "" -"Nur Flächen erlaubt. Punkte oder Linien müssen zu Flächen gepuffert werden." - #: konova/forms/modals/document_form.py:37 msgid "When has this file been created? Important for photos." msgstr "Wann wurde diese Datei erstellt oder das Foto aufgenommen?" @@ -1961,6 +1966,7 @@ msgstr "Raumreferenz" #: konova/templates/konova/includes/parcels/parcels.html:28 msgid "No geometry entry found on database. Please contact an admin!" msgstr "" +"Keine Geometrie in Datenbank gefunden. Kontaktieren Sie einen Administrator!" #: konova/templates/konova/includes/quickstart/compensations.html:20 #: konova/templates/konova/includes/quickstart/ecoaccounts.html:20 @@ -2006,39 +2012,52 @@ msgstr "In Zwischenablage kopiert" msgid "Search" msgstr "Suchen" -#: konova/utils/mailer.py:69 konova/utils/mailer.py:146 +#: konova/utils/geometry/geometry_validator.py:311 +msgid "" +"This feature does not hold valid EPSG:25832 coordinates:\n" +" {}" +msgstr "" +"Dieses Feature enthält keine validen EPSG:25832 Koordinaten:\n" +" {}" + +#: konova/utils/geometry/geometry_validator.py:319 +msgid "Only surfaces allowed. Points or lines must be buffered." +msgstr "" +"Nur Flächen erlaubt. Punkte oder Linien müssen zu Flächen gepuffert werden." + +#: konova/utils/mailer.py:82 konova/utils/mailer.py:159 msgid "{} - Shared access removed" msgstr "{} - Zugriff entzogen" -#: konova/utils/mailer.py:94 konova/utils/mailer.py:120 +#: konova/utils/mailer.py:107 konova/utils/mailer.py:133 msgid "{} - Shared access given" msgstr "{} - Zugriff freigegeben" -#: konova/utils/mailer.py:172 konova/utils/mailer.py:325 +#: konova/utils/mailer.py:185 konova/utils/mailer.py:338 msgid "{} - Shared data unrecorded" msgstr "{} - Freigegebene Daten entzeichnet" -#: konova/utils/mailer.py:198 konova/utils/mailer.py:300 +#: konova/utils/mailer.py:211 konova/utils/mailer.py:313 msgid "{} - Shared data recorded" msgstr "{} - Freigegebene Daten verzeichnet" -#: konova/utils/mailer.py:224 konova/utils/mailer.py:375 +#: konova/utils/mailer.py:237 konova/utils/mailer.py:388 msgid "{} - Shared data checked" msgstr "{} - Freigegebene Daten geprüft" -#: konova/utils/mailer.py:249 konova/utils/mailer.py:401 +#: konova/utils/mailer.py:262 konova/utils/mailer.py:414 msgid "{} - Deduction changed" msgstr "{} - Abbuchung geändert" -#: konova/utils/mailer.py:275 konova/utils/mailer.py:350 +#: konova/utils/mailer.py:288 konova/utils/mailer.py:363 msgid "{} - Shared data deleted" msgstr "{} - Freigegebene Daten gelöscht" -#: konova/utils/mailer.py:422 templates/email/api/verify_token.html:4 +#: konova/utils/mailer.py:435 templates/email/api/verify_token.html:4 msgid "Request for new API token" msgstr "Anfrage für neuen API Token" -#: konova/utils/mailer.py:447 +#: konova/utils/mailer.py:460 msgid "Resubmission - {}" msgstr "Wiedervorlage - {}" @@ -2289,11 +2308,11 @@ msgstr "Neuer Token generiert. Administratoren sind informiert." msgid "missing" msgstr "fehlend" -#: konova/utils/tables.py:222 +#: konova/utils/tables.py:224 msgid "Full access granted" msgstr "Für Sie freigegeben - Datensatz kann bearbeitet werden" -#: konova/utils/tables.py:222 +#: konova/utils/tables.py:224 msgid "Access not granted" msgstr "Nicht freigegeben - Datensatz nur lesbar" @@ -2303,7 +2322,7 @@ msgstr "" "Dieses Datum ist unrealistisch. Geben Sie bitte das korrekte Datum ein " "(>1950)." -#: konova/views/home.py:75 templates/navbars/navbar.html:16 +#: konova/views/home.py:76 templates/navbars/navbar.html:16 msgid "Home" msgstr "Home" @@ -2323,7 +2342,7 @@ msgstr "{} verzeichnet" msgid "Errors found:" msgstr "Fehler gefunden:" -#: konova/views/remove.py:35 +#: konova/views/remove.py:34 msgid "{} removed" msgstr "{} entfernt" -- 2.52.0 From 7c200d9034730910995b5ab63800b42306f59bf6 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Sun, 13 Sep 2026 12:11:18 +0200 Subject: [PATCH 4/4] # Rename check method * renames is_valid_coord_area to is_valid_coord_range for more clarity --- konova/utils/geometry/geometry_validator.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/konova/utils/geometry/geometry_validator.py b/konova/utils/geometry/geometry_validator.py index f0f330b5..15fbd43a 100644 --- a/konova/utils/geometry/geometry_validator.py +++ b/konova/utils/geometry/geometry_validator.py @@ -60,7 +60,7 @@ class GeometryProcessor: ret_val (bool): Whether the geometry is valid EPSG:4326 """ assert geometry.srid == DEFAULT_SRID - return GeometryProcessor.is_valid_coord_area( + return GeometryProcessor.is_valid_coord_range( geometry, -90.0, 90.0, @@ -79,7 +79,7 @@ class GeometryProcessor: ret_val (bool): Whether the geometry is valid EPSG:25832 """ assert geometry.srid == DEFAULT_SRID_RLP - return GeometryProcessor.is_valid_coord_area( + return GeometryProcessor.is_valid_coord_range( geometry, 166_000, 834_000, @@ -88,11 +88,11 @@ class GeometryProcessor: ) @staticmethod - def is_valid_coord_area(geometry: MultiPolygon, - min_x:float|int, - max_x:float|int, - min_y:float|int, - max_y: float|int) -> bool: + def is_valid_coord_range(geometry: MultiPolygon, + min_x:float|int, + max_x:float|int, + min_y:float|int, + max_y: float|int) -> bool: """ Checks whether a given geometry's coordinates are in a valid range defined by input parameters Args: -- 2.52.0