From 8af0e41e2deaf61212817dec838bca867c63d7f0 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Mon, 11 Apr 2022 10:23:28 +0200 Subject: [PATCH 1/3] # 139 Parcel reference improved * improves frontend layout to display more details on district, municipal and parce group * improves ordering of parcels * refactors parcel related models * improves parcel fetching * extends and simplifies sanitize_db parcel related code --- compensation/tables.py | 4 +- ema/tables.py | 2 +- intervention/tables.py | 2 +- konova/admin.py | 28 ++++- konova/filters/mixins.py | 4 +- konova/management/commands/sanitize_db.py | 37 +++--- konova/migrations/0006_auto_20220411_0835.py | 71 ++++++++++++ konova/migrations/0007_auto_20220411_0848.py | 28 +++++ konova/migrations/0008_auto_20220411_0914.py | 48 ++++++++ konova/migrations/0009_auto_20220411_1004.py | 19 ++++ konova/models/geometry.py | 29 +++-- konova/models/parcel.py | 107 +++++++++++------- .../konova/includes/parcel_table.html | 39 +++++-- konova/templates/konova/includes/parcels.html | 2 +- konova/views.py | 6 +- locale/de/LC_MESSAGES/django.mo | Bin 40705 -> 40828 bytes locale/de/LC_MESSAGES/django.po | 44 ++++--- 17 files changed, 376 insertions(+), 94 deletions(-) create mode 100644 konova/migrations/0006_auto_20220411_0835.py create mode 100644 konova/migrations/0007_auto_20220411_0848.py create mode 100644 konova/migrations/0008_auto_20220411_0914.py create mode 100644 konova/migrations/0009_auto_20220411_1004.py diff --git a/compensation/tables.py b/compensation/tables.py index 96888cc..ed89b63 100644 --- a/compensation/tables.py +++ b/compensation/tables.py @@ -134,7 +134,7 @@ class CompensationTable(BaseTable, TableRenderMixin): """ parcels = value.get_underlying_parcels().values_list( - "gmrkng", + "parcel_group__name", flat=True ).distinct() html = render_to_string( @@ -295,7 +295,7 @@ class EcoAccountTable(BaseTable, TableRenderMixin): """ parcels = value.get_underlying_parcels().values_list( - "gmrkng", + "parcel_group__name", flat=True ).distinct() html = render_to_string( diff --git a/ema/tables.py b/ema/tables.py index f968951..30968f9 100644 --- a/ema/tables.py +++ b/ema/tables.py @@ -104,7 +104,7 @@ class EmaTable(BaseTable, TableRenderMixin): """ parcels = value.get_underlying_parcels().values_list( - "gmrkng", + "parcel_group__name", flat=True ).distinct() html = render_to_string( diff --git a/intervention/tables.py b/intervention/tables.py index f535039..c8ee504 100644 --- a/intervention/tables.py +++ b/intervention/tables.py @@ -131,7 +131,7 @@ class InterventionTable(BaseTable, TableRenderMixin): """ parcels = value.get_underlying_parcels().values_list( - "gmrkng", + "parcel_group__name", flat=True ).distinct() html = render_to_string( diff --git a/konova/admin.py b/konova/admin.py index 81db8fe..07be721 100644 --- a/konova/admin.py +++ b/konova/admin.py @@ -7,7 +7,7 @@ Created on: 22.07.21 """ from django.contrib import admin -from konova.models import Geometry, Deadline, GeometryConflict, Parcel, District +from konova.models import Geometry, Deadline, GeometryConflict, Parcel, District, Municipal, ParcelGroup from konova.utils.message_templates import COMPENSATION_REMOVED_TEMPLATE from user.models import UserAction @@ -22,7 +22,7 @@ class GeometryAdmin(admin.ModelAdmin): class ParcelAdmin(admin.ModelAdmin): list_display = [ "id", - "gmrkng", + "parcel_group", "flr", "flrstck_nnr", "flrstck_zhlr", @@ -32,9 +32,27 @@ class ParcelAdmin(admin.ModelAdmin): class DistrictAdmin(admin.ModelAdmin): list_display = [ + "name", + "key", + "id", + ] + + +class MunicipalAdmin(admin.ModelAdmin): + list_display = [ + "name", + "key", + "district", + "id", + ] + + +class ParcelGroupAdmin(admin.ModelAdmin): + list_display = [ + "name", + "key", + "municipal", "id", - "gmnd", - "krs", ] @@ -105,5 +123,7 @@ class BaseObjectAdmin(BaseResourceAdmin): #admin.site.register(Geometry, GeometryAdmin) #admin.site.register(Parcel, ParcelAdmin) #admin.site.register(District, DistrictAdmin) +#admin.site.register(Municipal, MunicipalAdmin) +#admin.site.register(ParcelGroup, ParcelGroupAdmin) #admin.site.register(GeometryConflict, GeometryConflictAdmin) #admin.site.register(Deadline, DeadlineAdmin) diff --git a/konova/filters/mixins.py b/konova/filters/mixins.py index e6a841e..bce7045 100644 --- a/konova/filters/mixins.py +++ b/konova/filters/mixins.py @@ -185,7 +185,7 @@ class GeoReferencedTableFilterMixin(django_filters.FilterSet): """ matching_districts = District.objects.filter( - krs__icontains=value + name__icontains=value ) matching_parcels = Parcel.objects.filter( district__in=matching_districts @@ -209,7 +209,7 @@ class GeoReferencedTableFilterMixin(django_filters.FilterSet): Returns: """ - queryset = self._filter_parcel_reference(queryset, name, value, "gmrkng__icontains") + queryset = self._filter_parcel_reference(queryset, name, value, "parcel_group__name__icontains") return queryset def filter_parcel(self, queryset, name, value) -> QuerySet: diff --git a/konova/management/commands/sanitize_db.py b/konova/management/commands/sanitize_db.py index b5be834..b296b2a 100644 --- a/konova/management/commands/sanitize_db.py +++ b/konova/management/commands/sanitize_db.py @@ -9,7 +9,7 @@ from compensation.models import CompensationState, Compensation, EcoAccount, Com from ema.models import Ema from intervention.models import Intervention from konova.management.commands.setup import BaseKonovaCommand -from konova.models import Deadline, Geometry, Parcel, District +from konova.models import Deadline, Geometry, Parcel, District, Municipal, ParcelGroup from user.models import UserActionLogEntry, UserAction @@ -271,13 +271,26 @@ class Command(BaseKonovaCommand): self._write_success("No unused states found.") self._break_line() + def __sanitize_parcel_sub_type(self, cls): + unrelated_entries = cls.objects.filter( + parcels=None, + ) + num_unrelated_entries = unrelated_entries.count() + cls_name = cls.__name__ + if num_unrelated_entries > 0: + self._write_error(f"Found {num_unrelated_entries} unrelated {cls_name} entries. Delete now...") + unrelated_entries.delete() + self._write_success(f"Unrelated {cls_name} deleted.") + else: + self._write_success(f"No unrelated {cls_name} found.") + def sanitize_parcels_and_districts(self): """ Removes unattached parcels and districts Returns: """ - self._write_warning("=== Sanitize parcels and districts ===") + self._write_warning("=== Sanitize administrative spatial references ===") unrelated_parcels = Parcel.objects.filter( geometries=None, ) @@ -289,16 +302,12 @@ class Command(BaseKonovaCommand): else: self._write_success("No unrelated parcels found.") - unrelated_districts = District.objects.filter( - parcels=None, - ) - num_unrelated_districts = unrelated_districts.count() - if num_unrelated_districts > 0: - self._write_error(f"Found {num_unrelated_districts} unrelated district entries. Delete now...") - unrelated_districts.delete() - self._write_success("Unrelated districts deleted.") - else: - self._write_success("No unrelated districts found.") - - self._break_line() + sub_types = [ + District, + Municipal, + ParcelGroup + ] + for sub_type in sub_types: + self.__sanitize_parcel_sub_type(sub_type) + self._break_line() \ No newline at end of file diff --git a/konova/migrations/0006_auto_20220411_0835.py b/konova/migrations/0006_auto_20220411_0835.py new file mode 100644 index 0000000..bf74643 --- /dev/null +++ b/konova/migrations/0006_auto_20220411_0835.py @@ -0,0 +1,71 @@ +# Generated by Django 3.1.3 on 2022-04-11 06:35 + +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('konova', '0005_auto_20220216_0856'), + ] + + operations = [ + migrations.CreateModel( + name='Municipal', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ('key', models.IntegerField(blank=True, help_text='Represents Gemeindeschlüssel', null=True)), + ('name', models.CharField(blank=True, help_text='Gemeinde', max_length=1000, null=True)), + ], + options={ + 'abstract': False, + }, + ), + migrations.RenameField( + model_name='district', + old_name='krs', + new_name='name', + ), + migrations.RemoveField( + model_name='district', + name='gmnd', + ), + migrations.RemoveField( + model_name='parcel', + name='gmrkng', + ), + migrations.AddField( + model_name='district', + name='key', + field=models.IntegerField(blank=True, help_text='Represents Kreisschlüssel', null=True), + ), + migrations.CreateModel( + name='ParcelGroup', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ('key', models.IntegerField(blank=True, help_text='Represents Gemarkungsschlüssel', null=True)), + ('name', models.CharField(blank=True, help_text='Gemarkung', max_length=1000, null=True)), + ('municipal', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='konova.municipal')), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='municipal', + name='district', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='konova.district'), + ), + migrations.AddField( + model_name='parcel', + name='municipal', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='parcels', to='konova.municipal'), + ), + migrations.AddField( + model_name='parcel', + name='parcel_group', + field=models.ForeignKey(blank=True, help_text='Gemarkung', null=True, on_delete=django.db.models.deletion.SET_NULL, to='konova.parcelgroup'), + ), + ] diff --git a/konova/migrations/0007_auto_20220411_0848.py b/konova/migrations/0007_auto_20220411_0848.py new file mode 100644 index 0000000..fcc2b45 --- /dev/null +++ b/konova/migrations/0007_auto_20220411_0848.py @@ -0,0 +1,28 @@ +# Generated by Django 3.1.3 on 2022-04-11 06:48 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('konova', '0006_auto_20220411_0835'), + ] + + operations = [ + migrations.AlterField( + model_name='district', + name='key', + field=models.CharField(blank=True, help_text='Represents Kreisschlüssel', max_length=255, null=True), + ), + migrations.AlterField( + model_name='municipal', + name='key', + field=models.CharField(blank=True, help_text='Represents Gemeindeschlüssel', max_length=255, null=True), + ), + migrations.AlterField( + model_name='parcelgroup', + name='key', + field=models.CharField(blank=True, help_text='Represents Gemarkungsschlüssel', max_length=255, null=True), + ), + ] diff --git a/konova/migrations/0008_auto_20220411_0914.py b/konova/migrations/0008_auto_20220411_0914.py new file mode 100644 index 0000000..c56b621 --- /dev/null +++ b/konova/migrations/0008_auto_20220411_0914.py @@ -0,0 +1,48 @@ +# Generated by Django 3.1.3 on 2022-04-11 07:14 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('konova', '0007_auto_20220411_0848'), + ] + + operations = [ + migrations.AlterField( + model_name='municipal', + name='key', + field=models.CharField(blank=True, help_text='Represents Kreisschlüssel', max_length=255, null=True), + ), + migrations.AlterField( + model_name='municipal', + name='name', + field=models.CharField(blank=True, help_text='Kreis', max_length=1000, null=True), + ), + migrations.AlterField( + model_name='parcel', + name='flr', + field=models.IntegerField(blank=True, help_text='Flur', null=True), + ), + migrations.AlterField( + model_name='parcel', + name='flrstck_nnr', + field=models.IntegerField(blank=True, help_text='Flurstücksnenner', null=True), + ), + migrations.AlterField( + model_name='parcel', + name='flrstck_zhlr', + field=models.IntegerField(blank=True, help_text='Flurstückszähler', null=True), + ), + migrations.AlterField( + model_name='parcelgroup', + name='key', + field=models.CharField(blank=True, help_text='Represents Kreisschlüssel', max_length=255, null=True), + ), + migrations.AlterField( + model_name='parcelgroup', + name='name', + field=models.CharField(blank=True, help_text='Kreis', max_length=1000, null=True), + ), + ] diff --git a/konova/migrations/0009_auto_20220411_1004.py b/konova/migrations/0009_auto_20220411_1004.py new file mode 100644 index 0000000..d0679bf --- /dev/null +++ b/konova/migrations/0009_auto_20220411_1004.py @@ -0,0 +1,19 @@ +# Generated by Django 3.1.3 on 2022-04-11 08:04 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('konova', '0008_auto_20220411_0914'), + ] + + operations = [ + migrations.AlterField( + model_name='parcel', + name='parcel_group', + field=models.ForeignKey(blank=True, help_text='Gemarkung', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='parcels', to='konova.parcelgroup'), + ), + ] diff --git a/konova/models/geometry.py b/konova/models/geometry.py index bec89c3..fc484a7 100644 --- a/konova/models/geometry.py +++ b/konova/models/geometry.py @@ -99,7 +99,7 @@ class Geometry(BaseResource): Returns: """ - from konova.models import Parcel, District, ParcelIntersection + from konova.models import Parcel, District, ParcelIntersection, Municipal, ParcelGroup parcel_fetcher = ParcelWFSFetcher( geometry_id=self.id, ) @@ -115,16 +115,28 @@ class Geometry(BaseResource): # 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 ", "") + district = District.objects.get_or_create( + key=fetched_parcel["ave:kreisschl"], + name=fetched_parcel["ave:kreis"], + )[0] + municipal = Municipal.objects.get_or_create( + key=fetched_parcel["ave:gmdschl"], + name=fetched_parcel["ave:gemeinde"], + district=district, + )[0] + parcel_group = ParcelGroup.objects.get_or_create( + key=fetched_parcel["ave:gemaschl"], + name=fetched_parcel["ave:gemarkung"], + municipal=municipal, + )[0] parcel_obj = Parcel.objects.get_or_create( - gmrkng=fetched_parcel["ave:gemarkung"], + district=district, + municipal=municipal, + parcel_group=parcel_group, flr=flr_val, flrstck_nnr=fetched_parcel['ave:flstnrnen'], flrstck_zhlr=fetched_parcel['ave:flstnrzae'], )[0] - district = District.objects.get_or_create( - gmnd=fetched_parcel["ave:gemeinde"], - krs=fetched_parcel["ave:kreis"], - )[0] parcel_obj.district = district parcel_obj.updated_on = _now parcel_obj.save() @@ -155,9 +167,10 @@ class Geometry(BaseResource): parcels = self.parcels.filter( parcelintersection__calculated_on__isnull=False, ).prefetch_related( - "district" + "district", + "municipal", ).order_by( - "gmrkng", + "municipal__name", ) return parcels diff --git a/konova/models/parcel.py b/konova/models/parcel.py index 9c887f1..f74b7af 100644 --- a/konova/models/parcel.py +++ b/konova/models/parcel.py @@ -10,8 +10,64 @@ from django.db import models from konova.models import UuidModel +class AdministrativeSpatialReference(models.Model): + key = models.CharField( + max_length=255, + help_text="Represents Kreisschlüssel", + null=True, + blank=True + ) + name = models.CharField( + max_length=1000, + help_text="Kreis", + null=True, + blank=True, + ) + + class Meta: + abstract = True + + def __str__(self): + return f"{self.name} ({self.key})" + + @property + def table_str(self): + return f"{self.name} ({self.key})" + + +class District(UuidModel, AdministrativeSpatialReference): + """ The model District refers to "Kreis" + + """ + pass + + +class Municipal(UuidModel, AdministrativeSpatialReference): + """ The model Municipal refers to "Gemeinde" + + """ + district = models.ForeignKey( + District, + on_delete=models.SET_NULL, + null=True, + blank=True, + ) + + +class ParcelGroup(UuidModel, AdministrativeSpatialReference): + """ The model ParcelGroup refers to "Gemarkung", which is defined as a loose group of parcels + + """ + municipal = models.ForeignKey( + Municipal, + on_delete=models.SET_NULL, + null=True, + blank=True, + ) + + class Parcel(UuidModel): - """ The Parcel model holds administrative data on the covered properties. + """ The Parcel model holds administrative data on covered properties. Due to the unique but relevant naming of the administrative data, we have to use these namings as field names in german. Any try to translate them to English result in strange or insufficient translations. @@ -24,59 +80,34 @@ class Parcel(UuidModel): """ geometries = models.ManyToManyField("konova.Geometry", blank=True, related_name="parcels", through='ParcelIntersection') district = models.ForeignKey("konova.District", on_delete=models.SET_NULL, null=True, blank=True, related_name="parcels") - gmrkng = models.CharField( - max_length=1000, + municipal = models.ForeignKey("konova.Municipal", on_delete=models.SET_NULL, null=True, blank=True, related_name="parcels") + parcel_group = models.ForeignKey( + "konova.ParcelGroup", + on_delete=models.SET_NULL, help_text="Gemarkung", null=True, blank=True, + related_name="parcels" ) - flrstck_nnr = models.CharField( - max_length=1000, - help_text="Flurstücksnenner", - null=True, - blank=True, - ) - flrstck_zhlr = models.CharField( - max_length=1000, - help_text="Flurstückszähler", - null=True, - blank=True, - ) - flr = models.CharField( - max_length=1000, + flr = models.IntegerField( help_text="Flur", null=True, blank=True, ) - updated_on = models.DateTimeField(auto_now_add=True) - - def __str__(self): - return f"{self.gmrkng} | {self.flr} | {self.flrstck_zhlr} | {self.flrstck_nnr}" - - -class District(UuidModel): - """ The model District holds more coarse information, such as Kreis, Verbandsgemeinde and Gemeinde. - - There might be the case that a geometry lies on a hundred Parcel entries but only on one District entry. - Therefore a geometry can have a lot of relations to Parcel entries but only a few or only a single one to one - District. - - """ - gmnd = models.CharField( - max_length=1000, - help_text="Gemeinde", + flrstck_nnr = models.IntegerField( + help_text="Flurstücksnenner", null=True, blank=True, ) - krs = models.CharField( - max_length=1000, - help_text="Kreis", + flrstck_zhlr = models.IntegerField( + help_text="Flurstückszähler", null=True, blank=True, ) + updated_on = models.DateTimeField(auto_now_add=True) def __str__(self): - return f"{self.gmnd} | {self.krs}" + return f"{self.parcel_group} | {self.flr} | {self.flrstck_zhlr} | {self.flrstck_nnr}" class ParcelIntersection(UuidModel): diff --git a/konova/templates/konova/includes/parcel_table.html b/konova/templates/konova/includes/parcel_table.html index 6890489..7650357 100644 --- a/konova/templates/konova/includes/parcel_table.html +++ b/konova/templates/konova/includes/parcel_table.html @@ -1,15 +1,36 @@ -{% load i18n %} +{% load i18n l10n %}
{% if parcels|length == 0 %}
{% trans 'Parcels can not be calculated, since no geometry is given.' %}
{% else %} - +
- - + + + + + + + + {% for municipal in municipals %} + + + + + + + {% endfor %} + + +
{% trans 'Kreis' %}{% trans 'Gemarkung' %}{% trans 'Municipal' %}{% trans 'Municipal key' %}{% trans 'District' %}{% trans 'District key' %}
{{municipal.name}}{{municipal.key|unlocalize}}{{municipal.district.name}}{{municipal.district.key|unlocalize}}
+ + + + + @@ -18,11 +39,11 @@ {% for parcel in parcels %} - - - - - + + + + + {% endfor %} diff --git a/konova/templates/konova/includes/parcels.html b/konova/templates/konova/includes/parcels.html index 952fde1..30feda4 100644 --- a/konova/templates/konova/includes/parcels.html +++ b/konova/templates/konova/includes/parcels.html @@ -8,7 +8,7 @@
-
+
diff --git a/konova/views.py b/konova/views.py index db967e8..2fd5ff9 100644 --- a/konova/views.py +++ b/konova/views.py @@ -17,7 +17,7 @@ from compensation.models import Compensation, EcoAccount from intervention.models import Intervention from konova.contexts import BaseContext from konova.decorators import any_group_check -from konova.models import Deadline, Geometry +from konova.models import Deadline, Geometry, Municipal from konova.sub_settings.context_settings import TAB_TITLE_IDENTIFIER from news.models import ServerMessage from konova.settings import SSO_SERVER_BASE @@ -130,8 +130,12 @@ def get_geom_parcels(request: HttpRequest, id: str): status_code = 200 if parcels_available or no_geometry_given: + 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) context = { "parcels": parcels, + "municipals": municipals, } html = render_to_string(template, context, request) return HttpResponse(html, status=status_code) diff --git a/locale/de/LC_MESSAGES/django.mo b/locale/de/LC_MESSAGES/django.mo index b3bf61fdcc2687d5b1e1f1ad8bc811c9ed514b44..9709df16feb3016962ea70002c7bfb05a1a44bf8 100644 GIT binary patch delta 11423 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 b+#K&d{RgN{(&Rk%{6|wNc;~0gPAl<0zJZGP diff --git a/locale/de/LC_MESSAGES/django.po b/locale/de/LC_MESSAGES/django.po index e8786ab..c611486 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-03-03 12:08+0100\n" +"POT-Creation-Date: 2022-04-11 09:07+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -1588,6 +1588,7 @@ msgid "Search for file number" msgstr "Nach Aktenzeichen suchen" #: konova/filters/mixins.py:85 +#: konova/templates/konova/includes/parcel_table.html:11 msgid "District" msgstr "Kreis" @@ -1600,7 +1601,7 @@ msgid "Search for parcel gmrkng" msgstr "Nach Gemarkung suchen" #: konova/filters/mixins.py:111 -#: konova/templates/konova/includes/parcel_table.html:13 +#: konova/templates/konova/includes/parcel_table.html:34 msgid "Parcel" msgstr "Flur" @@ -1609,7 +1610,7 @@ msgid "Search for parcel" msgstr "Nach Flur suchen" #: konova/filters/mixins.py:124 -#: konova/templates/konova/includes/parcel_table.html:14 +#: konova/templates/konova/includes/parcel_table.html:35 msgid "Parcel counter" msgstr "Flurstückzähler" @@ -1618,7 +1619,7 @@ msgid "Search for parcel counter" msgstr "Nach Flurstückzähler suchen" #: konova/filters/mixins.py:138 -#: konova/templates/konova/includes/parcel_table.html:15 +#: konova/templates/konova/includes/parcel_table.html:36 msgid "Parcel number" msgstr "Flurstücknenner" @@ -1759,22 +1760,30 @@ msgstr "" "Flurstücke können nicht berechnet werden, da keine Geometrie eingegeben " "wurde." -#: konova/templates/konova/includes/parcel_table.html:11 -msgid "Kreis" -msgstr "Kreis" - #: konova/templates/konova/includes/parcel_table.html:12 -msgid "Gemarkung" +msgid "District key" +msgstr "Kreisschlüssel" + +#: konova/templates/konova/includes/parcel_table.html:13 +msgid "Municipal" +msgstr "Gemeinde" + +#: konova/templates/konova/includes/parcel_table.html:14 +msgid "Municipal key" +msgstr "Gemeindeschlüssel" + +#: konova/templates/konova/includes/parcel_table.html:32 +msgid "Parcel group" msgstr "Gemarkung" +#: konova/templates/konova/includes/parcel_table.html:33 +msgid "Parcel group key" +msgstr "Gemarkungsschlüssel" + #: konova/templates/konova/includes/parcels.html:7 msgid "Spatial reference" msgstr "Raumreferenz" -#: konova/templates/konova/includes/parcels.html:11 -msgid "Loading..." -msgstr "Lade..." - #: konova/templates/konova/includes/quickstart/compensations.html:20 #: konova/templates/konova/includes/quickstart/ecoaccounts.html:20 #: konova/templates/konova/includes/quickstart/interventions.html:20 @@ -4189,5 +4198,14 @@ msgstr "" msgid "Unable to connect to qpid with SASL mechanism %s" msgstr "" +#~ msgid "Kreis" +#~ msgstr "Kreis" + +#~ msgid "Gemarkung" +#~ msgstr "Gemarkung" + +#~ msgid "Loading..." +#~ msgstr "Lade..." + #~ msgid "Who handles the eco-account" #~ msgstr "Wer für die Herrichtung des Ökokontos verantwortlich ist" From 6e76a3fdce78cbd17f4294e809dc45277a1211c3 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Mon, 11 Apr 2022 10:51:15 +0200 Subject: [PATCH 2/3] #139 Parcel filter improved * improves frontend filtering for district, municipal, ..., so keys can be used for a lookup as well --- konova/filters/mixins.py | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/konova/filters/mixins.py b/konova/filters/mixins.py index bce7045..bad9f68 100644 --- a/konova/filters/mixins.py +++ b/konova/filters/mixins.py @@ -145,26 +145,22 @@ class GeoReferencedTableFilterMixin(django_filters.FilterSet): class Meta: abstract = True - def _filter_parcel_reference(self, queryset, name, value, filter_value) -> QuerySet: + def _filter_parcel_reference(self, queryset, filter_q) -> QuerySet: """ Filters the parcel entries by a given filter_value. filter_value may already include further filter annotations like 'xy__icontains' Args: - queryset (): - name (): - value (): - filter_value (): + queryset (QuerySet): The queryset + filter_q (Q): The Q-style filter expression Returns: """ - _filter = { - filter_value: value - } matching_parcels = Parcel.objects.filter( - **_filter + filter_q ) + related_geoms = matching_parcels.values( "geometries" ).distinct() @@ -185,8 +181,9 @@ class GeoReferencedTableFilterMixin(django_filters.FilterSet): """ matching_districts = District.objects.filter( - name__icontains=value - ) + Q(name__icontains=value) | + Q(key__icontains=value) + ).distinct() matching_parcels = Parcel.objects.filter( district__in=matching_districts ) @@ -209,7 +206,10 @@ class GeoReferencedTableFilterMixin(django_filters.FilterSet): Returns: """ - queryset = self._filter_parcel_reference(queryset, name, value, "parcel_group__name__icontains") + queryset = self._filter_parcel_reference( + queryset, + Q(parcel_group__name__icontains=value) | Q(parcel_group__key__icontains=value), + ) return queryset def filter_parcel(self, queryset, name, value) -> QuerySet: @@ -224,7 +224,10 @@ class GeoReferencedTableFilterMixin(django_filters.FilterSet): """ value = value.replace("-", "") - queryset = self._filter_parcel_reference(queryset, name, value, "flr") + queryset = self._filter_parcel_reference( + queryset, + Q(flr=value), + ) return queryset def filter_parcel_counter(self, queryset, name, value) -> QuerySet: @@ -239,7 +242,10 @@ class GeoReferencedTableFilterMixin(django_filters.FilterSet): """ value = value.replace("-", "") - queryset = self._filter_parcel_reference(queryset, name, value, "flrstck_zhlr") + queryset = self._filter_parcel_reference( + queryset, + Q(flrstck_zhlr=value) + ) return queryset def filter_parcel_number(self, queryset, name, value) -> QuerySet: @@ -254,7 +260,10 @@ class GeoReferencedTableFilterMixin(django_filters.FilterSet): """ value = value.replace("-", "") - queryset = self._filter_parcel_reference(queryset, name, value, "flrstck_nnr") + queryset = self._filter_parcel_reference( + queryset, + Q(flrstck_nnr=value), + ) return queryset From e93ea72019cfcc60472ac604e24f361f62eb22d6 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Mon, 11 Apr 2022 10:55:15 +0200 Subject: [PATCH 3/3] # 139 Doc update * updates doc --- konova/filters/mixins.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/konova/filters/mixins.py b/konova/filters/mixins.py index bad9f68..beb44da 100644 --- a/konova/filters/mixins.py +++ b/konova/filters/mixins.py @@ -146,9 +146,7 @@ class GeoReferencedTableFilterMixin(django_filters.FilterSet): abstract = True def _filter_parcel_reference(self, queryset, filter_q) -> QuerySet: - """ Filters the parcel entries by a given filter_value. - - filter_value may already include further filter annotations like 'xy__icontains' + """ Filters the parcel entries by a given filter_q Args: queryset (QuerySet): The queryset
{% trans 'Parcel group' %}{% trans 'Parcel group key' %} {% trans 'Parcel' %} {% trans 'Parcel counter' %} {% trans 'Parcel number' %}
{{parcel.district.krs|default_if_none:"-"}}{{parcel.gmrkng|default_if_none:"-"}}{{parcel.flr|default_if_none:"-"}}{{parcel.flrstck_zhlr|default_if_none:"-"}}{{parcel.flrstck_nnr|default_if_none:"-"}}{{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}}