From 6945b1711759392b820398b308508951b9c05bec Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Thu, 8 Feb 2024 07:31:19 +0100 Subject: [PATCH] # Optimizations and fixes * drops identifier handling on all edit-forms (identifier editing has been disabled on the frontend for a while now) * updates test cases * updates form caption for checking and recording action (less intimidating) * optimizes district column width * fixes bug on frontend parcel fetching on detail view * adds extended tooltip for title column on index tables * retraslates 'Law' to 'Rechtsgrundlage' --- compensation/forms/compensation.py | 2 -- compensation/forms/eco_account.py | 2 -- compensation/models/compensation.py | 1 - .../tests/compensation/test_workflow.py | 14 +++++++--- .../tests/ecoaccount/test_workflow.py | 3 ++- ema/forms.py | 2 -- ema/tests/test_workflow.py | 3 ++- ema/tests/unit/test_forms.py | 2 +- intervention/forms/intervention.py | 2 -- intervention/forms/modals/check.py | 2 +- intervention/tables.py | 5 ++++ intervention/views/intervention.py | 2 +- konova/forms/modals/record_form.py | 2 +- konova/models/geometry.py | 3 +++ konova/tests/test_views.py | 8 +----- konova/tests/unit/test_forms.py | 2 +- konova/utils/tables.py | 4 +++ konova/views/geometry.py | 25 +++++++++--------- locale/de/LC_MESSAGES/django.mo | Bin 45416 -> 45363 bytes locale/de/LC_MESSAGES/django.po | 8 +++--- 20 files changed, 49 insertions(+), 43 deletions(-) diff --git a/compensation/forms/compensation.py b/compensation/forms/compensation.py index cc3fa57..bb1532d 100644 --- a/compensation/forms/compensation.py +++ b/compensation/forms/compensation.py @@ -213,7 +213,6 @@ class EditCompensationForm(NewCompensationForm): action = UserActionLogEntry.get_edited_action(user) # Fetch data from cleaned POST values - identifier = self.cleaned_data.get("identifier", None) title = self.cleaned_data.get("title", None) intervention = self.cleaned_data.get("intervention", None) is_cef = self.cleaned_data.get("is_cef", None) @@ -221,7 +220,6 @@ class EditCompensationForm(NewCompensationForm): is_pik = self.cleaned_data.get("is_pik", None) comment = self.cleaned_data.get("comment", None) - self.instance.identifier = identifier self.instance.title = title self.instance.intervention = intervention self.instance.is_cef = is_cef diff --git a/compensation/forms/eco_account.py b/compensation/forms/eco_account.py index 0352383..4244302 100644 --- a/compensation/forms/eco_account.py +++ b/compensation/forms/eco_account.py @@ -192,7 +192,6 @@ class EditEcoAccountForm(NewEcoAccountForm): def save(self, user: User, geom_form: SimpleGeomForm): with transaction.atomic(): # Fetch data from cleaned POST values - identifier = self.cleaned_data.get("identifier", None) title = self.cleaned_data.get("title", None) registration_date = self.cleaned_data.get("registration_date", None) handler_type = self.cleaned_data.get("handler_type", None) @@ -219,7 +218,6 @@ class EditEcoAccountForm(NewEcoAccountForm): self.instance.legal.save() # Update main oject data - self.instance.identifier = identifier self.instance.title = title self.instance.deductable_surface = surface self.instance.comment = comment diff --git a/compensation/models/compensation.py b/compensation/models/compensation.py index eaf8ccb..49accd4 100644 --- a/compensation/models/compensation.py +++ b/compensation/models/compensation.py @@ -315,7 +315,6 @@ class Compensation(AbstractCompensation, CEFMixin, CoherenceMixin, PikMixin): def get_detail_url_absolute(self): return BASE_URL + self.get_detail_url() - def save(self, *args, **kwargs): if self.identifier is None or len(self.identifier) == 0: # Create new identifier is none was given diff --git a/compensation/tests/compensation/test_workflow.py b/compensation/tests/compensation/test_workflow.py index ee520a5..3f02448 100644 --- a/compensation/tests/compensation/test_workflow.py +++ b/compensation/tests/compensation/test_workflow.py @@ -125,10 +125,16 @@ class CompensationWorkflowTestCase(BaseWorkflowTestCase): self.compensation = self.fill_out_compensation(self.compensation) pre_edit_log_count = self.compensation.log.count() + self.assertTrue(self.compensation.is_shared_with(self.superuser)) + + old_identifier = self.compensation.identifier new_title = self.create_dummy_string() new_identifier = self.create_dummy_string() new_comment = self.create_dummy_string() - new_geometry = MultiPolygon(srid=4326) # Create an empty geometry + new_geometry = MultiPolygon( + self.compensation.geometry.geom.buffer(10), + srid=self.compensation.geometry.geom.srid + ) # Create a geometry which differs from the stored one geojson = self.create_geojson(new_geometry) check_on_elements = { @@ -151,19 +157,21 @@ class CompensationWorkflowTestCase(BaseWorkflowTestCase): check_on_elements = { self.compensation.title: new_title, - self.compensation.identifier: new_identifier, self.compensation.comment: new_comment, } for k, v in check_on_elements.items(): self.assertEqual(k, v) - self.assert_equal_geometries(self.compensation.geometry.geom, new_geometry) + # Expect identifier to not be editable + self.assertEqual(self.compensation.identifier, old_identifier, msg="Identifier was editable!") # Expect logs to be set self.assertEqual(pre_edit_log_count + 1, self.compensation.log.count()) self.assertEqual(self.compensation.log.first().action, UserAction.EDITED) + self.assert_equal_geometries(self.compensation.geometry.geom, new_geometry) + def test_checkability(self): """ This tests if the checkability of the compensation (which is defined by the linked intervention's checked diff --git a/compensation/tests/ecoaccount/test_workflow.py b/compensation/tests/ecoaccount/test_workflow.py index 3bfaffe..85f7db5 100644 --- a/compensation/tests/ecoaccount/test_workflow.py +++ b/compensation/tests/ecoaccount/test_workflow.py @@ -82,6 +82,7 @@ class EcoAccountWorkflowTestCase(BaseWorkflowTestCase): url = reverse("compensation:acc:edit", args=(self.eco_account.id,)) pre_edit_log_count = self.eco_account.log.count() + old_identifier = self.eco_account.identifier new_title = self.create_dummy_string() new_identifier = self.create_dummy_string() new_comment = self.create_dummy_string() @@ -114,7 +115,6 @@ class EcoAccountWorkflowTestCase(BaseWorkflowTestCase): check_on_elements = { self.eco_account.title: new_title, - self.eco_account.identifier: new_identifier, self.eco_account.deductable_surface: test_deductable_surface, self.eco_account.deductable_rest: test_deductable_surface - deductions_surface, self.eco_account.comment: new_comment, @@ -123,6 +123,7 @@ class EcoAccountWorkflowTestCase(BaseWorkflowTestCase): for k, v in check_on_elements.items(): self.assertEqual(k, v) + self.assertEqual(self.eco_account.identifier, old_identifier) self.assert_equal_geometries(self.eco_account.geometry.geom, new_geometry) # Expect logs to be set diff --git a/ema/forms.py b/ema/forms.py index d6b77a4..26bbc2d 100644 --- a/ema/forms.py +++ b/ema/forms.py @@ -133,7 +133,6 @@ class EditEmaForm(NewEmaForm): def save(self, user: User, geom_form: SimpleGeomForm): with transaction.atomic(): # Fetch data from cleaned POST values - identifier = self.cleaned_data.get("identifier", None) title = self.cleaned_data.get("title", None) handler_type = self.cleaned_data.get("handler_type", None) handler_detail = self.cleaned_data.get("handler_detail", None) @@ -154,7 +153,6 @@ class EditEmaForm(NewEmaForm): self.instance.responsible.save() # Update main oject data - self.instance.identifier = identifier self.instance.title = title self.instance.comment = comment self.instance.is_pik = is_pik diff --git a/ema/tests/test_workflow.py b/ema/tests/test_workflow.py index 3e5bd29..c622811 100644 --- a/ema/tests/test_workflow.py +++ b/ema/tests/test_workflow.py @@ -80,6 +80,7 @@ class EmaWorkflowTestCase(BaseWorkflowTestCase): self.ema = self.fill_out_ema(self.ema) pre_edit_log_count = self.ema.log.count() + old_identifier = self.ema.identifier new_title = self.create_dummy_string() new_identifier = self.create_dummy_string() new_comment = self.create_dummy_string() @@ -106,13 +107,13 @@ class EmaWorkflowTestCase(BaseWorkflowTestCase): check_on_elements = { self.ema.title: new_title, - self.ema.identifier: new_identifier, self.ema.comment: new_comment, } for k, v in check_on_elements.items(): self.assertEqual(k, v) + self.assertEqual(self.ema.identifier, old_identifier) self.assert_equal_geometries(self.ema.geometry.geom, new_geometry) # Expect logs to be set diff --git a/ema/tests/unit/test_forms.py b/ema/tests/unit/test_forms.py index ff87b9f..d66fd14 100644 --- a/ema/tests/unit/test_forms.py +++ b/ema/tests/unit/test_forms.py @@ -130,7 +130,7 @@ class EditEmaFormTestCase(BaseTestCase): self.assertIsNotNone(obj.responsible.handler) self.assertEqual(obj.responsible.conservation_office, data["conservation_office"]) self.assertEqual(obj.responsible.conservation_file_number, data["conservation_file_number"]) - self.assertEqual(obj.identifier, data["identifier"]) + self.assertNotEqual(obj.identifier, data["identifier"], msg="Identifier editable via form!") self.assertEqual(obj.comment, data["comment"]) last_log = obj.log.first() diff --git a/intervention/forms/intervention.py b/intervention/forms/intervention.py index 72986ad..629bfe2 100644 --- a/intervention/forms/intervention.py +++ b/intervention/forms/intervention.py @@ -345,7 +345,6 @@ class EditInterventionForm(NewInterventionForm): """ with transaction.atomic(): - identifier = self.cleaned_data.get("identifier", None) title = self.cleaned_data.get("title", None) process_type = self.cleaned_data.get("type", None) laws = self.cleaned_data.get("laws", None) @@ -379,7 +378,6 @@ class EditInterventionForm(NewInterventionForm): self.instance.log.add(user_action) - self.instance.identifier = identifier self.instance.title = title self.instance.comment = comment self.instance.modified = user_action diff --git a/intervention/forms/modals/check.py b/intervention/forms/modals/check.py index cc06e63..6111134 100644 --- a/intervention/forms/modals/check.py +++ b/intervention/forms/modals/check.py @@ -33,7 +33,7 @@ class CheckModalForm(BaseModalForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.form_title = _("Run check") - self.form_caption = _("I, {} {}, confirm that all necessary control steps have been performed by myself.").format(self.user.first_name, self.user.last_name) + self.form_caption = _("The necessary control steps have been performed:").format(self.user.first_name, self.user.last_name) self.valid = False def _are_deductions_valid(self): diff --git a/intervention/tables.py b/intervention/tables.py index 39cae2a..76d4018 100644 --- a/intervention/tables.py +++ b/intervention/tables.py @@ -33,6 +33,11 @@ class InterventionTable(BaseTable, TableRenderMixin, TableOrderMixin): verbose_name=_("Parcel gmrkng"), orderable=False, accessor="geometry", + attrs={ + "th": { + "class": "w-25", + } + } ) c = tables.Column( verbose_name=_("Checked"), diff --git a/intervention/views/intervention.py b/intervention/views/intervention.py index e04f628..3371167 100644 --- a/intervention/views/intervention.py +++ b/intervention/views/intervention.py @@ -39,7 +39,7 @@ def index_view(request: HttpRequest): """ template = "generic_index.html" - # Filtering by user access is performed in table filter inside of InterventionTableFilter class + # Filtering by user access is performed in table filter inside InterventionTableFilter class interventions = Intervention.objects.filter( deleted=None, # not deleted ).select_related( diff --git a/konova/forms/modals/record_form.py b/konova/forms/modals/record_form.py index 812b697..b27111a 100644 --- a/konova/forms/modals/record_form.py +++ b/konova/forms/modals/record_form.py @@ -27,7 +27,7 @@ class RecordModalForm(BaseModalForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.form_title = _("Record data") - self.form_caption = _("I, {} {}, confirm that all necessary control steps have been performed by myself.").format(self.user.first_name, self.user.last_name) + self.form_caption = _("The necessary control steps have been performed:").format(self.user.first_name, self.user.last_name) # Disable automatic w-100 setting for this type of modal form. Looks kinda strange self.fields["confirm"].widget.attrs["class"] = "" diff --git a/konova/models/geometry.py b/konova/models/geometry.py index d87e557..938c852 100644 --- a/konova/models/geometry.py +++ b/konova/models/geometry.py @@ -370,6 +370,9 @@ class Geometry(BaseResource): Returns: complexity_factor (float): The estimated complexity """ + if self.geom.empty: + return 0 + geom_envelope = self.geom.envelope diff = geom_envelope - self.geom complexity_factor = 1 - self.geom.area / diff.area diff --git a/konova/tests/test_views.py b/konova/tests/test_views.py index c540e78..860b361 100644 --- a/konova/tests/test_views.py +++ b/konova/tests/test_views.py @@ -146,7 +146,6 @@ class BaseTestCase(TestCase): geometry = Geometry.objects.create() # Finally create main object, holding the other objects intervention = Intervention.objects.create( - identifier="TEST", title="Test_title", responsible=responsibility_data, legal=legal_data, @@ -174,7 +173,6 @@ class BaseTestCase(TestCase): geometry = Geometry.objects.create() # Finally create main object, holding the other objects compensation = Compensation.objects.create( - identifier="TEST", title="Test_title", intervention=interv, created=action, @@ -200,10 +198,8 @@ class BaseTestCase(TestCase): responsible_data.handler = handler responsible_data.save() - identifier = EcoAccount().generate_new_identifier() # Finally create main object, holding the other objects eco_account = EcoAccount.objects.create( - identifier=identifier, title="Test_title", deductable_surface=500, legal=lega_data, @@ -230,7 +226,6 @@ class BaseTestCase(TestCase): responsible_data.save() # Finally create main object, holding the other objects ema = Ema.objects.create( - identifier="TEST", title="Test_title", responsible=responsible_data, created=action, @@ -474,7 +469,7 @@ class BaseTestCase(TestCase): eco_account.save() return eco_account - def assert_equal_geometries(self, geom1: MultiPolygon, geom2: MultiPolygon): + def assert_equal_geometries(self, geom1: MultiPolygon, geom2: MultiPolygon, tolerance = 0.001): """ Assert for geometries to be equal Transforms the geometries to matching srids before checking @@ -491,7 +486,6 @@ class BaseTestCase(TestCase): self.assertTrue(True) return - tolerance = 0.001 if geom1.srid != geom2.srid: # Due to prior possible transformation of any of these geometries, we need to make sure there exists a # transformation from one coordinate system into the other, which is valid diff --git a/konova/tests/unit/test_forms.py b/konova/tests/unit/test_forms.py index 3cbb437..190a756 100644 --- a/konova/tests/unit/test_forms.py +++ b/konova/tests/unit/test_forms.py @@ -152,7 +152,7 @@ class RecordModalFormTestCase(BaseTestCase): ) self.assertEqual(form.form_title, str(_("Record data"))) self.assertEqual(form.form_caption, str( - _("I, {} {}, confirm that all necessary control steps have been performed by myself.").format( + _("The necessary control steps have been performed:").format( self.user.first_name, self.user.last_name ) diff --git a/konova/utils/tables.py b/konova/utils/tables.py index d64c766..4878548 100644 --- a/konova/utils/tables.py +++ b/konova/utils/tables.py @@ -173,9 +173,13 @@ class TableRenderMixin: Returns: """ + value_orig = value max_length = 75 if len(value) > max_length: value = f"{value[:max_length]}..." + value = format_html( + f'
{value}
' + ) return value def render_d(self, value, record: GeoReferencedMixin): diff --git a/konova/views/geometry.py b/konova/views/geometry.py index 0a58a3c..767762f 100644 --- a/konova/views/geometry.py +++ b/konova/views/geometry.py @@ -33,9 +33,6 @@ class GeomParcelsView(LoginRequiredMixin, View): Returns: A rendered piece of HTML """ - # HTTP code 286 states that the HTMX should stop polling for updates - # https://htmx.org/docs/#polling - status_code = 286 template = "konova/includes/parcels/parcel_table_frame.html" geom = get_object_or_404(Geometry, id=id) @@ -49,22 +46,26 @@ class GeomParcelsView(LoginRequiredMixin, View): waiting_too_long = self._check_waiting_too_long(geom) - parcels_are_currently_calculated = ( - geometry_exists and - not parcels_are_available and - geom_parcel_update_started and - not geom_parcel_update_finished - ) - - if not parcels_are_available and waiting_too_long: - # Trigger calculation again - process may have failed in the background + if geometry_exists and not parcels_are_available and waiting_too_long: + # Trigger calculation again - process may have failed silently celery_update_parcels.delay(geom.id) parcels_are_currently_calculated = True + else: + parcels_are_currently_calculated = ( + geometry_exists and + not parcels_are_available and + geom_parcel_update_started and + not geom_parcel_update_finished + ) if parcels_are_currently_calculated: # Parcels are being calculated right now. Change the status code, so polling stays active for fetching # results after the calculation status_code = 200 + else: + # HTTP code 286 states that the HTMX should stop polling for updates + # https://htmx.org/docs/#polling + status_code = 286 if parcels_are_available or not geometry_exists: # Default case: Parcels are calculated or there is no geometry at all diff --git a/locale/de/LC_MESSAGES/django.mo b/locale/de/LC_MESSAGES/django.mo index ff48ee9b246e525b380b8e45bd5bad366e374a04..1db23bbc18df338c482d750c6dbcfbc6c146d82e 100644 GIT binary patch delta 9263 zcmY+}37k*m9>?)BX0Z)pR?L_cv)dV&Y*~v&wviZOFvgmUHO65YVl2r&`>wfCA`Fpe zxuR4Q%92R5SaNS!LZ$BKJI~{F?>(=6-p_K*v!C<#(&dX~N-mb!HqXy(>^M$g8^@`D zZ(|Gm5L;uJwvN*h+hRBt;22zuX;`_P4TB-ByWN6iYV2i0I0 z>i!tifSRDrNCs-4Io5nz|1xH1jo%=l8UBt*SU-d1$3Ccmcu-5Y9#y{`wX|okIbK30 z?Zk9pwQvOb;(pX&K7cwS=ddzCXB`lgOrE4HlppjHTBqn274I8R~(K z7=V4PBTy?b1=Vm7s>4;N0lkK5Zx`x}>_e^OA=K6!?ZNu1qstWN!F#BN{FuJVt67t< z0{L{*0NUH~Ow|237=)8h9nZD-rKpZyN4*6*Q3HA#^`(5@B@s;GThuANY4a5_O~X;B zk=93@=1$f@s0OB@z5^?<3BHB;^8Jh&NabGU6C93uD;`3%(-m8xJIvnj8tU8s5o(6M zPtqxdVn^(Nn&|?pjq6Z*eF$~hKS!<5SE!Y^fT4I3!?1jBlaE17IL+ufok)aG&>wYU z9%|%8sDUg&E!{@c05+pK-jBNf5bF7JsIzhdbtd!~RXzaqVTwdOpN-n;aad9B{|s9& zAN9Zro8M&fyHE`tz^Zs0b%?H_26h8A;5(?j_U>aksDzJ@568Zkg~_-Fv+)wf(7)4x zT2|c|ievCy%*T3JW(&4p9QpIu4ZZp~PCWL&y7(N%;A_@TP)mOeTca00oz<`n*22En z7^kD#oWw2?`m)`?r?CcqXeLupdpisD&7X$}_##H(Zd-p6wG!W;p8L+`uc21z7p#YO zQCpBWz-(dq0M=hi-j)I#o^Gf;&qB>$B&y*8)E2yeYG4WKkZnRe{|@R*97b)$aa8$v z)Bt|Qrg#gRVd_A~sfjrQU9)sW6r@qG8TI3G5hL+Oj76Vpvxo7hr7J+~=pei-bn_ zp7jXo!*Ujv;SCJIxzCyh*P*s(2kNi!w1v$7o1@E``@pBRMxoKPQ(#(1oS zt}ltsBz9sqR6~B_&4W>>0o29Pj#2M-FVxHip!Rq&24f*=MV4VL+=x1apQ5(lwk?mE zVA^Rrf%OlhBEuFuZ5@UhVIGFz3M_})u{Q2S4fF!)t+|Ue(08I4KpbkI^-&W@NA=Sg zb$>t9z=uy{{j~z)DbOjOf_h*vs=!JkmiT}M6V^PK6&twcg2Pe9$!3bmKLuqO_;P$)|EEc)fq$V^;2y?dm1$-sjj%fTE~u5tMcqFg zHGsLcd@*XTw_pQ2g<7HV^ub5Zse!t`5cT{53?ZE5{Gr!os|s+R^%!bEKcYImkD7Vt zbYl`ml5c_Ps4wdN(KbI5wW7;VE3pZ+Rl86F_yFAq5}%Q1hL=%$7dOMqxCQnh|0L?I z*n#Tk0BR;Dtrt*Ra}~9fPJ!vr5B0VLqb3-KYNtMW<0A#Ee^V0eZACunfd#0JR-=}5 z8>+*vF%7@R4jA#gd3&-^9SlRwY$9qP1*k9HY)r@b*cm@Yy?!CuiykCu6q+BKG1!g# zdzg%YGx=K&Hpe!282QifpT#?ji%_53&M%n18BIjx*P7ysI%dI zL_!Uo!m@Y`HS(L*GDT+Of#^+n9G1g)TV4+}qt;jfGg0jfKy{pp$>?HTd>yqVXOIcI z&Uq3eDY%1L>cMkaR{Ry!Q6YsI`Fzx2U5AZuA8J6qpay&kH4yLlW@gn;<%y`3YKj%` zF|33=v9jL(Y+LXw>NRswhjJ-a#LrP9K8xz$0_uBk8@ph@0+a8LIwO$70mLwxR~Q7gO;D*1_n7W~no< z9{H)*0N=pAcpmlkq`$;u8_~wkp|U zznG{M>wocg8oa|x!)!_mPy5d^Y%zi-~qCf48J};XARYz@6Dn?;DR0o4F z0LP%y927`LOs_I)zPD6;CgB?&a%|=aNk}aQ&J;@iN26)fvx6ZU5jA}O#T`keW zBy_4XPz^nWF*pph)J3R6wH@_Zy^Xr>UDO^QMIFA=_yqohld$P}vvS)opZq0MdjmJ{ z%Hr$|tp6+$KU2U#ck*5_Ti{=8-q*G`itT%`Pcy8!Wg`a>FAb!-TZ?=J5)tStckgph4U~Gub`GbXtUYFE;x<+ zc+?8q!qMpchUsW5Y6Xi?E3gSQu>ID9$V6S|h`r%UR6|#=4&KGO7{A5*=wxCu^0Tld zzHiI_Ms-wwt0`}cdM*#U;|6>ZZzCTZC*w_H4u(2|83KtIDi&ibzJ*$W)7C$+BKeqY z=F^#q^~iTeorwahj2lq*ZMXUTm_z=vZJxccaqSy<@r5TkQ#22gh&PGTht+KEzzo4||@9t5>}&IbDBX86u20Ni6cL zkBe}NNmb|h%J>^GlK6qBN5m3ksMGZ>>9yz*KNI(e=EQ?*0*O_`UE(?s!u{Sv2+vPK ze!QJ6*po;heVpJ*D_xZv6zX~$TM>ag^c?c@Q+kcy&&|X?iJe5e=h>RUzWLm7&NHWG zw7ZE^S7JVOO$lF~PbUB1T1TQ6QO=glBz=bTHlhb{oj6R~Bc7qI5AhCZU4?j#@FF<& zr7u!_()UYiIX+(eV#SczPvKQ8!przR*6}=2D67k@gPU26;bG&v?pE=xeh?q@0xJKDT z7G;-6^GPiIf21nzOH?I#5}m039Cam-u7i8ft8|S#E#spy!^s8^Er@o+@5Ef9D)HbN zLAn~54fq@WPNb6l$lkM*d`03z^4Ewyp6&5fV_&qjR5<@2?IGU!pRx$gmH3E$4Q-PV-<7v`<#D}zS%$CQhIj-*v&IW93>*`u(pf^)2@eE9ej$KTyKjA~kO5D#AL8$91 zqN8VhLa_U+EzwUzma4e!7@XnM?IAtd-ZKmJ0lsDH7g^&dPq685Tw>E>>~lF*75flJ zZT=1IibY{?*ejF~Td`GdZziY`% zDO=&Wl2kLW0=X`Pt|9nuPh@gL;9gs@4CfP_J&z?vxaCP@a^GH}gg8RHMp-)X3^9=W zk3=ZxYAoqS(#MFygszR0mtNG}CmlxSPuxK~NBRR>e+0iUcRCkIKWfT7my!bqjwM~w zC0G={xdw^rPNGXWlL*Wzrfdt7i?bb=&I3q_QZGIp5ZKMl`ZlrSwUB37w4z&5lthcZnV_b`s zY}xzTigjet^d#5EL|NiW$@SE&p(WSbgoS(7wn_0yFZnC0VnRv3!f$;8x(^wYJ1%eN z*zuzWj~qC3NJ*Qb^l(pw!pP8xhYra(urGJ)xb%{V#lQOh2cxOx AQvd(} delta 9266 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 diff --git a/locale/de/LC_MESSAGES/django.po b/locale/de/LC_MESSAGES/django.po index c34cf2d..cd34fbe 100644 --- a/locale/de/LC_MESSAGES/django.po +++ b/locale/de/LC_MESSAGES/django.po @@ -321,7 +321,7 @@ msgstr "" #: intervention/templates/intervention/detail/view.html:39 #: intervention/templates/intervention/report/report.html:20 msgid "Law" -msgstr "Gesetz" +msgstr "Rechtsgrundlage" #: analysis/templates/analysis/reports/includes/old_data/amount.html:17 #: compensation/templates/compensation/detail/compensation/includes/deadlines.html:33 @@ -1452,11 +1452,9 @@ msgstr "Prüfung vornehmen" #: intervention/forms/modals/check.py:36 konova/forms/modals/record_form.py:30 #: konova/tests/unit/test_forms.py:155 msgid "" -"I, {} {}, confirm that all necessary control steps have been performed by " -"myself." +"The necessary control steps have been performed:" msgstr "" -"Ich, {} {}, bestätige, dass die notwendigen Kontrollschritte durchgeführt " -"wurden:" +"Die notwendigen Kontrollschritte wurden durchgeführt:" #: intervention/forms/modals/deduction.py:33 msgid "Only recorded accounts can be selected for deductions"