From 1af807deae18f47dbff7f930a013d2fc6946cdf7 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Sun, 14 Dec 2025 17:37:01 +0100 Subject: [PATCH] # Remove view * refactors remove view methods into classes * introduced AbstractRemoveView * disables final-delete actions from admin views * extends error warnings on RemoveEcoAccountModalForm * removes LoginRequiredMixin from AbstractPublicReportView to make it accessible for the public * updates translations --- compensation/admin.py | 8 ++ compensation/forms/eco_account.py | 10 ++ compensation/urls/compensation.py | 5 +- compensation/urls/eco_account.py | 5 +- .../views/compensation/compensation.py | 32 +------ compensation/views/compensation/remove.py | 20 ++++ compensation/views/eco_account/eco_account.py | 41 +-------- compensation/views/eco_account/remove.py | 22 +++++ ema/urls.py | 5 +- ema/views/ema.py | 24 ----- ema/views/remove.py | 20 ++++ intervention/admin.py | 8 ++ intervention/urls.py | 5 +- intervention/views/intervention.py | 27 +----- intervention/views/remove.py | 19 ++++ konova/views/remove.py | 65 +++++++++++++ konova/views/report.py | 8 +- locale/de/LC_MESSAGES/django.mo | Bin 46187 -> 46258 bytes locale/de/LC_MESSAGES/django.po | 87 +++++++++--------- 19 files changed, 235 insertions(+), 176 deletions(-) create mode 100644 compensation/views/compensation/remove.py create mode 100644 compensation/views/eco_account/remove.py create mode 100644 ema/views/remove.py create mode 100644 intervention/views/remove.py create mode 100644 konova/views/remove.py diff --git a/compensation/admin.py b/compensation/admin.py index fc59451f..67ef2f7a 100644 --- a/compensation/admin.py +++ b/compensation/admin.py @@ -45,6 +45,14 @@ class AbstractCompensationAdmin(BaseObjectAdmin): states = "\n".join(states) return states + def get_actions(self, request): + DELETE_ACTION_IDENTIFIER = "delete_selected" + actions = super().get_actions(request) + + if DELETE_ACTION_IDENTIFIER in actions: + del actions[DELETE_ACTION_IDENTIFIER] + + return actions class CompensationAdmin(AbstractCompensationAdmin): autocomplete_fields = [ diff --git a/compensation/forms/eco_account.py b/compensation/forms/eco_account.py index 42443025..46e6691c 100644 --- a/compensation/forms/eco_account.py +++ b/compensation/forms/eco_account.py @@ -15,6 +15,7 @@ from compensation.models import EcoAccount from intervention.models import Handler, Responsibility, Legal from konova.forms import SimpleGeomForm from konova.forms.modals import RemoveModalForm +from konova.settings import ETS_GROUP from konova.utils import validators from user.models import User, UserActionLogEntry @@ -246,4 +247,13 @@ class RemoveEcoAccountModalForm(RemoveModalForm): "confirm", _("The account can not be removed, since there are still deductions.") ) + + # If there are deductions but the performing user is not part of an ETS group, we assume this poor + # fella does not know what he/she does -> give a hint that they should contact someone in charge... + user_is_ets_user = self.user.in_group(ETS_GROUP) + if not user_is_ets_user: + self.add_error( + "confirm", + _("Please contact the responsible conservation office to find a solution!") + ) return super_valid and not has_deductions diff --git a/compensation/urls/compensation.py b/compensation/urls/compensation.py index c77faed1..b9eaf84f 100644 --- a/compensation/urls/compensation.py +++ b/compensation/urls/compensation.py @@ -10,6 +10,7 @@ from django.urls import path from compensation.views.compensation.detail import DetailCompensationView from compensation.views.compensation.document import EditCompensationDocumentView, NewCompensationDocumentView, \ GetCompensationDocumentView, RemoveCompensationDocumentView +from compensation.views.compensation.remove import RemoveCompensationView from compensation.views.compensation.resubmission import CompensationResubmissionView from compensation.views.compensation.report import CompensationPublicReportView from compensation.views.compensation.deadline import NewCompensationDeadlineView, EditCompensationDeadlineView, \ @@ -19,7 +20,7 @@ from compensation.views.compensation.action import NewCompensationActionView, Ed from compensation.views.compensation.state import NewCompensationStateView, EditCompensationStateView, \ RemoveCompensationStateView from compensation.views.compensation.compensation import new_view, edit_view, \ - remove_view, IndexCompensationView, CompensationIdentifierGeneratorView + IndexCompensationView, CompensationIdentifierGeneratorView from compensation.views.compensation.log import CompensationLogView urlpatterns = [ @@ -31,7 +32,7 @@ urlpatterns = [ path('', DetailCompensationView.as_view(), name='detail'), path('/log', CompensationLogView.as_view(), name='log'), path('/edit', edit_view, name='edit'), - path('/remove', remove_view, name='remove'), + path('/remove', RemoveCompensationView.as_view(), name='remove'), path('/state/new', NewCompensationStateView.as_view(), name='new-state'), path('/state//edit', EditCompensationStateView.as_view(), name='state-edit'), diff --git a/compensation/urls/eco_account.py b/compensation/urls/eco_account.py index de99a3f5..a1ade266 100644 --- a/compensation/urls/eco_account.py +++ b/compensation/urls/eco_account.py @@ -9,10 +9,11 @@ from django.urls import path from compensation.autocomplete.eco_account import EcoAccountAutocomplete from compensation.views.eco_account.detail import DetailEcoAccountView -from compensation.views.eco_account.eco_account import new_view, edit_view, remove_view, \ +from compensation.views.eco_account.eco_account import new_view, edit_view, \ IndexEcoAccountView, EcoAccountIdentifierGeneratorView from compensation.views.eco_account.log import EcoAccountLogView from compensation.views.eco_account.record import EcoAccountRecordView +from compensation.views.eco_account.remove import RemoveEcoAccountView from compensation.views.eco_account.report import EcoAccountPublicReportView from compensation.views.eco_account.resubmission import EcoAccountResubmissionView from compensation.views.eco_account.state import NewEcoAccountStateView, EditEcoAccountStateView, \ @@ -37,7 +38,7 @@ urlpatterns = [ path('/record', EcoAccountRecordView.as_view(), name='record'), path('/report', EcoAccountPublicReportView.as_view(), name='report'), path('/edit', edit_view, name='edit'), - path('/remove', remove_view, name='remove'), + path('/remove', RemoveEcoAccountView.as_view(), name='remove'), path('/resub', EcoAccountResubmissionView.as_view(), name='resubmission-create'), path('/state/new', NewEcoAccountStateView.as_view(), name='new-state'), diff --git a/compensation/views/compensation/compensation.py b/compensation/views/compensation/compensation.py index 94fce5f9..3f2990ba 100644 --- a/compensation/views/compensation/compensation.py +++ b/compensation/views/compensation/compensation.py @@ -10,7 +10,6 @@ from django.contrib.auth.decorators import login_required from django.core.exceptions import ObjectDoesNotExist from django.http import HttpRequest, HttpResponse from django.shortcuts import get_object_or_404, render, redirect -from django.urls import reverse from django.utils.translation import gettext_lazy as _ from compensation.forms.compensation import EditCompensationForm, NewCompensationForm @@ -18,13 +17,11 @@ from compensation.models import Compensation from compensation.tables.compensation import CompensationTable from intervention.models import Intervention from konova.contexts import BaseContext -from konova.decorators import shared_access_required, default_group_required, login_required_modal +from konova.decorators import shared_access_required, default_group_required from konova.forms import SimpleGeomForm -from konova.forms.modals import RemoveModalForm from konova.sub_settings.context_settings import TAB_TITLE_IDENTIFIER -from konova.utils.message_templates import COMPENSATION_REMOVED_TEMPLATE, \ - RECORDED_BLOCKS_EDIT, CHECK_STATE_RESET, FORM_INVALID, PARAMS_INVALID, IDENTIFIER_REPLACED, \ - COMPENSATION_ADDED_TEMPLATE, GEOMETRY_SIMPLIFIED, GEOMETRIES_IGNORED_TEMPLATE +from konova.utils.message_templates import RECORDED_BLOCKS_EDIT, CHECK_STATE_RESET, FORM_INVALID, PARAMS_INVALID, \ + IDENTIFIER_REPLACED, COMPENSATION_ADDED_TEMPLATE, GEOMETRY_SIMPLIFIED, GEOMETRIES_IGNORED_TEMPLATE from konova.views.identifier import AbstractIdentifierGeneratorView from konova.views.index import AbstractIndexView @@ -194,26 +191,3 @@ def edit_view(request: HttpRequest, id: str): } context = BaseContext(request, context).context return render(request, template, context) - -@login_required_modal -@login_required -@default_group_required -@shared_access_required(Compensation, "id") -def remove_view(request: HttpRequest, id: str): - """ Renders a modal view for removing the compensation - - Args: - request (HttpRequest): The incoming request - id (str): The compensation's id - - Returns: - - """ - comp = get_object_or_404(Compensation, id=id) - form = RemoveModalForm(request.POST or None, instance=comp, request=request) - return form.process_request( - request=request, - msg_success=COMPENSATION_REMOVED_TEMPLATE.format(comp.identifier), - redirect_url=reverse("compensation:index"), - ) - diff --git a/compensation/views/compensation/remove.py b/compensation/views/compensation/remove.py new file mode 100644 index 00000000..bced8af8 --- /dev/null +++ b/compensation/views/compensation/remove.py @@ -0,0 +1,20 @@ +""" +Author: Michel Peltriaux +Created on: 14.12.25 + +""" +from django.http import HttpRequest +from django.utils.decorators import method_decorator + +from compensation.models import Compensation +from konova.decorators import shared_access_required +from konova.views.remove import AbstractRemoveView + + +class RemoveCompensationView(AbstractRemoveView): + _MODEL = Compensation + _REDIRECT_URL = "compensation:index" + + @method_decorator(shared_access_required(Compensation, "id")) + def dispatch(self, request: HttpRequest, id: str, *args, **kwargs): + return super().dispatch(request, id, *args, **kwargs) diff --git a/compensation/views/eco_account/eco_account.py b/compensation/views/eco_account/eco_account.py index 3acd5714..8c98c5c1 100644 --- a/compensation/views/eco_account/eco_account.py +++ b/compensation/views/eco_account/eco_account.py @@ -9,18 +9,16 @@ from django.contrib import messages from django.contrib.auth.decorators import login_required from django.http import HttpRequest, HttpResponse from django.shortcuts import get_object_or_404, redirect, render -from django.urls import reverse from django.utils.translation import gettext_lazy as _ -from compensation.forms.eco_account import EditEcoAccountForm, NewEcoAccountForm, RemoveEcoAccountModalForm +from compensation.forms.eco_account import EditEcoAccountForm, NewEcoAccountForm from compensation.models import EcoAccount from compensation.tables.eco_account import EcoAccountTable from konova.contexts import BaseContext -from konova.decorators import shared_access_required, default_group_required, login_required_modal +from konova.decorators import shared_access_required, default_group_required from konova.forms import SimpleGeomForm -from konova.settings import ETS_GROUP from konova.sub_settings.context_settings import TAB_TITLE_IDENTIFIER -from konova.utils.message_templates import CANCEL_ACC_RECORDED_OR_DEDUCTED, RECORDED_BLOCKS_EDIT, FORM_INVALID, \ +from konova.utils.message_templates import RECORDED_BLOCKS_EDIT, FORM_INVALID, \ IDENTIFIER_REPLACED, GEOMETRY_SIMPLIFIED, GEOMETRIES_IGNORED_TEMPLATE from konova.views.identifier import AbstractIdentifierGeneratorView from konova.views.index import AbstractIndexView @@ -171,36 +169,3 @@ def edit_view(request: HttpRequest, id: str): } context = BaseContext(request, context).context return render(request, template, context) - - -@login_required_modal -@login_required -@default_group_required -@shared_access_required(EcoAccount, "id") -def remove_view(request: HttpRequest, id: str): - """ Renders a modal view for removing the eco account - - Args: - request (HttpRequest): The incoming request - id (str): The account's id - - Returns: - - """ - acc = get_object_or_404(EcoAccount, id=id) - - # If the eco account has already been recorded OR there are already deductions, it can not be deleted by a regular - # default group user - if acc.recorded is not None or acc.deductions.exists(): - user = request.user - if not user.in_group(ETS_GROUP): - messages.info(request, CANCEL_ACC_RECORDED_OR_DEDUCTED) - return redirect("compensation:acc:detail", id=id) - - form = RemoveEcoAccountModalForm(request.POST or None, instance=acc, request=request) - return form.process_request( - request=request, - msg_success=_("Eco-account removed"), - redirect_url=reverse("compensation:acc:index"), - ) - diff --git a/compensation/views/eco_account/remove.py b/compensation/views/eco_account/remove.py new file mode 100644 index 00000000..834a076d --- /dev/null +++ b/compensation/views/eco_account/remove.py @@ -0,0 +1,22 @@ +""" +Author: Michel Peltriaux +Created on: 14.12.25 + +""" +from django.http import HttpRequest +from django.utils.decorators import method_decorator + +from compensation.forms.eco_account import RemoveEcoAccountModalForm +from compensation.models import EcoAccount +from konova.decorators import shared_access_required +from konova.views.remove import AbstractRemoveView + + +class RemoveEcoAccountView(AbstractRemoveView): + _MODEL = EcoAccount + _REDIRECT_URL = "compensation:acc:index" + _FORM = RemoveEcoAccountModalForm + + @method_decorator(shared_access_required(EcoAccount, "id")) + def dispatch(self, request: HttpRequest, id: str, *args, **kwargs): + return super().dispatch(request, id, *args, **kwargs) diff --git a/ema/urls.py b/ema/urls.py index 705808bc..d3a928d9 100644 --- a/ema/urls.py +++ b/ema/urls.py @@ -11,9 +11,10 @@ from ema.views.action import NewEmaActionView, EditEmaActionView, RemoveEmaActio from ema.views.deadline import NewEmaDeadlineView, EditEmaDeadlineView, RemoveEmaDeadlineView from ema.views.detail import DetailEmaView from ema.views.document import NewEmaDocumentView, EditEmaDocumentView, RemoveEmaDocumentView, GetEmaDocumentView -from ema.views.ema import new_view, edit_view, remove_view, IndexEmaView, EmaIdentifierGeneratorView +from ema.views.ema import new_view, edit_view, IndexEmaView, EmaIdentifierGeneratorView from ema.views.log import EmaLogView from ema.views.record import EmaRecordView +from ema.views.remove import RemoveEmaView from ema.views.report import EmaPublicReportView from ema.views.resubmission import EmaResubmissionView from ema.views.share import EmaShareFormView, EmaShareByTokenView @@ -27,7 +28,7 @@ urlpatterns = [ path("", DetailEmaView.as_view(), name="detail"), path('/log', EmaLogView.as_view(), name='log'), path('/edit', edit_view, name='edit'), - path('/remove', remove_view, name='remove'), + path('/remove', RemoveEmaView.as_view(), name='remove'), path('/record', EmaRecordView.as_view(), name='record'), path('/report', EmaPublicReportView.as_view(), name='report'), path('/resub', EmaResubmissionView.as_view(), name='resubmission-create'), diff --git a/ema/views/ema.py b/ema/views/ema.py index 9c0a216f..8fed05ea 100644 --- a/ema/views/ema.py +++ b/ema/views/ema.py @@ -174,27 +174,3 @@ def edit_view(request: HttpRequest, id: str): } context = BaseContext(request, context).context return render(request, template, context) - - -@login_required_modal -@login_required -@conservation_office_group_required -@shared_access_required(Ema, "id") -def remove_view(request: HttpRequest, id: str): - """ Renders a modal view for removing the EMA - - Args: - request (HttpRequest): The incoming request - id (str): The EMA's id - - Returns: - - """ - ema = get_object_or_404(Ema, id=id) - form = RemoveModalForm(request.POST or None, instance=ema, request=request) - return form.process_request( - request=request, - msg_success=_("EMA removed"), - redirect_url=reverse("ema:index"), - ) - diff --git a/ema/views/remove.py b/ema/views/remove.py new file mode 100644 index 00000000..9e3b3507 --- /dev/null +++ b/ema/views/remove.py @@ -0,0 +1,20 @@ +""" +Author: Michel Peltriaux +Created on: 14.12.25 + +""" +from django.utils.decorators import method_decorator + +from ema.models import Ema +from konova.decorators import shared_access_required, conservation_office_group_required +from konova.views.remove import AbstractRemoveView + + +class RemoveEmaView(AbstractRemoveView): + _MODEL = Ema + _REDIRECT_URL = "ema:index" + + @method_decorator(conservation_office_group_required) + @method_decorator(shared_access_required(Ema, "id")) + def dispatch(self, request, *args, **kwargs): + return super().dispatch(request, *args, **kwargs) diff --git a/intervention/admin.py b/intervention/admin.py index 46f7244d..208030e6 100644 --- a/intervention/admin.py +++ b/intervention/admin.py @@ -37,6 +37,14 @@ class InterventionAdmin(BaseObjectAdmin): "geometry", ] + def get_actions(self, request): + DELETE_ACTION_IDENTIFIER = "delete_selected" + actions = super().get_actions(request) + + if DELETE_ACTION_IDENTIFIER in actions: + del actions[DELETE_ACTION_IDENTIFIER] + + return actions class InterventionDocumentAdmin(AbstractDocumentAdmin): pass diff --git a/intervention/urls.py b/intervention/urls.py index a2648ace..6a3855b5 100644 --- a/intervention/urls.py +++ b/intervention/urls.py @@ -14,8 +14,9 @@ from intervention.views.deduction import NewInterventionDeductionView, EditInter RemoveInterventionDeductionView from intervention.views.document import NewInterventionDocumentView, GetInterventionDocumentView, \ RemoveInterventionDocumentView, EditInterventionDocumentView -from intervention.views.intervention import new_view, edit_view, remove_view, \ +from intervention.views.intervention import new_view, edit_view, \ IndexInterventionView, InterventionIdentifierGeneratorView +from intervention.views.remove import RemoveInterventionView from intervention.views.detail import DetailInterventionView from intervention.views.log import InterventionLogView from intervention.views.record import InterventionRecordView @@ -33,7 +34,7 @@ urlpatterns = [ path('', DetailInterventionView.as_view(), name='detail'), path('/log', InterventionLogView.as_view(), name='log'), path('/edit', edit_view, name='edit'), - path('/remove', remove_view, name='remove'), + path('/remove', RemoveInterventionView.as_view(), name='remove'), path('/share/', InterventionShareByTokenView.as_view(), name='share-token'), path('/share', InterventionShareFormView.as_view(), name='share-form'), path('/check', check_view, name='check'), diff --git a/intervention/views/intervention.py b/intervention/views/intervention.py index 24d25983..7bc3fabb 100644 --- a/intervention/views/intervention.py +++ b/intervention/views/intervention.py @@ -9,16 +9,14 @@ from django.contrib import messages from django.contrib.auth.decorators import login_required from django.http import HttpRequest, HttpResponse from django.shortcuts import get_object_or_404, render, redirect -from django.urls import reverse from django.utils.translation import gettext_lazy as _ from intervention.forms.intervention import EditInterventionForm, NewInterventionForm from intervention.models import Intervention from intervention.tables import InterventionTable from konova.contexts import BaseContext -from konova.decorators import default_group_required, shared_access_required, login_required_modal +from konova.decorators import default_group_required, shared_access_required from konova.forms import SimpleGeomForm -from konova.forms.modals import RemoveModalForm from konova.sub_settings.context_settings import TAB_TITLE_IDENTIFIER from konova.utils.message_templates import RECORDED_BLOCKS_EDIT, \ CHECK_STATE_RESET, FORM_INVALID, IDENTIFIER_REPLACED, GEOMETRY_SIMPLIFIED, \ @@ -179,26 +177,3 @@ def edit_view(request: HttpRequest, id: str): context = BaseContext(request, context).context return render(request, template, context) - -@login_required_modal -@login_required -@default_group_required -@shared_access_required(Intervention, "id") -def remove_view(request: HttpRequest, id: str): - """ Renders a remove view for this intervention - - Args: - request (HttpRequest): The incoming request - id (str): The uuid id as string - - Returns: - - """ - obj = Intervention.objects.get(id=id) - identifier = obj.identifier - form = RemoveModalForm(request.POST or None, instance=obj, request=request) - return form.process_request( - request, - _("{} removed").format(identifier), - redirect_url=reverse("intervention:index") - ) diff --git a/intervention/views/remove.py b/intervention/views/remove.py new file mode 100644 index 00000000..10b6ae7f --- /dev/null +++ b/intervention/views/remove.py @@ -0,0 +1,19 @@ +""" +Author: Michel Peltriaux +Created on: 14.12.25 + +""" +from django.utils.decorators import method_decorator + +from intervention.models import Intervention +from konova.decorators import shared_access_required +from konova.views.remove import AbstractRemoveView + + +class RemoveInterventionView(AbstractRemoveView): + _MODEL = Intervention + _REDIRECT_URL = "intervention:index" + + @method_decorator(shared_access_required(Intervention, "id")) + def dispatch(self, request, *args, **kwargs): + return super().dispatch(request, *args, **kwargs) diff --git a/konova/views/remove.py b/konova/views/remove.py new file mode 100644 index 00000000..7117d9cd --- /dev/null +++ b/konova/views/remove.py @@ -0,0 +1,65 @@ +""" +Author: Michel Peltriaux +Created on: 14.12.25 + +""" +from django.contrib.auth.mixins import LoginRequiredMixin +from django.http import HttpRequest +from django.urls import reverse +from django.utils.decorators import method_decorator +from django.views import View +from django.utils.translation import gettext_lazy as _ + +from konova.decorators import default_group_required +from konova.forms.modals import RemoveModalForm + + +class AbstractRemoveView(LoginRequiredMixin, View): + _MODEL = None + _REDIRECT_URL = None + _FORM = RemoveModalForm + + class Meta: + abstract = True + + @method_decorator(default_group_required) + def dispatch(self, request, *args, **kwargs): + return super().dispatch(request, *args, **kwargs) + + def __process_request(self, request: HttpRequest, id: str): + obj = self._MODEL.objects.get(id=id) + identifier = obj.identifier + form = self._FORM(request.POST or None, instance=obj, request=request) + return form.process_request( + request, + _("{} removed").format(identifier), + redirect_url=reverse(self._REDIRECT_URL) + ) + + def get(self, request: HttpRequest, id: str): + """ GET endpoint for removing via modal form + + Due to the legacy logic of the form (which processes get and post requests directly), we simply need to pipe + the request from GET and POST endpoints directly into the same method. + + Args: + request (HttpRequest): The incoming request + id (str): The uuid id as string + + Returns: + """ + return self.__process_request(request, id) + + def post(self, request: HttpRequest, id: str): + """ POST endpoint for removing via modal form + + Due to the legacy logic of the form (which processes get and post requests directly), we simply need to pipe + the request from GET and POST endpoints directly into the same method. + + Args: + request (HttpRequest): The incoming request + id (str): The uuid id as string + + Returns: + """ + return self.__process_request(request, id) diff --git a/konova/views/report.py b/konova/views/report.py index 0f908bd8..4e1efb28 100644 --- a/konova/views/report.py +++ b/konova/views/report.py @@ -3,9 +3,8 @@ Author: Michel Peltriaux Created on: 14.12.25 """ -from abc import abstractmethod +from abc import abstractmethod, ABC -from django.contrib.auth.mixins import LoginRequiredMixin from django.http import HttpRequest, HttpResponse from django.utils.decorators import method_decorator from django.views import View @@ -13,12 +12,9 @@ from django.views import View from konova.decorators import uuid_required -class AbstractPublicReportView(LoginRequiredMixin, View): +class AbstractPublicReportView(View, ABC): _TEMPLATE = None - class Meta: - abstract = True - @method_decorator(uuid_required) def dispatch(self, request, *args, **kwargs): return super().dispatch(request, *args, **kwargs) diff --git a/locale/de/LC_MESSAGES/django.mo b/locale/de/LC_MESSAGES/django.mo index 4f5c1c6cdbcd85104ef8449094f69ddd59f917aa..2cbacbbcbbb40e1071cb010a5a2267ef36267c6e 100644 GIT binary patch delta 11761 zcmYk?2V7Ux|HttQA|ehzz=7+FDBu9aJ#*yNaPO^vk_yIf>({;a$koq1(_EC9s~lyf zrrEHcIC54$HCI;V=>K|u&+-50KK%GRpL6d$_pE!te!siFc<=qy+kLfw&r*k@xVPgJ zL!ThWxk&k5xN04zd5q%(csWiBTuk0A)^YNY-^cUh&nr4kXFOBMaZ)fM&T-n|B8p-hJ_&vzPA(1ooq2X;qh)#_-&k*>u76gO`Bw+LYMB`bLG>^KHRY91H#WiI*bOz3 z5g3XyQ6pc2>gYbyjC_rS@iOW`Pf;`c5(6=BZPRY?+RT3#6>(IQ#MY<>4ME*F3;l4B z%~zp1v;ozTk5Myn3N;hwQ4jbDb^jyOj6Orp+f~POFdSp3ujr=WL!lRHCi>e8GEqIA zjB0ohs^RshHO@j-%QOgH&drdG5JEA)1PNkp`jIb5sQEN60 zi{c{G4D3WL&BxdUPuTim^~_R~K|P=js>3Z&9qo>4KLORD!S?((q&>GYmx9)8r9H6~ zwWj;c1ooXoTuuSJVI!QSH2gQ8)uD;BIV#SI}SYe@uO| z1T|43sD~PHYt)o?LN%C#8bKPW!&9t_Z2el)67EHHM@{{o=;x;J z4+Tw;Ujwtb0`N`p2-L0~h#IjQo8xj+2d<+!^Z;|BS3}cIF4WTHNA0b0r~y<&&k~^q z*b+VOe+LS>FbTE02ct&dMvZ8W&DWqtv;!mY5UQb@sPDl&)Ib6nnGP02jl49f{fgGA z$S1(5)rk4$tLvoM3%4N4>+Hn__z+npCywdR+7H8FI2)_u3+#$j8k-+JbFc*Yb97-? z6Z1OPLCsV*)W8O#W_Dx~=3gJ01ypFtHenGwirQ4!s7>?;d!t`dGqQoGCCNn1&^+|T zb*LHKis5+3)?Y(aXFc)egNw*&bO>H3R^(c=q*cH`*X{ec*jookyYSVhPVA*gY zs>8pdHsvc+dwE-$C5S?Gv^na0Yt)0gBYVm1^rzrYMH=dL8;4q>d8me0+4@a3--p`8 zpCLa@N>qLy|A`e-P-DCmJ7q8@k@)sfSvO?DY| zLvU*|g0iT!tbv-+)~F8kMU6BSwZ`eF_NJn)pO5O$M%3OpgatK~->ZQ4>;*aAavc6R zMfpo3OvbXf2KCyU!hGl*Z(heh)Oi-XQw?fInI1+hnFxXR^aoeO{37asw{3nO)y{L&p7C#MKHZTRK>jBBVF%2EJ=-$> zDh#4R9mzo63}+1L^*M$ycnkUC6kr(XH~>51MeKkT+M5nfKn-B7%~zq?-HLk7E>s5& z+WbU&=3gT{PleX#3I^e0)Y|&cdPyvdtFb1k!HXD(S5XgqfWi0@HPRq@C&N)Q5{GKH z0qS|}Q61{zrl1A~qc%$#YD&kV)@TZ<;nk=I?nO0l9M#}?TYtm)1pTS^>0~+(fV!_F z>iSAp02`q?;O=BA`k^|IfqI?BqdGPj^+}zD>c}=^kj`P$rVZ+B>Z4H)sEg`&JZhH@ zvQ9*`vl8`v_ynuz{r`@F*4n>|=}`qNPF@rBx^zZ0l!EnfI_msM)X$3BsHu+V%IL5P zHp2u|hjw5YJc3<d23-K6-xsKcS#0d4-`E#AmJ`MxpXIP$TbX9fTp|V^P;FL`~&Z zR7XBU&EN@C2Tq|LoQ=Bv7V7@zm{0G2V0W`gN}x7V4C;$j2i3p?)S53sJ!p;1x1+A# zZ}Tr~{w-?LUB^QB5VfcLdYFy{qS^^Xx7IwIf*w#F8)8l5k29LT%Ha>#AH8~-Z+Zd_ zBcF=v@edq_D|(qFD8!G-Qsm9C9S+7wJdCk;3t4+7xDV^^qR^s`Y4~l_l+VTnxDE^B z4J?h%u`0UynlD@@)R%7&a>_Y`8c?x*W{o4!o4f)>VMQ!~UF`Yc{oH0s#!{ghC!*GF zHfqWiU`1SxT8b}GYk3JZ^*2$k+auK4zd#KjZ-3KHDb!L#q3*Aa+H1{G_xEs9P=m>+ zHA%B4#-lng2W#LGtc7PV0(}RV87qg?$y;F#oP_LSXBz4)xrX8R61Aiy6U+>bK`pI& zH-!omvM~ew63s3hhjq!9pw54T-uMc&Bwk6TgJITEs6A8;HNqOG0ky>P*x5P>)!t65 zqW3?Wf<_iF&}@zts0WQit?d|$#!c89zs7hhG{|%`3Du!-7>4iKe2?`jEJFQFEQ&8N z0*fRoXZ`C@P*1y|)-n;bHp7sO>Ws%mUi@spE99=h{1$|-@ORui#Qc|#RYOh3hNSQh zQR)vOFNBkpYW~G^9uJd8^XfFfI~c_Cov3&CNMJ3D#vEzpgHr*uX&Rs(wnxvVu_mKF zC?jw=&O?1zqSDQMb+G_>JnFuFsLh;;nyEGD)+RYXK~wmnJ@Lqzmkpu%DAaWgP@AbY z>cJCGADCqrh`Ue?e`e2TV+i?U)LW4&(_CL1wI`}&GXL7W{ix9EvmDjqt>}XXF%mz+ zocJ?-i1$$sUO(L2cL3FaudpCyV{Uwm8o&$G(uR&OGwVXlNYxR{e`yMhs3?mAQA@B8 zReu20&^6Rj{A%;()|?|v2Ln(Ku8vx&x3CO$#zHt2^>!@5Vz>^~fg^4TdcYaf2!234 z=x5Xo&rm)09c5-92(_CFp{|cZHP{F>^?k4~jz)cW7Nd6kdQ>|{P#rpDbzi5T2R=j1 zK%UX&6Il(_P)E##L(vyAQ5_qLMQ|pD;ReisM^H<63^gO)qh{ou^(pH0dxb2y+bK21 z{BBnnwZ@ZCH_k-exEA%GZK$3fx977lnEWwzMBlOIz8jTu1{Dm5+_c*f`0#F^SirTETu`9Mj-M<0V!5tWiCr}-^glg|M)DrxK z+8a5>)1I3TOIZrKup*t&QoL#HglcFY>c(-XnVEs5a1DmxG1LrQL3Q9y)b#-q%!9*F z^`%iuTo>ao3Eg~6o#hnNLuaD7(H}K+p{QM2&gM0(Z=pKUAJynhLE=9IEH_uqZaiT9|+u>1xzSKf&(!Eov=eCz}V=M-8OC zwI^x@lTb@H7WKSIsJCPOWTr|ZTup@<+JQOnFxJ4Mw*DDvM*OFk8%v@_7K@tFhNuS* z#_E`fdRum&+Rs7_>?o=uXV3>PxGB`8a1mQ!fvM(o>x~`AlQ13+U^~n`&HUW%fpf^G zVIvHl&aY$G8TaF5ERRcP@cG80sQg#d$U|qEP3taAK_ibrjqnXDgB?(7I12S0ScY1| z-Pi|DVs4C@W$NQld!RXL6Zf>Hpo@Hh&DYsH3u%wv|0!rH?^<7>Uaz3pronK`MP3cn z^Lp0SsE+qQE!hy%0EVGn$Eo)GJZwt72DNAIpss7k^m%^&?@U1t=!Y6%GM2*$7>nCc zYjp`V6W4GE{)PN;66f*@C_YBdgXft6%|mVCbyx)tqdNKs^W#$tVgETk^Ua8hpiY!U zO<_&+$Cju~)XAP7VDmK8>o)n!HKTHqwqNIt?q^jTs$6p9VVqfrk|#!8ru^>HJrom;4- zD!-KZ*N3I*QZr?3Fo?V(s(~cyFbp9dje6jGY>R7ABYT9}LoZR+<$Tw4C=9hkF<1hd zpxRGB&D3x=1x?*F)S4|tUtEc8a2=M#N2sMLx{R+F_Qv-x8~HXlBbS@+!wb}2iCk%wTeikF~KB|F`m8L!l&yqJoO=0LN^O}~hR>p$V zH$}DE3-!Pu*6|ohzQE*eXEOy|xF0ozCsDip9O?m=uo&J%bwtC~2Pzmf(psqcW~hd{ zqaHX6HR4IA%{UMB`Yu9sa65+R=l?MZYUrZ9;5MqkSExM@^dGY%MX?xpDbxe%V;yXV zYIrVcFKtHck)v1~FQ7X15Ou%rYO@z2Fp}pxjVLt0WGsU3qdIf~b>jup1Ajp^{5NVZ zpwfRjf zO76YRjHCqWx;obGs1A-oy#=#S?XN*~U@Pi52T?QgowSkHOY>92;Zc`{svJC(KQL3^gNXFbDpK zRq-;aJ$KM{b736nf;y-fsE@fY-k$G_`YF~IHT6p{4{k$E{YN%GiCVgEQG4S7`eOba zW^aU|mNF7qI=54Wf_7t5^v8~v7yF<#(-2fg#$h#_iZ$^dYS;gcE{y!Z{3g{5y~!ux zSe%MF@4eG(<_PRb-VCGl{%@q9wK$8Bn0puh=Eq8yA9rC29zi`YX1AHCKB$=(fa>5# z>jcz@XV~-eQSEHR7|g<0ypEN4z7x2|{Fd7g-yk1@mGA&+N$%SE2dEok_wpMq_QEc> z8}$M5%QA+e-lp2X#C{jh;_%eVyPaz`cH^=-lM|Ktjhj;vUhLC~E5{dN#HkJBZ5tL=BSO zsxm?r|1NpH=U8jag@uS=Hb1~c{p}6K@e^AwE)(T#K8bT9iDfpwXYXl= zJ*az=C`7pxF_9Qf=y1PJVI_qWEN**TjQj^8n!04{fmMhnly!6`{vw)Fw~QD?*$e9t zI_?sAJth9vD(bqaj3tQ)6c1x*yrK2iQNi;!|BZ|jItCDzY*~2|%CXp)ctkmq$WQ!5 z{6XmW)~fIId!8Ee*JE3Lh2C6K5mRj)Z}5>wfA z+sT*Y0bD$f_>$PQcwtmg_iy(0PS}wv3UT#G%2n;%1u4&_Jj>>9V^OYIjL(QVoF8Y; zQFQuJUWjjC7or#C4B`aw4*8eF*Tj6{CC!wN4tF2tTyu~#qvZ?q8RZOcP+sQ#2P}! zpZFP8BZ}~(NvNYU^+z$2_?QSLbOhV`d~hx(gv3%(_`F(36Yi-P9%crd4J3ygu&QI_2#t|EU7!+rtM$GwPb!Yuq@ExK4y|t{w6E7)-&>i#sna-c!D$ zyET{iQ*{MHi4l}@6W{CxRLmWa#{QzQIH3P z;4`8P@eA>o^BV~r`>>!b&$YJJD11p0RpGxlE;cx8XiU|>tPkpS^~x$ze??IJ0jVh& z{RU*XG6p5O(h}2$rKY4O_aBnzqCPz_ZFs+obYEn}2fJ9eDsw*iuCBfCtm7Y2z zQ)j}n-fx>0n^o4G>Xo&9!at#HTB*6g8Oe!hi7BoQ$%(E6VsvJD#_^3Q3CRN!UGe=g xGSkur49d(H-9K^A@qK9tiLT6{uEgY&L|5zM`_eO026DaUIf*pC?cHO={}1`j--G}F delta 11673 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\n" "Language-Team: LANGUAGE \n" @@ -448,7 +448,7 @@ msgid "Select the intervention for which this compensation compensates" msgstr "Wählen Sie den Eingriff, für den diese Kompensation bestimmt ist" #: compensation/forms/compensation.py:114 -#: compensation/views/compensation/compensation.py:120 +#: compensation/views/compensation/compensation.py:121 msgid "New compensation" msgstr "Neue Kompensation" @@ -456,38 +456,38 @@ msgstr "Neue Kompensation" msgid "Edit compensation" msgstr "Bearbeite Kompensation" -#: compensation/forms/eco_account.py:31 compensation/utils/quality.py:97 +#: compensation/forms/eco_account.py:32 compensation/utils/quality.py:97 msgid "Available Surface" msgstr "Verfügbare Fläche" -#: compensation/forms/eco_account.py:34 +#: compensation/forms/eco_account.py:35 msgid "The amount that can be used for deductions" msgstr "Die für Abbuchungen zur Verfügung stehende Menge" -#: compensation/forms/eco_account.py:43 +#: compensation/forms/eco_account.py:44 #: compensation/templates/compensation/detail/eco_account/view.html:67 #: compensation/utils/quality.py:84 msgid "Agreement date" msgstr "Vereinbarungsdatum" -#: compensation/forms/eco_account.py:45 +#: compensation/forms/eco_account.py:46 msgid "When did the parties agree on this?" msgstr "Wann wurde dieses Ökokonto offiziell vereinbart?" -#: compensation/forms/eco_account.py:72 -#: compensation/views/eco_account/eco_account.py:101 +#: compensation/forms/eco_account.py:73 +#: compensation/views/eco_account/eco_account.py:105 msgid "New Eco-Account" msgstr "Neues Ökokonto" -#: compensation/forms/eco_account.py:81 +#: compensation/forms/eco_account.py:82 msgid "Eco-Account XY; Location ABC" msgstr "Ökokonto XY; Flur ABC" -#: compensation/forms/eco_account.py:147 +#: compensation/forms/eco_account.py:148 msgid "Edit Eco-Account" msgstr "Ökokonto bearbeiten" -#: compensation/forms/eco_account.py:183 +#: compensation/forms/eco_account.py:184 msgid "" "{}m² have been deducted from this eco account so far. The given value of {} " "would be too low." @@ -495,12 +495,16 @@ msgstr "" "{}n² wurden bereits von diesem Ökokonto abgebucht. Der eingegebene Wert von " "{} wäre daher zu klein." -#: compensation/forms/eco_account.py:247 +#: compensation/forms/eco_account.py:248 msgid "The account can not be removed, since there are still deductions." msgstr "" "Das Ökokonto kann nicht entfernt werden, da hierzu noch Abbuchungen " "vorliegen." +#: compensation/forms/eco_account.py:257 +msgid "Please contact the responsible conservation office to find a solution!" +msgstr "Kontaktieren Sie die zuständige Naturschutzbehörde um eine Lösung zu finden!" + #: compensation/forms/mixins.py:37 #: compensation/templates/compensation/detail/eco_account/view.html:63 #: compensation/templates/compensation/report/eco_account/report.html:20 @@ -1288,44 +1292,40 @@ msgstr "" msgid "Responsible data" msgstr "Daten zu den verantwortlichen Stellen" -#: compensation/views/compensation/compensation.py:58 +#: compensation/views/compensation/compensation.py:52 msgid "Compensations - Overview" msgstr "Kompensationen - Übersicht" -#: compensation/views/compensation/compensation.py:181 +#: compensation/views/compensation/compensation.py:167 #: konova/utils/message_templates.py:40 msgid "Compensation {} edited" msgstr "Kompensation {} bearbeitet" -#: compensation/views/compensation/compensation.py:196 -#: compensation/views/eco_account/eco_account.py:173 ema/views/ema.py:238 -#: intervention/views/intervention.py:253 +#: compensation/views/compensation/compensation.py:190 +#: compensation/views/eco_account/eco_account.py:168 ema/views/ema.py:173 +#: intervention/views/intervention.py:175 msgid "Edit {}" msgstr "Bearbeite {}" #: compensation/views/compensation/report.py:35 -#: compensation/views/eco_account/report.py:36 ema/views/report.py:35 -#: intervention/views/report.py:35 +#: compensation/views/eco_account/report.py:35 ema/views/report.py:35 +#: intervention/views/report.py:36 msgid "Report {}" msgstr "Bericht {}" -#: compensation/views/eco_account/eco_account.py:53 +#: compensation/views/eco_account/eco_account.py:49 msgid "Eco-account - Overview" msgstr "Ökokonten - Übersicht" -#: compensation/views/eco_account/eco_account.py:86 +#: compensation/views/eco_account/eco_account.py:82 msgid "Eco-Account {} added" msgstr "Ökokonto {} hinzugefügt" -#: compensation/views/eco_account/eco_account.py:158 +#: compensation/views/eco_account/eco_account.py:145 msgid "Eco-Account {} edited" msgstr "Ökokonto {} bearbeitet" -#: compensation/views/eco_account/eco_account.py:288 -msgid "Eco-account removed" -msgstr "Ökokonto entfernt" - -#: ema/forms.py:42 ema/tests/unit/test_forms.py:27 ema/views/ema.py:108 +#: ema/forms.py:42 ema/tests/unit/test_forms.py:27 ema/views/ema.py:107 msgid "New EMA" msgstr "Neue EMA hinzufügen" @@ -1353,22 +1353,18 @@ msgstr "" msgid "Payment funded compensation" msgstr "Ersatzzahlungsmaßnahme" -#: ema/views/ema.py:53 +#: ema/views/ema.py:52 msgid "EMAs - Overview" msgstr "EMAs - Übersicht" -#: ema/views/ema.py:86 +#: ema/views/ema.py:85 msgid "EMA {} added" msgstr "EMA {} hinzugefügt" -#: ema/views/ema.py:223 +#: ema/views/ema.py:150 msgid "EMA {} edited" msgstr "EMA {} bearbeitet" -#: ema/views/ema.py:262 -msgid "EMA removed" -msgstr "EMA entfernt" - #: intervention/forms/intervention.py:49 msgid "Construction XY; Location ABC" msgstr "Bauvorhaben XY; Flur ABC" @@ -1429,7 +1425,7 @@ msgstr "Datum Bestandskraft bzw. Rechtskraft" #: intervention/forms/intervention.py:216 #: intervention/tests/unit/test_forms.py:36 -#: intervention/views/intervention.py:105 +#: intervention/views/intervention.py:109 msgid "New intervention" msgstr "Neuer Eingriff" @@ -1665,22 +1661,18 @@ msgstr "" msgid "Check performed" msgstr "Prüfung durchgeführt" -#: intervention/views/intervention.py:57 +#: intervention/views/intervention.py:53 msgid "Interventions - Overview" msgstr "Eingriffe - Übersicht" -#: intervention/views/intervention.py:90 +#: intervention/views/intervention.py:86 msgid "Intervention {} added" msgstr "Eingriff {} hinzugefügt" -#: intervention/views/intervention.py:236 +#: intervention/views/intervention.py:150 msgid "Intervention {} edited" msgstr "Eingriff {} bearbeitet" -#: intervention/views/intervention.py:278 -msgid "{} removed" -msgstr "{} entfernt" - #: konova/decorators.py:32 msgid "You need to be staff to perform this action!" msgstr "Hierfür müssen Sie Mitarbeiter sein!" @@ -1810,7 +1802,7 @@ msgstr "Nicht editierbar" msgid "Geometry" msgstr "Geometrie" -#: konova/forms/geometry_form.py:100 +#: konova/forms/geometry_form.py:105 msgid "Only surfaces allowed. Points or lines must be buffered." msgstr "" "Nur Flächen erlaubt. Punkte oder Linien müssen zu Flächen gepuffert werden." @@ -2268,8 +2260,9 @@ msgid "" "too small to be valid). These parts have been removed. Please check the " "stored geometry." msgstr "" -"Die Geometrie enthielt {} invalide Bestandteile (z.B. unaussagekräftige Kleinstflächen)." -"Diese Bestandteile wurden automatisch entfernt. Bitte überprüfen Sie die angepasste Geometrie." +"Die Geometrie enthielt {} invalide Bestandteile (z.B. unaussagekräftige " +"Kleinstflächen).Diese Bestandteile wurden automatisch entfernt. Bitte " +"überprüfen Sie die angepasste Geometrie." #: konova/utils/message_templates.py:89 msgid "This intervention has {} revocations" @@ -2330,6 +2323,10 @@ msgstr "{} verzeichnet" msgid "Errors found:" msgstr "Fehler gefunden:" +#: konova/views/remove.py:35 +msgid "{} removed" +msgstr "{} entfernt" + #: konova/views/resubmission.py:39 msgid "Resubmission set" msgstr "Wiedervorlage gesetzt"