From c98f41c9a8bc262117668a6aa1c5162da0769bcf Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Thu, 3 Mar 2022 12:05:22 +0100 Subject: [PATCH] # 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"