diff --git a/api/tests/v1/create/ecoaccount_create_post_body.json b/api/tests/v1/create/ecoaccount_create_post_body.json index 742c0fb..8300277 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 d9081fb..4949b7a 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 2d39919..30def08 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 7b62a12..ff636ff 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 933c4fc..cc83585 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 0376424..df1d6e6 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 500aec2..bfc670b 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 0c3e139..241d362 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 547f223..548a7db 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 9fa7b71..1ce2d68 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 caae2de..924b6e3 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 7962e3c..cb9f9cb 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 46b235f..768a6fe 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 8e6faab..91b8de1 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 b2c23e1..b0cba9a 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 94ff970..1ed10e1 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 0000000..508dba8 --- /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 19234ac..6f34ba5 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 5ecc50d..0b49851 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 d84c051..28b3f8a 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 7f3b897..d2458f5 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 768357b..c032d76 100644 Binary files a/locale/de/LC_MESSAGES/django.mo and b/locale/de/LC_MESSAGES/django.mo differ diff --git a/locale/de/LC_MESSAGES/django.po b/locale/de/LC_MESSAGES/django.po index 5d05c89..6edaeb1 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: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:123 +msgid "Eco-Account handler detail" +msgstr "Detailangabe zum Maßnahmenträger" -#: 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:127 intervention/forms/forms.py:163 +msgid "Detail input on the handler" +msgstr "Name der Behörde, Stadt, Firma, ..." -#: compensation/forms/forms.py:112 intervention/forms/forms.py:149 +#: 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"