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 ff48ee9..1db23bb 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 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"