From f441ed94f504e2174518a2959ea0e0b2eaffa022 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Thu, 3 Mar 2022 12:05:22 +0100 Subject: [PATCH 1/2] # 129 Handler code * adds handler code list usage to forms and models * updates tests * extends API for handler code handling --- .../create/ecoaccount_create_post_body.json | 5 +- api/tests/v1/create/ema_create_post_body.json | 5 +- .../create/intervention_create_post_body.json | 5 +- .../v1/update/ecoaccount_update_put_body.json | 5 +- api/tests/v1/update/ema_update_put_body.json | 5 +- .../update/intervention_update_put_body.json | 5 +- api/tests/v1/update/test_api_update.py | 4 +- api/utils/serializer/v1/ecoaccount.py | 18 ++- api/utils/serializer/v1/ema.py | 18 ++- api/utils/serializer/v1/intervention.py | 8 +- api/utils/serializer/v1/serializer.py | 18 ++- codelist/migrations/0001_initial.py | 7 +- compensation/forms/forms.py | 50 ++++++-- ema/forms.py | 22 +++- ema/tests/test_views.py | 4 +- intervention/forms/forms.py | 46 +++++-- .../migrations/0004_auto_20220303_0956.py | 64 +++++++++ intervention/models/responsibility.py | 43 ++++++- konova/autocompletes.py | 17 ++- konova/tests/test_views.py | 30 ++++- konova/urls.py | 4 +- locale/de/LC_MESSAGES/django.mo | Bin 40170 -> 40671 bytes locale/de/LC_MESSAGES/django.po | 121 +++++++++++------- 23 files changed, 395 insertions(+), 109 deletions(-) create mode 100644 intervention/migrations/0004_auto_20220303_0956.py diff --git a/api/tests/v1/create/ecoaccount_create_post_body.json b/api/tests/v1/create/ecoaccount_create_post_body.json index 742c0fb3..8300277d 100644 --- a/api/tests/v1/create/ecoaccount_create_post_body.json +++ b/api/tests/v1/create/ecoaccount_create_post_body.json @@ -8,7 +8,10 @@ "responsible": { "conservation_office": null, "conservation_file_number": null, - "handler": null + "handler": { + "type": null, + "detail": "Someone" + } }, "legal": { "agreement_date": null diff --git a/api/tests/v1/create/ema_create_post_body.json b/api/tests/v1/create/ema_create_post_body.json index d9081fb8..4949b7ab 100644 --- a/api/tests/v1/create/ema_create_post_body.json +++ b/api/tests/v1/create/ema_create_post_body.json @@ -7,7 +7,10 @@ "responsible": { "conservation_office": null, "conservation_file_number": null, - "handler": null + "handler": { + "type": null, + "detail": "Someone" + } }, "before_states": [ ], diff --git a/api/tests/v1/create/intervention_create_post_body.json b/api/tests/v1/create/intervention_create_post_body.json index 2d39919a..30def080 100644 --- a/api/tests/v1/create/intervention_create_post_body.json +++ b/api/tests/v1/create/intervention_create_post_body.json @@ -9,7 +9,10 @@ "registration_file_number": null, "conservation_office": null, "conservation_file_number": null, - "handler": null + "handler": { + "type": null, + "detail": "Someone" + } }, "legal": { "registration_date": null, diff --git a/api/tests/v1/update/ecoaccount_update_put_body.json b/api/tests/v1/update/ecoaccount_update_put_body.json index 7b62a127..ff636ff0 100644 --- a/api/tests/v1/update/ecoaccount_update_put_body.json +++ b/api/tests/v1/update/ecoaccount_update_put_body.json @@ -48,7 +48,10 @@ "responsible": { "conservation_office": null, "conservation_file_number": "123-TEST", - "handler": "TEST_HANDLER_CHANGED" + "handler": { + "type": null, + "detail": "TEST HANDLER CHANGED" + } }, "legal": { "agreement_date": "2022-01-11" diff --git a/api/tests/v1/update/ema_update_put_body.json b/api/tests/v1/update/ema_update_put_body.json index 933c4fc3..cc835850 100644 --- a/api/tests/v1/update/ema_update_put_body.json +++ b/api/tests/v1/update/ema_update_put_body.json @@ -47,7 +47,10 @@ "responsible": { "conservation_office": null, "conservation_file_number": "TEST_CHANGED", - "handler": "TEST_HANDLER_CHANGED" + "handler": { + "type": null, + "detail": "TEST_HANDLER_CHANGED" + } }, "before_states": [], "after_states": [], diff --git a/api/tests/v1/update/intervention_update_put_body.json b/api/tests/v1/update/intervention_update_put_body.json index 0376424a..df1d6e64 100644 --- a/api/tests/v1/update/intervention_update_put_body.json +++ b/api/tests/v1/update/intervention_update_put_body.json @@ -49,7 +49,10 @@ "registration_file_number": "CHANGED", "conservation_office": null, "conservation_file_number": "CHANGED", - "handler": null + "handler": { + "type": null, + "detail": "TEST_HANDLER_CHANGED" + } }, "legal": { "registration_date": "2022-02-01", diff --git a/api/tests/v1/update/test_api_update.py b/api/tests/v1/update/test_api_update.py index 500aec24..bfc670bc 100644 --- a/api/tests/v1/update/test_api_update.py +++ b/api/tests/v1/update/test_api_update.py @@ -126,7 +126,7 @@ class APIV1UpdateTestCase(BaseAPIV1TestCase): self.assertEqual(put_props["deductable_surface"], str(self.eco_account.deductable_surface)) self.assertEqual(put_props["responsible"]["conservation_office"], self.eco_account.responsible.conservation_office) self.assertEqual(put_props["responsible"]["conservation_file_number"], self.eco_account.responsible.conservation_file_number) - self.assertEqual(put_props["responsible"]["handler"], self.eco_account.responsible.handler) + self.assertEqual(put_props["responsible"]["handler"]["detail"], self.eco_account.responsible.handler.detail) self.assertEqual(put_props["legal"]["agreement_date"], str(self.eco_account.legal.registration_date)) self.assertEqual(len(put_props["actions"]), self.eco_account.actions.count()) self.assertEqual(len(put_props["before_states"]), self.eco_account.before_states.count()) @@ -156,7 +156,7 @@ class APIV1UpdateTestCase(BaseAPIV1TestCase): self.assertNotEqual(modified_on, self.ema.modified) self.assertEqual(put_props["responsible"]["conservation_office"], self.ema.responsible.conservation_office) self.assertEqual(put_props["responsible"]["conservation_file_number"], self.ema.responsible.conservation_file_number) - self.assertEqual(put_props["responsible"]["handler"], self.ema.responsible.handler) + self.assertEqual(put_props["responsible"]["handler"]["detail"], self.ema.responsible.handler.detail) self.assertEqual(len(put_props["actions"]), self.ema.actions.count()) self.assertEqual(len(put_props["before_states"]), self.ema.before_states.count()) self.assertEqual(len(put_props["after_states"]), self.ema.after_states.count()) diff --git a/api/utils/serializer/v1/ecoaccount.py b/api/utils/serializer/v1/ecoaccount.py index 0c3e1399..241d3624 100644 --- a/api/utils/serializer/v1/ecoaccount.py +++ b/api/utils/serializer/v1/ecoaccount.py @@ -9,9 +9,9 @@ from django.db import transaction from api.utils.serializer.v1.serializer import AbstractModelAPISerializerV1, AbstractCompensationAPISerializerV1Mixin, \ LegalAPISerializerV1Mixin, ResponsibilityAPISerializerV1Mixin, DeductableAPISerializerV1Mixin -from codelist.settings import CODELIST_CONSERVATION_OFFICE_ID +from codelist.settings import CODELIST_CONSERVATION_OFFICE_ID, CODELIST_COMPENSATION_HANDLER_ID from compensation.models import EcoAccount -from intervention.models import Legal, Responsibility +from intervention.models import Legal, Responsibility, Handler from konova.models import Geometry from konova.tasks import celery_update_parcels from user.models import UserActionLogEntry @@ -44,7 +44,7 @@ class EcoAccountAPISerializerV1(AbstractModelAPISerializerV1, return { "conservation_office": self._konova_code_to_json(responsible.conservation_office), "conservation_file_number": responsible.conservation_file_number, - "handler": responsible.handler, + "handler": self._handler_to_json(responsible.handler), } def _set_responsibility(self, obj, responsibility_data: dict): @@ -64,7 +64,11 @@ class EcoAccountAPISerializerV1(AbstractModelAPISerializerV1, CODELIST_CONSERVATION_OFFICE_ID, ) obj.responsible.conservation_file_number = responsibility_data["conservation_file_number"] - obj.responsible.handler = responsibility_data["handler"] + obj.responsible.handler.type = self._konova_code_from_json( + responsibility_data["handler"]["type"], + CODELIST_COMPENSATION_HANDLER_ID, + ) + obj.responsible.handler.detail = responsibility_data["handler"]["detail"] return obj def _set_legal(self, obj, legal_data): @@ -92,7 +96,9 @@ class EcoAccountAPISerializerV1(AbstractModelAPISerializerV1, # Create linked objects obj = EcoAccount() - obj.responsible = Responsibility() + obj.responsible = Responsibility( + handler=Handler() + ) obj.legal = Legal() created = create_action obj.created = created @@ -128,6 +134,7 @@ class EcoAccountAPISerializerV1(AbstractModelAPISerializerV1, obj = self._set_legal(obj, properties["legal"]) obj.geometry.save() + obj.responsible.handler.save() obj.responsible.save() obj.legal.save() obj.save() @@ -170,6 +177,7 @@ class EcoAccountAPISerializerV1(AbstractModelAPISerializerV1, obj = self._set_legal(obj, properties["legal"]) obj.geometry.save() + obj.responsible.handler.save() obj.responsible.save() obj.legal.save() obj.save() diff --git a/api/utils/serializer/v1/ema.py b/api/utils/serializer/v1/ema.py index 547f223f..548a7dbf 100644 --- a/api/utils/serializer/v1/ema.py +++ b/api/utils/serializer/v1/ema.py @@ -9,9 +9,9 @@ from django.db import transaction from api.utils.serializer.v1.serializer import AbstractModelAPISerializerV1, AbstractCompensationAPISerializerV1Mixin, \ ResponsibilityAPISerializerV1Mixin -from codelist.settings import CODELIST_CONSERVATION_OFFICE_ID +from codelist.settings import CODELIST_CONSERVATION_OFFICE_ID, CODELIST_COMPENSATION_HANDLER_ID from ema.models import Ema -from intervention.models import Responsibility +from intervention.models import Responsibility, Handler from konova.models import Geometry from konova.tasks import celery_update_parcels from user.models import UserActionLogEntry @@ -31,7 +31,7 @@ class EmaAPISerializerV1(AbstractModelAPISerializerV1, AbstractCompensationAPISe return { "conservation_office": self._konova_code_to_json(responsible.conservation_office), "conservation_file_number": responsible.conservation_file_number, - "handler": responsible.handler, + "handler": self._handler_to_json(responsible.handler), } def _set_responsibility(self, obj, responsibility_data: dict): @@ -51,7 +51,11 @@ class EmaAPISerializerV1(AbstractModelAPISerializerV1, AbstractCompensationAPISe CODELIST_CONSERVATION_OFFICE_ID, ) obj.responsible.conservation_file_number = responsibility_data["conservation_file_number"] - obj.responsible.handler = responsibility_data["handler"] + obj.responsible.handler.type = self._konova_code_from_json( + responsibility_data["handler"]["type"], + CODELIST_COMPENSATION_HANDLER_ID, + ) + obj.responsible.handler.detail = responsibility_data["handler"]["detail"] return obj def _initialize_objects(self, json_model, user): @@ -75,7 +79,9 @@ class EmaAPISerializerV1(AbstractModelAPISerializerV1, AbstractCompensationAPISe # Create linked objects obj = Ema() - obj.responsible = Responsibility() + obj.responsible = Responsibility( + handler=Handler() + ) created = create_action obj.created = created obj.geometry = geometry @@ -101,6 +107,7 @@ class EmaAPISerializerV1(AbstractModelAPISerializerV1, AbstractCompensationAPISe obj = self._set_responsibility(obj, properties["responsible"]) obj.geometry.save() + obj.responsible.handler.save() obj.responsible.save() obj.save() @@ -140,6 +147,7 @@ class EmaAPISerializerV1(AbstractModelAPISerializerV1, AbstractCompensationAPISe obj = self._set_responsibility(obj, properties["responsible"]) obj.geometry.save() + obj.responsible.handler.save() obj.responsible.save() obj.save() diff --git a/api/utils/serializer/v1/intervention.py b/api/utils/serializer/v1/intervention.py index 9fa7b71c..1ce2d684 100644 --- a/api/utils/serializer/v1/intervention.py +++ b/api/utils/serializer/v1/intervention.py @@ -11,7 +11,7 @@ from django.db.models import QuerySet from api.utils.serializer.v1.serializer import AbstractModelAPISerializerV1, \ ResponsibilityAPISerializerV1Mixin, LegalAPISerializerV1Mixin, DeductableAPISerializerV1Mixin from compensation.models import Payment -from intervention.models import Intervention, Responsibility, Legal +from intervention.models import Intervention, Responsibility, Legal, Handler from konova.models import Geometry from konova.tasks import celery_update_parcels from user.models import UserActionLogEntry @@ -69,7 +69,9 @@ class InterventionAPISerializerV1(AbstractModelAPISerializerV1, # Create linked objects obj = Intervention() - resp = Responsibility() + resp = Responsibility( + handler=Handler() + ) legal = Legal() created = create_action obj.legal = legal @@ -152,6 +154,7 @@ class InterventionAPISerializerV1(AbstractModelAPISerializerV1, self._set_responsibility(obj, properties["responsible"]) self._set_legal(obj, properties["legal"]) + obj.responsible.handler.save() obj.responsible.save() obj.geometry.save() obj.legal.save() @@ -188,6 +191,7 @@ class InterventionAPISerializerV1(AbstractModelAPISerializerV1, obj.geometry.geom = self._create_geometry_from_json(json_model) obj.geometry.modified = update_action + obj.responsible.handler.save() obj.responsible.save() obj.geometry.save() obj.legal.save() diff --git a/api/utils/serializer/v1/serializer.py b/api/utils/serializer/v1/serializer.py index caae2de3..924b6e3b 100644 --- a/api/utils/serializer/v1/serializer.py +++ b/api/utils/serializer/v1/serializer.py @@ -15,9 +15,9 @@ from api.utils.serializer.serializer import AbstractModelAPISerializer from codelist.models import KonovaCode from codelist.settings import CODELIST_COMPENSATION_ACTION_ID, CODELIST_BIOTOPES_ID, CODELIST_PROCESS_TYPE_ID, \ CODELIST_LAW_ID, CODELIST_REGISTRATION_OFFICE_ID, CODELIST_CONSERVATION_OFFICE_ID, \ - CODELIST_COMPENSATION_ACTION_DETAIL_ID, CODELIST_BIOTOPES_EXTRA_CODES_ID + CODELIST_COMPENSATION_ACTION_DETAIL_ID, CODELIST_BIOTOPES_EXTRA_CODES_ID, CODELIST_COMPENSATION_HANDLER_ID from compensation.models import CompensationAction, UnitChoices, CompensationState -from intervention.models import Responsibility, Legal +from intervention.models import Responsibility, Legal, Handler from konova.models import Deadline, DeadlineType from konova.utils.message_templates import DATA_UNSHARED @@ -176,6 +176,12 @@ class ResponsibilityAPISerializerV1Mixin: class Meta: abstract = True + def _handler_to_json(self, handler: Handler): + return { + "type": self._konova_code_to_json(handler.type), + "detail": handler.detail + } + def _responsible_to_json(self, responsible: Responsibility): """ Serializes Responsibility model into json @@ -190,7 +196,7 @@ class ResponsibilityAPISerializerV1Mixin: "registration_file_number": responsible.registration_file_number, "conservation_office": self._konova_code_to_json(responsible.conservation_office), "conservation_file_number": responsible.conservation_file_number, - "handler": responsible.handler, + "handler": self._handler_to_json(responsible.handler), } def _set_responsibility(self, obj, responsibility_data: dict): @@ -215,7 +221,11 @@ class ResponsibilityAPISerializerV1Mixin: CODELIST_CONSERVATION_OFFICE_ID, ) obj.responsible.conservation_file_number = responsibility_data["conservation_file_number"] - obj.responsible.handler = responsibility_data["handler"] + obj.responsible.handler.type = self._konova_code_from_json( + responsibility_data["handler"]["type"], + CODELIST_COMPENSATION_HANDLER_ID, + ) + obj.responsible.handler.detail = responsibility_data["handler"]["detail"] return obj diff --git a/codelist/migrations/0001_initial.py b/codelist/migrations/0001_initial.py index 7962e3c7..cb9f9cb3 100644 --- a/codelist/migrations/0001_initial.py +++ b/codelist/migrations/0001_initial.py @@ -1,9 +1,13 @@ # Generated by Django 3.1.3 on 2022-01-14 08:36 - +from django.core.management import call_command from django.db import migrations, models import django.db.models.deletion +def load_initial_codes(apps, schema_editor): + call_command('update_codelist') + + class Migration(migrations.Migration): initial = True @@ -32,4 +36,5 @@ class Migration(migrations.Migration): ('codes', models.ManyToManyField(blank=True, help_text='Codes for this list', related_name='code_lists', to='codelist.KonovaCode')), ], ), + migrations.RunPython(load_initial_codes), ] diff --git a/compensation/forms/forms.py b/compensation/forms/forms.py index 46b235fa..768a6fed 100644 --- a/compensation/forms/forms.py +++ b/compensation/forms/forms.py @@ -13,10 +13,10 @@ from django.utils.translation import gettext_lazy as _ from django import forms from codelist.models import KonovaCode -from codelist.settings import CODELIST_CONSERVATION_OFFICE_ID +from codelist.settings import CODELIST_CONSERVATION_OFFICE_ID, CODELIST_COMPENSATION_HANDLER_ID from compensation.models import Compensation, EcoAccount from intervention.inputs import GenerateInput -from intervention.models import Intervention, Responsibility, Legal +from intervention.models import Intervention, Responsibility, Legal, Handler from konova.forms import BaseForm, SimpleGeomForm from konova.utils.message_templates import EDITED_GENERAL_DATA, COMPENSATION_ADDED_TEMPLATE from user.models import UserActionLogEntry @@ -101,12 +101,30 @@ class CompensationResponsibleFormMixin(forms.Form): } ) ) - handler = forms.CharField( - label=_("Eco-account handler"), + + handler_type = forms.ModelChoiceField( + label=_("Eco-Account handler type"), + label_suffix="", + help_text=_("What type of handler is responsible for the ecoaccount?"), + required=False, + queryset=KonovaCode.objects.filter( + is_archived=False, + is_leaf=True, + code_lists__in=[CODELIST_COMPENSATION_HANDLER_ID], + ), + widget=autocomplete.ModelSelect2( + url="codes-handler-autocomplete", + attrs={ + "data-placeholder": _("Click for selection"), + } + ), + ) + handler_detail = forms.CharField( + label=_("Eco-Account handler detail"), label_suffix="", max_length=255, required=False, - help_text=_("Who handles the eco-account"), + help_text=_("Detail input on the handler"), widget=forms.TextInput( attrs={ "placeholder": _("Company Mustermann"), @@ -345,7 +363,8 @@ class NewEcoAccountForm(AbstractCompensationForm, CompensationResponsibleFormMix "registration_date", "surface", "conservation_file_number", - "handler", + "handler_type", + "handler_detail", "comment", ] @@ -368,7 +387,8 @@ class NewEcoAccountForm(AbstractCompensationForm, CompensationResponsibleFormMix identifier = self.cleaned_data.get("identifier", None) title = self.cleaned_data.get("title", None) registration_date = self.cleaned_data.get("registration_date", None) - handler = self.cleaned_data.get("handler", None) + handler_type = self.cleaned_data.get("handler_type", None) + handler_detail = self.cleaned_data.get("handler_detail", None) surface = self.cleaned_data.get("surface", None) conservation_office = self.cleaned_data.get("conservation_office", None) conservation_file_number = self.cleaned_data.get("conservation_file_number", None) @@ -379,6 +399,11 @@ class NewEcoAccountForm(AbstractCompensationForm, CompensationResponsibleFormMix # Process the geometry form geometry = geom_form.save(action) + handler = Handler.objects.create( + type=handler_type, + detail=handler_detail, + ) + responsible = Responsibility.objects.create( handler=handler, conservation_file_number=conservation_file_number, @@ -423,11 +448,13 @@ class EditEcoAccountForm(NewEcoAccountForm): reg_date = self.instance.legal.registration_date if reg_date is not None: reg_date = reg_date.isoformat() + form_data = { "identifier": self.instance.identifier, "title": self.instance.title, "surface": self.instance.deductable_surface, - "handler": self.instance.responsible.handler, + "handler_type": self.instance.responsible.handler.type, + "handler_detail": self.instance.responsible.handler.detail, "registration_date": reg_date, "conservation_office": self.instance.responsible.conservation_office, "conservation_file_number": self.instance.responsible.conservation_file_number, @@ -445,7 +472,8 @@ class EditEcoAccountForm(NewEcoAccountForm): identifier = self.cleaned_data.get("identifier", None) title = self.cleaned_data.get("title", None) registration_date = self.cleaned_data.get("registration_date", None) - handler = self.cleaned_data.get("handler", None) + handler_type = self.cleaned_data.get("handler_type", None) + handler_detail = self.cleaned_data.get("handler_detail", None) surface = self.cleaned_data.get("surface", None) conservation_office = self.cleaned_data.get("conservation_office", None) conservation_file_number = self.cleaned_data.get("conservation_file_number", None) @@ -458,7 +486,9 @@ class EditEcoAccountForm(NewEcoAccountForm): geometry = geom_form.save(action) # Update responsible data - self.instance.responsible.handler = handler + self.instance.responsible.handler.type = handler_type + self.instance.responsible.handler.detail = handler_detail + self.instance.responsible.handler.save() self.instance.responsible.conservation_office = conservation_office self.instance.responsible.conservation_file_number = conservation_file_number self.instance.responsible.save() diff --git a/ema/forms.py b/ema/forms.py index 8e6faab7..91b8de19 100644 --- a/ema/forms.py +++ b/ema/forms.py @@ -14,7 +14,7 @@ from django.utils.translation import gettext_lazy as _ from compensation.forms.forms import AbstractCompensationForm, CompensationResponsibleFormMixin from ema.models import Ema, EmaDocument -from intervention.models import Responsibility +from intervention.models import Responsibility, Handler from konova.forms import SimpleGeomForm, NewDocumentModalForm from user.models import UserActionLogEntry @@ -31,7 +31,8 @@ class NewEmaForm(AbstractCompensationForm, CompensationResponsibleFormMixin): "title", "conservation_office", "conservation_file_number", - "handler", + "handler_type", + "handler_detail", "comment", ] @@ -53,7 +54,8 @@ class NewEmaForm(AbstractCompensationForm, CompensationResponsibleFormMixin): # Fetch data from cleaned POST values identifier = self.cleaned_data.get("identifier", None) title = self.cleaned_data.get("title", None) - handler = self.cleaned_data.get("handler", None) + handler_type = self.cleaned_data.get("handler_type", None) + handler_detail = self.cleaned_data.get("handler_detail", None) conservation_office = self.cleaned_data.get("conservation_office", None) conservation_file_number = self.cleaned_data.get("conservation_file_number", None) comment = self.cleaned_data.get("comment", None) @@ -63,6 +65,10 @@ class NewEmaForm(AbstractCompensationForm, CompensationResponsibleFormMixin): # Process the geometry form geometry = geom_form.save(action) + handler = Handler.objects.create( + type=handler_type, + detail=handler_detail + ) responsible = Responsibility.objects.create( handler=handler, conservation_file_number=conservation_file_number, @@ -105,7 +111,8 @@ class EditEmaForm(NewEmaForm): form_data = { "identifier": self.instance.identifier, "title": self.instance.title, - "handler": self.instance.responsible.handler, + "handler_type": self.instance.responsible.handler.type, + "handler_detail": self.instance.responsible.handler.detail, "conservation_office": self.instance.responsible.conservation_office, "conservation_file_number": self.instance.responsible.conservation_file_number, "comment": self.instance.comment, @@ -121,7 +128,8 @@ class EditEmaForm(NewEmaForm): # Fetch data from cleaned POST values identifier = self.cleaned_data.get("identifier", None) title = self.cleaned_data.get("title", None) - handler = self.cleaned_data.get("handler", None) + handler_type = self.cleaned_data.get("handler_type", None) + handler_detail = self.cleaned_data.get("handler_detail", None) conservation_office = self.cleaned_data.get("conservation_office", None) conservation_file_number = self.cleaned_data.get("conservation_file_number", None) comment = self.cleaned_data.get("comment", None) @@ -132,7 +140,9 @@ class EditEmaForm(NewEmaForm): geometry = geom_form.save(action) # Update responsible data - self.instance.responsible.handler = handler + self.instance.responsible.handler.type = handler_type + self.instance.responsible.handler.detail = handler_detail + self.instance.responsible.handler.save() self.instance.responsible.conservation_office = conservation_office self.instance.responsible.conservation_file_number = conservation_file_number self.instance.responsible.save() diff --git a/ema/tests/test_views.py b/ema/tests/test_views.py index b2c23e11..b0cba9a3 100644 --- a/ema/tests/test_views.py +++ b/ema/tests/test_views.py @@ -79,7 +79,9 @@ class EmaViewTestCase(CompensationViewTestCase): # Create log entry action = UserActionLogEntry.get_created_action(self.superuser) # Create responsible data object - responsibility_data = Responsibility.objects.create() + responsibility_data = Responsibility.objects.create( + handler=self.handler + ) geometry = Geometry.objects.create() self.ema = Ema.objects.create( identifier="TEST", diff --git a/intervention/forms/forms.py b/intervention/forms/forms.py index 94ff9704..1ed10e19 100644 --- a/intervention/forms/forms.py +++ b/intervention/forms/forms.py @@ -16,9 +16,9 @@ from django.utils.translation import gettext_lazy as _ from codelist.models import KonovaCode from codelist.settings import CODELIST_PROCESS_TYPE_ID, CODELIST_LAW_ID, \ - CODELIST_REGISTRATION_OFFICE_ID, CODELIST_CONSERVATION_OFFICE_ID + CODELIST_REGISTRATION_OFFICE_ID, CODELIST_CONSERVATION_OFFICE_ID, CODELIST_COMPENSATION_HANDLER_ID from intervention.inputs import GenerateInput -from intervention.models import Intervention, Legal, Responsibility +from intervention.models import Intervention, Legal, Responsibility, Handler from konova.forms import BaseForm, SimpleGeomForm from user.models import UserActionLogEntry @@ -138,12 +138,29 @@ class NewInterventionForm(BaseForm): } ) ) - handler = forms.CharField( - label=_("Intervention handler"), + handler_type = forms.ModelChoiceField( + label=_("Intervention handler type"), + label_suffix="", + help_text=_("What type of handler is responsible for the intervention?"), + required=False, + queryset=KonovaCode.objects.filter( + is_archived=False, + is_leaf=True, + code_lists__in=[CODELIST_COMPENSATION_HANDLER_ID], + ), + widget=autocomplete.ModelSelect2( + url="codes-handler-autocomplete", + attrs={ + "data-placeholder": _("Click for selection"), + } + ), + ) + handler_detail = forms.CharField( + label=_("Intervention handler detail"), label_suffix="", max_length=255, required=False, - help_text=_("Who performs the intervention"), + help_text=_("Detail input on the handler"), widget=forms.TextInput( attrs={ "placeholder": _("Company Mustermann"), @@ -151,6 +168,7 @@ class NewInterventionForm(BaseForm): } ) ) + registration_date = forms.DateField( label=_("Registration date"), label_suffix=_(""), @@ -205,7 +223,8 @@ class NewInterventionForm(BaseForm): title = self.cleaned_data.get("title", None) _type = self.cleaned_data.get("type", None) laws = self.cleaned_data.get("laws", None) - handler = self.cleaned_data.get("handler", None) + handler_type = self.cleaned_data.get("handler_type", None) + handler_detail = self.cleaned_data.get("handler_detail", None) registration_office = self.cleaned_data.get("registration_office", None) conservation_office = self.cleaned_data.get("conservation_office", None) conservation_file_number = self.cleaned_data.get("conservation_file_number", None) @@ -226,6 +245,10 @@ class NewInterventionForm(BaseForm): # Then add the M2M laws to the object legal_data.laws.set(laws) + handler = Handler.objects.create( + type=handler_type, + detail=handler_detail + ) # Create responsible data object responsibility_data = Responsibility.objects.create( registration_office=registration_office, @@ -284,7 +307,8 @@ class EditInterventionForm(NewInterventionForm): "title": self.instance.title, "type": self.instance.legal.process_type, "laws": list(self.instance.legal.laws.values_list("id", flat=True)), - "handler": self.instance.responsible.handler, + "handler_type": self.instance.responsible.handler.type, + "handler_detail": self.instance.responsible.handler.detail, "registration_office": self.instance.responsible.registration_office, "registration_file_number": self.instance.responsible.registration_file_number, "conservation_office": self.instance.responsible.conservation_office, @@ -313,7 +337,8 @@ class EditInterventionForm(NewInterventionForm): title = self.cleaned_data.get("title", None) process_type = self.cleaned_data.get("type", None) laws = self.cleaned_data.get("laws", None) - handler = self.cleaned_data.get("handler", None) + handler_type = self.cleaned_data.get("handler_type", None) + handler_detail = self.cleaned_data.get("handler_detail", None) registration_office = self.cleaned_data.get("registration_office", None) registration_file_number = self.cleaned_data.get("registration_file_number", None) conservation_office = self.cleaned_data.get("conservation_office", None) @@ -328,7 +353,10 @@ class EditInterventionForm(NewInterventionForm): self.instance.legal.laws.set(laws) self.instance.legal.save() - self.instance.responsible.handler = handler + self.instance.responsible.handler.type = handler_type + self.instance.responsible.handler.detail = handler_detail + self.instance.responsible.handler.save() + self.instance.responsible.registration_office = registration_office self.instance.responsible.registration_file_number = registration_file_number self.instance.responsible.conservation_office = conservation_office diff --git a/intervention/migrations/0004_auto_20220303_0956.py b/intervention/migrations/0004_auto_20220303_0956.py new file mode 100644 index 00000000..508dba8e --- /dev/null +++ b/intervention/migrations/0004_auto_20220303_0956.py @@ -0,0 +1,64 @@ +# Generated by Django 3.1.3 on 2022-03-03 08:56 +from django.db import migrations, models, transaction +import django.db.models.deletion +import uuid + + +def migrate_handler(apps, schema_editor): + KonovaCode = apps.get_model('codelist', 'KonovaCode') + + Responsibility = apps.get_model('intervention', 'Responsibility') + Handler = apps.get_model('intervention', 'Handler') + all_responsibs = Responsibility.objects.all() + + if all_responsibs.exists(): + handler_tmp_code = KonovaCode.objects.get( + atom_id=710185, + ) + + with transaction.atomic(): + for resp in all_responsibs: + handler_old = resp.handler_old + handler = Handler.objects.create( + type=handler_tmp_code, + detail=handler_old + ) + resp.handler = handler + resp.save() + + +class Migration(migrations.Migration): + + dependencies = [ + ('codelist', '0001_initial'), + ('intervention', '0003_intervention_teams'), + ] + + operations = [ + migrations.CreateModel( + name='Handler', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ('detail', models.CharField(blank=True, max_length=500, null=True)), + ('type', models.ForeignKey(blank=True, limit_choices_to={'code_lists__in': [1052], 'is_archived': False, 'is_selectable': True}, null=True, on_delete=django.db.models.deletion.SET_NULL, to='codelist.konovacode')), + ], + options={ + 'abstract': False, + }, + ), + migrations.RenameField( + model_name='responsibility', + old_name='handler', + new_name='handler_old', + ), + migrations.AddField( + model_name='responsibility', + name='handler', + field=models.ForeignKey(blank=True, help_text="Refers to 'Eingriffsverursacher' or 'Maßnahmenträger'", null=True, on_delete=django.db.models.deletion.SET_NULL, to='intervention.handler'), + ), + migrations.RunPython(migrate_handler), + migrations.RemoveField( + model_name='responsibility', + name='handler_old' + ), + ] diff --git a/intervention/models/responsibility.py b/intervention/models/responsibility.py index 19234acd..6f34ba5b 100644 --- a/intervention/models/responsibility.py +++ b/intervention/models/responsibility.py @@ -6,12 +6,43 @@ Created on: 15.11.21 """ from django.db import models +from django.utils.translation import gettext_lazy as _ from codelist.models import KonovaCode -from codelist.settings import CODELIST_CONSERVATION_OFFICE_ID, CODELIST_REGISTRATION_OFFICE_ID +from codelist.settings import CODELIST_CONSERVATION_OFFICE_ID, CODELIST_REGISTRATION_OFFICE_ID, \ + CODELIST_COMPENSATION_HANDLER_ID from konova.models import UuidModel +class Handler(UuidModel): + """ The handler of an entry + + Refers to 'Eingriffsverursacher' or 'Maßnahmenträger' + + """ + type = models.ForeignKey( + KonovaCode, + on_delete=models.SET_NULL, + null=True, + blank=True, + limit_choices_to={ + "code_lists__in": [CODELIST_COMPENSATION_HANDLER_ID], + "is_selectable": True, + "is_archived": False, + } + ) + detail = models.CharField( + max_length=500, + null=True, + blank=True, + ) + + def __str__(self): + detail = self.detail or _("no further details") + _type = self.type.long_name if self.type is not None else None + return f'{_type}, {detail}' + + class Responsibility(UuidModel): """ Holds intervention data about responsible organizations and their file numbers for this case @@ -43,11 +74,17 @@ class Responsibility(UuidModel): } ) conservation_file_number = models.CharField(max_length=1000, blank=True, null=True) - handler = models.CharField(max_length=500, null=True, blank=True, help_text="Refers to 'Eingriffsverursacher' or 'Maßnahmenträger'") + handler = models.ForeignKey( + Handler, + null=True, + blank=True, + help_text="Refers to 'Eingriffsverursacher' or 'Maßnahmenträger'", + on_delete=models.SET_NULL, + ) def __str__(self): return "ZB: {} | ETS: {} | Handler: {}".format( self.registration_office, self.conservation_office, - self.handler + str(self.handler) ) diff --git a/konova/autocompletes.py b/konova/autocompletes.py index 5ecc50d6..0b498517 100644 --- a/konova/autocompletes.py +++ b/konova/autocompletes.py @@ -17,7 +17,7 @@ from django.db.models import Q from codelist.models import KonovaCode from codelist.settings import CODELIST_COMPENSATION_ACTION_ID, CODELIST_BIOTOPES_ID, CODELIST_LAW_ID, \ CODELIST_REGISTRATION_OFFICE_ID, CODELIST_CONSERVATION_OFFICE_ID, CODELIST_PROCESS_TYPE_ID, \ - CODELIST_BIOTOPES_EXTRA_CODES_ID, CODELIST_COMPENSATION_ACTION_DETAIL_ID + CODELIST_BIOTOPES_EXTRA_CODES_ID, CODELIST_COMPENSATION_ACTION_DETAIL_ID, CODELIST_COMPENSATION_HANDLER_ID from compensation.models import EcoAccount from intervention.models import Intervention @@ -357,3 +357,18 @@ class ConservationOfficeCodeAutocomplete(KonovaCodeAutocomplete): def get_result_label(self, result): return f"{result.long_name} ({result.short_name})" + + +class HandlerCodeAutocomplete(KonovaCodeAutocomplete): + """ + Due to limitations of the django dal package, we need to subclass for each code list + """ + group_by_related = "parent" + related_field_name = "long_name" + + def __init__(self, *args, **kwargs): + self.c = CODELIST_COMPENSATION_HANDLER_ID + super().__init__(*args, **kwargs) + + def get_result_label(self, result): + return result.long_name diff --git a/konova/tests/test_views.py b/konova/tests/test_views.py index d84c0516..28b3f8a2 100644 --- a/konova/tests/test_views.py +++ b/konova/tests/test_views.py @@ -18,7 +18,7 @@ from django.urls import reverse from codelist.models import KonovaCode, KonovaCodeList from compensation.models import Compensation, CompensationState, CompensationAction, EcoAccount, EcoAccountDeduction -from intervention.models import Legal, Responsibility, Intervention +from intervention.models import Legal, Responsibility, Intervention, Handler from konova.management.commands.setup_data import GROUPS_DATA from konova.models import Geometry from konova.settings import DEFAULT_GROUP @@ -57,6 +57,7 @@ class BaseTestCase(TestCase): self.create_users() self.create_groups() + self.handler = self.create_dummy_handler() self.intervention = self.create_dummy_intervention() self.compensation = self.create_dummy_compensation() self.eco_account = self.create_dummy_eco_account() @@ -122,7 +123,9 @@ class BaseTestCase(TestCase): # Create legal data object (without M2M laws first) legal_data = Legal.objects.create() # Create responsible data object - responsibility_data = Responsibility.objects.create() + responsibility_data = Responsibility.objects.create( + handler=self.handler + ) geometry = Geometry.objects.create() # Finally create main object, holding the other objects intervention = Intervention.objects.create( @@ -173,6 +176,9 @@ class BaseTestCase(TestCase): # Create responsible data object lega_data = Legal.objects.create() responsible_data = Responsibility.objects.create() + handler = self.handler + responsible_data.handler = handler + responsible_data.save() # Finally create main object, holding the other objects eco_account = EcoAccount.objects.create( identifier="TEST", @@ -197,6 +203,8 @@ class BaseTestCase(TestCase): geometry = Geometry.objects.create() # Create responsible data object responsible_data = Responsibility.objects.create() + responsible_data.handler = self.handler + responsible_data.save() # Finally create main object, holding the other objects ema = Ema.objects.create( identifier="TEST", @@ -282,6 +290,18 @@ class BaseTestCase(TestCase): polygon = polygon.transform(3857, clone=True) return MultiPolygon(polygon, srid=3857) # 3857 is the default srid used for MultiPolygonField in the form + def create_dummy_handler(self) -> Handler: + """ Creates a Handler + + Returns: + + """ + handler = Handler.objects.get_or_create( + type=KonovaCode.objects.all().first(), + detail="Test handler" + )[0] + return handler + def fill_out_intervention(self, intervention: Intervention) -> Intervention: """ Adds all required (dummy) data to an intervention @@ -295,7 +315,7 @@ class BaseTestCase(TestCase): intervention.responsible.conservation_office = KonovaCode.objects.get(id=2) intervention.responsible.registration_file_number = "test" intervention.responsible.conservation_file_number = "test" - intervention.responsible.handler = "handler" + intervention.responsible.handler = self.handler intervention.responsible.save() intervention.legal.registration_date = datetime.date.fromisoformat("1970-01-01") intervention.legal.binding_date = datetime.date.fromisoformat("1970-01-01") @@ -343,7 +363,7 @@ class BaseTestCase(TestCase): """ ema.responsible.conservation_office = self.get_conservation_office_code() ema.responsible.conservation_file_number = "test" - ema.responsible.handler = "handler" + ema.responsible.handler = self.handler ema.responsible.save() ema.after_states.add(self.comp_state) ema.before_states.add(self.comp_state) @@ -361,7 +381,7 @@ class BaseTestCase(TestCase): eco_account.legal.save() eco_account.responsible.conservation_office = self.get_conservation_office_code() eco_account.responsible.conservation_file_number = "test" - eco_account.responsible.handler = "handler" + eco_account.responsible.handler = self.handler eco_account.responsible.save() eco_account.after_states.add(self.comp_state) eco_account.before_states.add(self.comp_state) diff --git a/konova/urls.py b/konova/urls.py index 7f3b8972..d2458f50 100644 --- a/konova/urls.py +++ b/konova/urls.py @@ -20,7 +20,8 @@ from django.urls import path, include from konova.autocompletes import EcoAccountAutocomplete, \ InterventionAutocomplete, CompensationActionCodeAutocomplete, BiotopeCodeAutocomplete, LawCodeAutocomplete, \ RegistrationOfficeCodeAutocomplete, ConservationOfficeCodeAutocomplete, ProcessTypeCodeAutocomplete, \ - ShareUserAutocomplete, BiotopeExtraCodeAutocomplete, CompensationActionDetailCodeAutocomplete, ShareTeamAutocomplete + ShareUserAutocomplete, BiotopeExtraCodeAutocomplete, CompensationActionDetailCodeAutocomplete, \ + 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 @@ -52,6 +53,7 @@ urlpatterns = [ path("atcmplt/codes/prc-type", ProcessTypeCodeAutocomplete.as_view(), name="codes-process-type-autocomplete"), path("atcmplt/codes/reg-off", RegistrationOfficeCodeAutocomplete.as_view(), name="codes-registration-office-autocomplete"), path("atcmplt/codes/cons-off", ConservationOfficeCodeAutocomplete.as_view(), name="codes-conservation-office-autocomplete"), + path("atcmplt/codes/handler", HandlerCodeAutocomplete.as_view(), name="codes-handler-autocomplete"), path("atcmplt/share/u", ShareUserAutocomplete.as_view(), name="share-user-autocomplete"), path("atcmplt/share/t", ShareTeamAutocomplete.as_view(), name="share-team-autocomplete"), ] diff --git a/locale/de/LC_MESSAGES/django.mo b/locale/de/LC_MESSAGES/django.mo index 768357b402490838a801e80d698fa5cd550cc682..c032d7629dfbdce1ee10bfb6be2e607ea9be61a6 100644 GIT binary patch delta 12197 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

{SZunuR|_pv#)z`xAR zA*9EUo@er612LY6rOv}_8(HfMq7P-d+8C8C#66417botM->zSEUn3KtTCOvMC-EJ@ z3)Q~n`Ql}q*@-Esj+C^FoNPyWnj?F#(=j+PEjiVhnH$#RX%&-pB)jjk+9ajdYL%3f zo|BgS>^4XCs0?RrVAHvIJDUFKk-MsuSLn05pHItnW)63zWv9^cvzByw-nv%ZgItN( z?q?n81OKi}$#P^mvog}tvQh@5IvoSkGuY~)6|xq3wfoCc?(m3xu$y1%}t!2bXvO;Qv9 delta 11689 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 diff --git a/locale/de/LC_MESSAGES/django.po b/locale/de/LC_MESSAGES/django.po index 5d05c894..6edaeb1b 100644 --- a/locale/de/LC_MESSAGES/django.po +++ b/locale/de/LC_MESSAGES/django.po @@ -6,8 +6,8 @@ #: 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 -#: intervention/forms/forms.py:54 intervention/forms/forms.py:156 -#: intervention/forms/forms.py:168 intervention/forms/modalForms.py:150 +#: 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 #: konova/filters/mixins.py:53 konova/filters/mixins.py:54 #: konova/filters/mixins.py:81 konova/filters/mixins.py:82 @@ -26,7 +26,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2022-02-21 14:44+0100\n" +"POT-Creation-Date: 2022-03-03 10:50+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -61,9 +61,10 @@ msgid "Select the responsible office" msgstr "Verantwortliche Stelle" #: analysis/forms.py:58 compensation/forms/forms.py:88 -#: compensation/forms/forms.py:165 intervention/forms/forms.py:64 -#: intervention/forms/forms.py:81 intervention/forms/forms.py:97 -#: intervention/forms/forms.py:113 intervention/forms/modalForms.py:49 +#: compensation/forms/forms.py:118 compensation/forms/forms.py:183 +#: intervention/forms/forms.py:64 intervention/forms/forms.py:81 +#: intervention/forms/forms.py:97 intervention/forms/forms.py:113 +#: intervention/forms/forms.py:154 intervention/forms/modalForms.py:49 #: intervention/forms/modalForms.py:63 user/forms.py:196 msgid "Click for selection" msgstr "Auswählen..." @@ -349,7 +350,7 @@ msgstr "Bezeichnung" msgid "An explanatory name" msgstr "Aussagekräftiger Titel" -#: compensation/forms/forms.py:50 ema/forms.py:49 ema/forms.py:102 +#: compensation/forms/forms.py:50 ema/forms.py:50 ema/forms.py:108 msgid "Compensation XY; Location ABC" msgstr "Kompensation XY; Flur ABC" @@ -364,7 +365,7 @@ msgstr "Kompensation XY; Flur ABC" #: ema/templates/ema/detail/includes/actions.html:34 #: ema/templates/ema/detail/includes/deadlines.html:34 #: ema/templates/ema/detail/includes/documents.html:34 -#: intervention/forms/forms.py:180 intervention/forms/modalForms.py:175 +#: intervention/forms/forms.py:198 intervention/forms/modalForms.py:175 #: intervention/templates/intervention/detail/includes/documents.html:34 #: intervention/templates/intervention/detail/includes/payments.html:34 #: intervention/templates/intervention/detail/includes/revocation.html:38 @@ -373,7 +374,7 @@ msgid "Comment" msgstr "Kommentar" #: compensation/forms/forms.py:59 compensation/forms/modalForms.py:467 -#: intervention/forms/forms.py:182 +#: intervention/forms/forms.py:200 msgid "Additional comment" msgstr "Zusätzlicher Kommentar" @@ -393,80 +394,88 @@ msgstr "Aktenzeichen Eintragungsstelle" msgid "ETS-123/ABC.456" msgstr "" -#: compensation/forms/forms.py:105 -msgid "Eco-account handler" -msgstr "Maßnahmenträger" +#: compensation/forms/forms.py:106 +msgid "Eco-Account handler type" +msgstr "Art des Maßnahmenträgers" -#: compensation/forms/forms.py:109 -msgid "Who handles the eco-account" -msgstr "Wer für die Herrichtung des Ökokontos verantwortlich ist" +#: compensation/forms/forms.py:108 +msgid "What type of handler is responsible for the ecoaccount?" +msgstr "Zu welcher Kategorie dieser Maßnahmenträger gehört" -#: compensation/forms/forms.py:112 intervention/forms/forms.py:149 +#: compensation/forms/forms.py:123 +msgid "Eco-Account handler detail" +msgstr "Detailangabe zum Maßnahmenträger" + +#: compensation/forms/forms.py:127 intervention/forms/forms.py:163 +msgid "Detail input on the handler" +msgstr "Name der Behörde, Stadt, Firma, ..." + +#: compensation/forms/forms.py:130 intervention/forms/forms.py:166 msgid "Company Mustermann" msgstr "Firma Mustermann" -#: compensation/forms/forms.py:125 +#: compensation/forms/forms.py:143 msgid "Is CEF" msgstr "Ist CEF-Maßnahme" -#: compensation/forms/forms.py:126 +#: compensation/forms/forms.py:144 msgid "Optionally: Whether this compensation is a CEF compensation?" msgstr "Optional: Handelt es sich um eine CEF-Maßnahme?" -#: compensation/forms/forms.py:138 +#: compensation/forms/forms.py:156 msgid "Is coherence keeping" msgstr "Ist Kohärenzsicherungsmaßnahme" -#: compensation/forms/forms.py:139 +#: compensation/forms/forms.py:157 msgid "" "Optionally: Whether this compensation is a coherence keeping compensation?" msgstr "Optional: Handelt es sich um eine Kohärenzsicherungsmaßnahme?" -#: compensation/forms/forms.py:156 +#: compensation/forms/forms.py:174 #: compensation/templates/compensation/detail/compensation/view.html:36 #: compensation/templates/compensation/report/compensation/report.html:16 msgid "compensates intervention" msgstr "kompensiert Eingriff" -#: compensation/forms/forms.py:158 +#: compensation/forms/forms.py:176 msgid "Select the intervention for which this compensation compensates" msgstr "Wählen Sie den Eingriff, für den diese Kompensation bestimmt ist" -#: compensation/forms/forms.py:184 compensation/views/compensation.py:96 +#: compensation/forms/forms.py:202 compensation/views/compensation.py:96 msgid "New compensation" msgstr "Neue Kompensation" -#: compensation/forms/forms.py:255 +#: compensation/forms/forms.py:273 msgid "Edit compensation" msgstr "Bearbeite Kompensation" -#: compensation/forms/forms.py:316 compensation/utils/quality.py:84 +#: compensation/forms/forms.py:334 compensation/utils/quality.py:84 msgid "Available Surface" msgstr "Verfügbare Fläche" -#: compensation/forms/forms.py:319 +#: compensation/forms/forms.py:337 msgid "The amount that can be used for deductions" msgstr "Die für Abbuchungen zur Verfügung stehende Menge" -#: compensation/forms/forms.py:328 +#: compensation/forms/forms.py:346 #: compensation/templates/compensation/detail/eco_account/view.html:67 #: compensation/utils/quality.py:72 msgid "Agreement date" msgstr "Vereinbarungsdatum" -#: compensation/forms/forms.py:330 +#: compensation/forms/forms.py:348 msgid "When did the parties agree on this?" msgstr "Wann wurde dieses Ökokonto offiziell vereinbart?" -#: compensation/forms/forms.py:354 compensation/views/eco_account.py:107 +#: compensation/forms/forms.py:373 compensation/views/eco_account.py:107 msgid "New Eco-Account" msgstr "Neues Ökokonto" -#: compensation/forms/forms.py:363 +#: compensation/forms/forms.py:382 msgid "Eco-Account XY; Location ABC" msgstr "Ökokonto XY; Flur ABC" -#: compensation/forms/forms.py:417 +#: compensation/forms/forms.py:442 msgid "Edit Eco-Account" msgstr "Ökokonto bearbeiten" @@ -1215,11 +1224,11 @@ msgstr "Freigabelink ungültig" msgid "Share settings updated" msgstr "Freigabe Einstellungen aktualisiert" -#: ema/forms.py:40 ema/views.py:98 +#: ema/forms.py:41 ema/views.py:98 msgid "New EMA" msgstr "Neue EMA hinzufügen" -#: ema/forms.py:96 +#: ema/forms.py:102 msgid "Edit EMA" msgstr "Bearbeite EMA" @@ -1293,33 +1302,35 @@ msgid "ZB-123/ABC.456" msgstr "" #: intervention/forms/forms.py:142 -#: intervention/templates/intervention/detail/view.html:64 -#: intervention/utils/quality.py:52 -msgid "Intervention handler" -msgstr "Eingriffsverursacher" +msgid "Intervention handler type" +msgstr "Art des Eingriffsverursachers" -#: intervention/forms/forms.py:146 -msgid "Who performs the intervention" -msgstr "Wer führt den Eingriff durch" +#: intervention/forms/forms.py:144 +msgid "What type of handler is responsible for the intervention?" +msgstr "Zu welcher Kategorie dieser Eingriffsverursacher gehört" -#: intervention/forms/forms.py:155 +#: intervention/forms/forms.py:159 +msgid "Intervention handler detail" +msgstr "Detailangabe zum Eingriffsverursacher" + +#: intervention/forms/forms.py:173 #: intervention/templates/intervention/detail/view.html:96 #: intervention/templates/intervention/report/report.html:79 #: intervention/utils/quality.py:73 msgid "Registration date" msgstr "Datum Zulassung bzw. Satzungsbeschluss" -#: intervention/forms/forms.py:167 +#: intervention/forms/forms.py:185 #: intervention/templates/intervention/detail/view.html:100 #: intervention/templates/intervention/report/report.html:83 msgid "Binding on" msgstr "Datum Bestandskraft" -#: intervention/forms/forms.py:193 intervention/views.py:94 +#: intervention/forms/forms.py:211 intervention/views.py:94 msgid "New intervention" msgstr "Neuer Eingriff" -#: intervention/forms/forms.py:271 +#: intervention/forms/forms.py:294 msgid "Edit intervention" msgstr "Eingriff bearbeiten" @@ -1435,6 +1446,10 @@ msgstr "" "Das Ökokonto {} hat für eine Abbuchung von {} m² nicht ausreichend " "Restfläche. Es stehen noch {} m² zur Verfügung." +#: intervention/models/responsibility.py:41 +msgid "no further details" +msgstr "keine weitere Angabe" + #: intervention/templates/intervention/detail/includes/compensations.html:14 msgid "Add new compensation" msgstr "Neue Kompensation hinzufügen" @@ -1491,6 +1506,11 @@ msgstr "Widerspruch" msgid "Remove revocation" msgstr "Widerspruch entfernen" +#: intervention/templates/intervention/detail/view.html:64 +#: intervention/utils/quality.py:52 +msgid "Intervention handler" +msgstr "Eingriffsverursacher" + #: intervention/templates/intervention/detail/view.html:103 msgid "Exists" msgstr "vorhanden" @@ -1739,7 +1759,9 @@ msgstr "" #: konova/templates/konova/includes/parcel_table.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." +msgstr "" +"Flurstücke können nicht berechnet werden, da keine Geometrie eingegeben " +"wurde." #: konova/templates/konova/includes/parcel_table.html:11 msgid "Kreis" @@ -1749,11 +1771,11 @@ msgstr "Kreis" msgid "Gemarkung" msgstr "Gemarkung" -#: konova/templates/konova/includes/parcels.html:3 +#: konova/templates/konova/includes/parcels.html:7 msgid "Spatial reference" msgstr "Raumreferenz" -#: konova/templates/konova/includes/parcels.html:6 +#: konova/templates/konova/includes/parcels.html:11 msgid "Loading..." msgstr "Lade..." @@ -2021,7 +2043,7 @@ msgstr "{} wurde erfolgreich vom Nutzer {} geprüft! {}" msgid "missing" msgstr "fehlt" -#: konova/views.py:99 templates/navbars/navbar.html:16 +#: konova/views.py:96 templates/navbars/navbar.html:16 msgid "Home" msgstr "Home" @@ -4165,3 +4187,6 @@ msgstr "" #, python-format msgid "Unable to connect to qpid with SASL mechanism %s" msgstr "" + +#~ msgid "Who handles the eco-account" +#~ msgstr "Wer für die Herrichtung des Ökokontos verantwortlich ist" From f4d0485019d11addce8d953853d23f29e8dc064d Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Thu, 3 Mar 2022 12:09:09 +0100 Subject: [PATCH 2/2] # 129 Handler code renaming * renames handler code list * improves missing handler data rendering on detail view --- api/utils/serializer/v1/ecoaccount.py | 4 +- api/utils/serializer/v1/ema.py | 4 +- api/utils/serializer/v1/serializer.py | 4 +- .../management/commands/update_codelist.py | 4 +- codelist/settings.py | 2 +- compensation/forms/forms.py | 4 +- intervention/forms/forms.py | 4 +- intervention/models/responsibility.py | 9 +- konova/autocompletes.py | 4 +- konova/utils/message_templates.py | 2 + locale/de/LC_MESSAGES/django.mo | Bin 40671 -> 40705 bytes locale/de/LC_MESSAGES/django.po | 103 +++++++++--------- 12 files changed, 74 insertions(+), 70 deletions(-) diff --git a/api/utils/serializer/v1/ecoaccount.py b/api/utils/serializer/v1/ecoaccount.py index 241d3624..7fe4373d 100644 --- a/api/utils/serializer/v1/ecoaccount.py +++ b/api/utils/serializer/v1/ecoaccount.py @@ -9,7 +9,7 @@ from django.db import transaction from api.utils.serializer.v1.serializer import AbstractModelAPISerializerV1, AbstractCompensationAPISerializerV1Mixin, \ LegalAPISerializerV1Mixin, ResponsibilityAPISerializerV1Mixin, DeductableAPISerializerV1Mixin -from codelist.settings import CODELIST_CONSERVATION_OFFICE_ID, CODELIST_COMPENSATION_HANDLER_ID +from codelist.settings import CODELIST_CONSERVATION_OFFICE_ID, CODELIST_HANDLER_ID from compensation.models import EcoAccount from intervention.models import Legal, Responsibility, Handler from konova.models import Geometry @@ -66,7 +66,7 @@ class EcoAccountAPISerializerV1(AbstractModelAPISerializerV1, obj.responsible.conservation_file_number = responsibility_data["conservation_file_number"] obj.responsible.handler.type = self._konova_code_from_json( responsibility_data["handler"]["type"], - CODELIST_COMPENSATION_HANDLER_ID, + CODELIST_HANDLER_ID, ) obj.responsible.handler.detail = responsibility_data["handler"]["detail"] return obj diff --git a/api/utils/serializer/v1/ema.py b/api/utils/serializer/v1/ema.py index 548a7dbf..dfda7249 100644 --- a/api/utils/serializer/v1/ema.py +++ b/api/utils/serializer/v1/ema.py @@ -9,7 +9,7 @@ from django.db import transaction from api.utils.serializer.v1.serializer import AbstractModelAPISerializerV1, AbstractCompensationAPISerializerV1Mixin, \ ResponsibilityAPISerializerV1Mixin -from codelist.settings import CODELIST_CONSERVATION_OFFICE_ID, CODELIST_COMPENSATION_HANDLER_ID +from codelist.settings import CODELIST_CONSERVATION_OFFICE_ID, CODELIST_HANDLER_ID from ema.models import Ema from intervention.models import Responsibility, Handler from konova.models import Geometry @@ -53,7 +53,7 @@ class EmaAPISerializerV1(AbstractModelAPISerializerV1, AbstractCompensationAPISe obj.responsible.conservation_file_number = responsibility_data["conservation_file_number"] obj.responsible.handler.type = self._konova_code_from_json( responsibility_data["handler"]["type"], - CODELIST_COMPENSATION_HANDLER_ID, + CODELIST_HANDLER_ID, ) obj.responsible.handler.detail = responsibility_data["handler"]["detail"] return obj diff --git a/api/utils/serializer/v1/serializer.py b/api/utils/serializer/v1/serializer.py index 924b6e3b..23d1f692 100644 --- a/api/utils/serializer/v1/serializer.py +++ b/api/utils/serializer/v1/serializer.py @@ -15,7 +15,7 @@ from api.utils.serializer.serializer import AbstractModelAPISerializer from codelist.models import KonovaCode from codelist.settings import CODELIST_COMPENSATION_ACTION_ID, CODELIST_BIOTOPES_ID, CODELIST_PROCESS_TYPE_ID, \ CODELIST_LAW_ID, CODELIST_REGISTRATION_OFFICE_ID, CODELIST_CONSERVATION_OFFICE_ID, \ - CODELIST_COMPENSATION_ACTION_DETAIL_ID, CODELIST_BIOTOPES_EXTRA_CODES_ID, CODELIST_COMPENSATION_HANDLER_ID + CODELIST_COMPENSATION_ACTION_DETAIL_ID, CODELIST_BIOTOPES_EXTRA_CODES_ID, CODELIST_HANDLER_ID from compensation.models import CompensationAction, UnitChoices, CompensationState from intervention.models import Responsibility, Legal, Handler from konova.models import Deadline, DeadlineType @@ -223,7 +223,7 @@ class ResponsibilityAPISerializerV1Mixin: obj.responsible.conservation_file_number = responsibility_data["conservation_file_number"] obj.responsible.handler.type = self._konova_code_from_json( responsibility_data["handler"]["type"], - CODELIST_COMPENSATION_HANDLER_ID, + CODELIST_HANDLER_ID, ) obj.responsible.handler.detail = responsibility_data["handler"]["detail"] return obj diff --git a/codelist/management/commands/update_codelist.py b/codelist/management/commands/update_codelist.py index 85c90324..345b3244 100644 --- a/codelist/management/commands/update_codelist.py +++ b/codelist/management/commands/update_codelist.py @@ -11,7 +11,7 @@ from xml.etree import ElementTree as etree from codelist.models import KonovaCode, KonovaCodeList from codelist.settings import CODELIST_INTERVENTION_HANDLER_ID, CODELIST_CONSERVATION_OFFICE_ID, \ - CODELIST_REGISTRATION_OFFICE_ID, CODELIST_BIOTOPES_ID, CODELIST_LAW_ID, CODELIST_COMPENSATION_HANDLER_ID, \ + CODELIST_REGISTRATION_OFFICE_ID, CODELIST_BIOTOPES_ID, CODELIST_LAW_ID, CODELIST_HANDLER_ID, \ CODELIST_COMPENSATION_ACTION_ID, CODELIST_COMPENSATION_ACTION_CLASS_ID, CODELIST_COMPENSATION_ADDITIONAL_TYPE_ID, \ CODELIST_BASE_URL, CODELIST_PROCESS_TYPE_ID, CODELIST_BIOTOPES_EXTRA_CODES_ID, \ CODELIST_COMPENSATION_ACTION_DETAIL_ID @@ -36,7 +36,7 @@ class Command(BaseKonovaCommand): CODELIST_BIOTOPES_ID, CODELIST_BIOTOPES_EXTRA_CODES_ID, CODELIST_LAW_ID, - CODELIST_COMPENSATION_HANDLER_ID, + CODELIST_HANDLER_ID, CODELIST_COMPENSATION_ACTION_ID, CODELIST_COMPENSATION_ACTION_CLASS_ID, CODELIST_COMPENSATION_ACTION_DETAIL_ID, diff --git a/codelist/settings.py b/codelist/settings.py index b4226b5e..61652bd0 100644 --- a/codelist/settings.py +++ b/codelist/settings.py @@ -19,7 +19,7 @@ CODELIST_BIOTOPES_EXTRA_CODES_ID = 975 # CLZusatzbezeichnung CODELIST_LAW_ID = 1048 # CLVerfahrensrecht CODELIST_PROCESS_TYPE_ID = 44382 # CLVerfahrenstyp -CODELIST_COMPENSATION_HANDLER_ID = 1052 # CLEingreifer +CODELIST_HANDLER_ID = 1052 # CLEingreifer CODELIST_COMPENSATION_ACTION_ID = 1026 # CLMassnahmedetail CODELIST_COMPENSATION_ACTION_DETAIL_ID = 1035 # CLZusatzmerkmal CODELIST_COMPENSATION_ACTION_CLASS_ID = 1034 # CLMassnahmeklasse diff --git a/compensation/forms/forms.py b/compensation/forms/forms.py index 768a6fed..4e9e329e 100644 --- a/compensation/forms/forms.py +++ b/compensation/forms/forms.py @@ -13,7 +13,7 @@ from django.utils.translation import gettext_lazy as _ from django import forms from codelist.models import KonovaCode -from codelist.settings import CODELIST_CONSERVATION_OFFICE_ID, CODELIST_COMPENSATION_HANDLER_ID +from codelist.settings import CODELIST_CONSERVATION_OFFICE_ID, CODELIST_HANDLER_ID from compensation.models import Compensation, EcoAccount from intervention.inputs import GenerateInput from intervention.models import Intervention, Responsibility, Legal, Handler @@ -110,7 +110,7 @@ class CompensationResponsibleFormMixin(forms.Form): queryset=KonovaCode.objects.filter( is_archived=False, is_leaf=True, - code_lists__in=[CODELIST_COMPENSATION_HANDLER_ID], + code_lists__in=[CODELIST_HANDLER_ID], ), widget=autocomplete.ModelSelect2( url="codes-handler-autocomplete", diff --git a/intervention/forms/forms.py b/intervention/forms/forms.py index 1ed10e19..b83c4fba 100644 --- a/intervention/forms/forms.py +++ b/intervention/forms/forms.py @@ -16,7 +16,7 @@ from django.utils.translation import gettext_lazy as _ from codelist.models import KonovaCode from codelist.settings import CODELIST_PROCESS_TYPE_ID, CODELIST_LAW_ID, \ - CODELIST_REGISTRATION_OFFICE_ID, CODELIST_CONSERVATION_OFFICE_ID, CODELIST_COMPENSATION_HANDLER_ID + CODELIST_REGISTRATION_OFFICE_ID, CODELIST_CONSERVATION_OFFICE_ID, CODELIST_HANDLER_ID from intervention.inputs import GenerateInput from intervention.models import Intervention, Legal, Responsibility, Handler from konova.forms import BaseForm, SimpleGeomForm @@ -146,7 +146,7 @@ class NewInterventionForm(BaseForm): queryset=KonovaCode.objects.filter( is_archived=False, is_leaf=True, - code_lists__in=[CODELIST_COMPENSATION_HANDLER_ID], + code_lists__in=[CODELIST_HANDLER_ID], ), widget=autocomplete.ModelSelect2( url="codes-handler-autocomplete", diff --git a/intervention/models/responsibility.py b/intervention/models/responsibility.py index 6f34ba5b..5d1c84a6 100644 --- a/intervention/models/responsibility.py +++ b/intervention/models/responsibility.py @@ -10,8 +10,9 @@ from django.utils.translation import gettext_lazy as _ from codelist.models import KonovaCode from codelist.settings import CODELIST_CONSERVATION_OFFICE_ID, CODELIST_REGISTRATION_OFFICE_ID, \ - CODELIST_COMPENSATION_HANDLER_ID + CODELIST_HANDLER_ID from konova.models import UuidModel +from konova.utils.message_templates import UNKNOWN, NO_DETAILS class Handler(UuidModel): @@ -26,7 +27,7 @@ class Handler(UuidModel): null=True, blank=True, limit_choices_to={ - "code_lists__in": [CODELIST_COMPENSATION_HANDLER_ID], + "code_lists__in": [CODELIST_HANDLER_ID], "is_selectable": True, "is_archived": False, } @@ -38,8 +39,8 @@ class Handler(UuidModel): ) def __str__(self): - detail = self.detail or _("no further details") - _type = self.type.long_name if self.type is not None else None + detail = self.detail or NO_DETAILS + _type = self.type.long_name if self.type is not None else UNKNOWN return f'{_type}, {detail}' diff --git a/konova/autocompletes.py b/konova/autocompletes.py index 0b498517..9f60d54f 100644 --- a/konova/autocompletes.py +++ b/konova/autocompletes.py @@ -17,7 +17,7 @@ from django.db.models import Q from codelist.models import KonovaCode from codelist.settings import CODELIST_COMPENSATION_ACTION_ID, CODELIST_BIOTOPES_ID, CODELIST_LAW_ID, \ CODELIST_REGISTRATION_OFFICE_ID, CODELIST_CONSERVATION_OFFICE_ID, CODELIST_PROCESS_TYPE_ID, \ - CODELIST_BIOTOPES_EXTRA_CODES_ID, CODELIST_COMPENSATION_ACTION_DETAIL_ID, CODELIST_COMPENSATION_HANDLER_ID + CODELIST_BIOTOPES_EXTRA_CODES_ID, CODELIST_COMPENSATION_ACTION_DETAIL_ID, CODELIST_HANDLER_ID from compensation.models import EcoAccount from intervention.models import Intervention @@ -367,7 +367,7 @@ class HandlerCodeAutocomplete(KonovaCodeAutocomplete): related_field_name = "long_name" def __init__(self, *args, **kwargs): - self.c = CODELIST_COMPENSATION_HANDLER_ID + self.c = CODELIST_HANDLER_ID super().__init__(*args, **kwargs) def get_result_label(self, result): diff --git a/konova/utils/message_templates.py b/konova/utils/message_templates.py index 6c0c6148..64b7eab1 100644 --- a/konova/utils/message_templates.py +++ b/konova/utils/message_templates.py @@ -7,6 +7,8 @@ Created on: 02.08.21 """ from django.utils.translation import gettext_lazy as _ +NO_DETAILS = _("no further details") +UNKNOWN = _("Unknown") UNGROUPED = _("Ungrouped") FORM_INVALID = _("There was an error on this form.") PARAMS_INVALID = _("Invalid parameters") diff --git a/locale/de/LC_MESSAGES/django.mo b/locale/de/LC_MESSAGES/django.mo index c032d7629dfbdce1ee10bfb6be2e607ea9be61a6..b3bf61fdcc2687d5b1e1f1ad8bc811c9ed514b44 100644 GIT binary patch delta 9418 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\n" "Language-Team: LANGUAGE \n" @@ -1159,7 +1159,7 @@ msgstr "Daten zu den verantwortlichen Stellen" msgid "Compensations - Overview" msgstr "Kompensationen - Übersicht" -#: compensation/views/compensation.py:151 konova/utils/message_templates.py:33 +#: compensation/views/compensation.py:151 konova/utils/message_templates.py:35 msgid "Compensation {} edited" msgstr "Kompensation {} bearbeitet" @@ -1446,10 +1446,6 @@ msgstr "" "Das Ökokonto {} hat für eine Abbuchung von {} m² nicht ausreichend " "Restfläche. Es stehen noch {} m² zur Verfügung." -#: intervention/models/responsibility.py:41 -msgid "no further details" -msgstr "keine weitere Angabe" - #: intervention/templates/intervention/detail/includes/compensations.html:14 msgid "Add new compensation" msgstr "Neue Kompensation hinzufügen" @@ -1843,22 +1839,31 @@ msgid "Request for new API token" msgstr "Anfrage für neuen API Token" #: konova/utils/message_templates.py:10 +msgid "no further details" +msgstr "keine weitere Angabe" + +#: konova/utils/message_templates.py:11 +#: venv/lib/python3.7/site-packages/django/forms/widgets.py:709 +msgid "Unknown" +msgstr "Unbekannt" + +#: konova/utils/message_templates.py:12 msgid "Ungrouped" msgstr "Ohne Zuordnung" -#: konova/utils/message_templates.py:11 +#: konova/utils/message_templates.py:13 msgid "There was an error on this form." msgstr "Es gab einen Fehler im Formular." -#: konova/utils/message_templates.py:12 +#: konova/utils/message_templates.py:14 msgid "Invalid parameters" msgstr "Parameter ungültig" -#: konova/utils/message_templates.py:13 +#: konova/utils/message_templates.py:15 msgid "There are errors in this intervention." msgstr "Es liegen Fehler in diesem Eingriff vor:" -#: konova/utils/message_templates.py:14 +#: konova/utils/message_templates.py:16 msgid "" "The identifier '{}' had to be changed to '{}' since another entry has been " "added in the meanwhile, which uses this identifier" @@ -1866,26 +1871,26 @@ msgstr "" "Die Kennung '{}' musste zu '{}' geändert werden, da ein anderer Eintrag in " "der Zwischenzeit angelegt wurde, welcher diese Kennung nun bereits verwendet" -#: konova/utils/message_templates.py:15 +#: konova/utils/message_templates.py:17 msgid "" "Only conservation or registration office users are allowed to remove entries." msgstr "" "Nur Mitarbeiter der Naturschutz- oder Zulassungsbehördengruppe dürfen " "Einträge entfernen" -#: konova/utils/message_templates.py:16 +#: konova/utils/message_templates.py:18 msgid "You need to be part of another user group." msgstr "Hierfür müssen Sie einer anderen Nutzergruppe angehören!" -#: konova/utils/message_templates.py:17 +#: konova/utils/message_templates.py:19 msgid "Status of Checked and Recorded reseted" msgstr "'Geprüft'/'Verzeichnet' wurde zurückgesetzt" -#: konova/utils/message_templates.py:20 +#: konova/utils/message_templates.py:22 msgid "This data is not shared with you" msgstr "Diese Daten sind für Sie nicht freigegeben" -#: konova/utils/message_templates.py:21 +#: konova/utils/message_templates.py:23 msgid "" "Remember: This data has not been shared with you, yet. This means you can " "only read but can not edit or perform any actions like running a check or " @@ -1895,15 +1900,15 @@ msgstr "" "bedeutet, dass Sie nur lesenden Zugriff hierauf haben und weder bearbeiten, " "noch Prüfungen durchführen oder verzeichnen können." -#: konova/utils/message_templates.py:24 +#: konova/utils/message_templates.py:26 msgid "Unsupported file type" msgstr "Dateiformat nicht unterstützt" -#: konova/utils/message_templates.py:25 +#: konova/utils/message_templates.py:27 msgid "File too large" msgstr "Datei zu groß" -#: konova/utils/message_templates.py:28 +#: konova/utils/message_templates.py:30 msgid "" "Action canceled. Eco account is recorded or deductions exist. Only " "conservation office member can perform this action." @@ -1911,119 +1916,119 @@ msgstr "" "Aktion abgebrochen. Ökokonto ist bereits verzeichnet oder Abbuchungen liegen " "vor. Nur Eintragungsstellennutzer können diese Aktion jetzt durchführen." -#: konova/utils/message_templates.py:31 +#: konova/utils/message_templates.py:33 msgid "Compensation {} added" msgstr "Kompensation {} hinzugefügt" -#: konova/utils/message_templates.py:32 +#: konova/utils/message_templates.py:34 msgid "Compensation {} removed" msgstr "Kompensation {} entfernt" -#: konova/utils/message_templates.py:34 +#: konova/utils/message_templates.py:36 msgid "Added compensation action" msgstr "Maßnahme hinzugefügt" -#: konova/utils/message_templates.py:35 +#: konova/utils/message_templates.py:37 msgid "Added compensation state" msgstr "Zustand hinzugefügt" -#: konova/utils/message_templates.py:38 +#: konova/utils/message_templates.py:40 msgid "State removed" msgstr "Zustand gelöscht" -#: konova/utils/message_templates.py:39 +#: konova/utils/message_templates.py:41 msgid "State edited" msgstr "Zustand bearbeitet" -#: konova/utils/message_templates.py:40 +#: konova/utils/message_templates.py:42 msgid "State added" msgstr "Zustand hinzugefügt" -#: konova/utils/message_templates.py:43 +#: konova/utils/message_templates.py:45 msgid "Action added" msgstr "Maßnahme hinzugefügt" -#: konova/utils/message_templates.py:44 +#: konova/utils/message_templates.py:46 msgid "Action edited" msgstr "Maßnahme bearbeitet" -#: konova/utils/message_templates.py:45 +#: konova/utils/message_templates.py:47 msgid "Action removed" msgstr "Maßnahme entfernt" -#: konova/utils/message_templates.py:48 +#: konova/utils/message_templates.py:50 msgid "Deduction added" msgstr "Abbuchung hinzugefügt" -#: konova/utils/message_templates.py:49 +#: konova/utils/message_templates.py:51 msgid "Deduction edited" msgstr "Abbuchung bearbeitet" -#: konova/utils/message_templates.py:50 +#: konova/utils/message_templates.py:52 msgid "Deduction removed" msgstr "Abbuchung entfernt" -#: konova/utils/message_templates.py:53 +#: konova/utils/message_templates.py:55 msgid "Deadline added" msgstr "Frist/Termin hinzugefügt" -#: konova/utils/message_templates.py:54 +#: konova/utils/message_templates.py:56 msgid "Deadline edited" msgstr "Frist/Termin bearbeitet" -#: konova/utils/message_templates.py:55 +#: konova/utils/message_templates.py:57 msgid "Deadline removed" msgstr "Frist/Termin gelöscht" -#: konova/utils/message_templates.py:58 +#: konova/utils/message_templates.py:60 msgid "Payment added" msgstr "Zahlung hinzugefügt" -#: konova/utils/message_templates.py:59 +#: konova/utils/message_templates.py:61 msgid "Payment edited" msgstr "Zahlung bearbeitet" -#: konova/utils/message_templates.py:60 +#: konova/utils/message_templates.py:62 msgid "Payment removed" msgstr "Zahlung gelöscht" -#: konova/utils/message_templates.py:63 +#: konova/utils/message_templates.py:65 msgid "Revocation added" msgstr "Widerspruch hinzugefügt" -#: konova/utils/message_templates.py:64 +#: konova/utils/message_templates.py:66 msgid "Revocation edited" msgstr "Widerspruch bearbeitet" -#: konova/utils/message_templates.py:65 +#: konova/utils/message_templates.py:67 msgid "Revocation removed" msgstr "Widerspruch entfernt" -#: konova/utils/message_templates.py:68 +#: konova/utils/message_templates.py:70 msgid "Document '{}' deleted" msgstr "Dokument '{}' gelöscht" -#: konova/utils/message_templates.py:69 +#: konova/utils/message_templates.py:71 msgid "Document added" msgstr "Dokument hinzugefügt" -#: konova/utils/message_templates.py:70 +#: konova/utils/message_templates.py:72 msgid "Document edited" msgstr "Dokument bearbeitet" -#: konova/utils/message_templates.py:73 +#: konova/utils/message_templates.py:75 msgid "Edited general data" msgstr "Allgemeine Daten bearbeitet" -#: konova/utils/message_templates.py:74 +#: konova/utils/message_templates.py:76 msgid "Added deadline" msgstr "Frist/Termin hinzugefügt" -#: konova/utils/message_templates.py:77 +#: konova/utils/message_templates.py:79 msgid "Geometry conflict detected with {}" msgstr "Geometriekonflikt mit folgenden Einträgen erkannt: {}" -#: konova/utils/message_templates.py:80 +#: konova/utils/message_templates.py:82 msgid "This intervention has {} revocations" msgstr "Dem Eingriff liegen {} Widersprüche vor" @@ -3599,10 +3604,6 @@ msgstr "" msgid "Change" msgstr "" -#: venv/lib/python3.7/site-packages/django/forms/widgets.py:709 -msgid "Unknown" -msgstr "" - #. Translators: Please do not add spaces around commas. #: venv/lib/python3.7/site-packages/django/template/defaultfilters.py:790 msgid "yes,no,maybe"