From 3ae0dc0cc1752cdce726212d93255795f1e394e9 Mon Sep 17 00:00:00 2001 From: mpeltriaux Date: Sun, 10 May 2026 10:54:48 +0200 Subject: [PATCH] # Support for GET and PUT * adds full external identifier support for GET and PUT methods on EIV, KOM, EMA and OEK --- api/utils/serializer/serializer.py | 8 ++++++++ api/utils/serializer/v1/compensation.py | 16 +++++++--------- api/utils/serializer/v1/ecoaccount.py | 4 ++-- api/utils/serializer/v1/ema.py | 4 ++-- api/utils/serializer/v1/intervention.py | 4 ++-- api/utils/serializer/v1/serializer.py | 8 ++++---- 6 files changed, 25 insertions(+), 19 deletions(-) diff --git a/api/utils/serializer/serializer.py b/api/utils/serializer/serializer.py index 0af19359..96386509 100644 --- a/api/utils/serializer/serializer.py +++ b/api/utils/serializer/serializer.py @@ -171,6 +171,14 @@ class AbstractModelAPISerializer: Returns: """ + # First if there is an external identifier linked to an internal one, so we can continue with the internal + try: + ext_id = ExternalIdentifier.objects.get(external_id=id) + id = ext_id.internal_id + except ObjectDoesNotExist: + # No external id found - let's hope the given id exists internally + pass + obj = self.model.objects.get( id=id, deleted__isnull=True, diff --git a/api/utils/serializer/v1/compensation.py b/api/utils/serializer/v1/compensation.py index e78ff7f8..a94527a5 100644 --- a/api/utils/serializer/v1/compensation.py +++ b/api/utils/serializer/v1/compensation.py @@ -113,9 +113,11 @@ class CompensationAPISerializerV1(AbstractModelAPISerializerV1, AbstractCompensa obj = self._initialize_objects(json_model, user) # Fill in data to objects - properties = json_model.get("properties", None) - if not properties: - raise AssertionError("No 'properties' found in payload!") + properties = json_model["properties"] + + external_identifier = properties.get("external_identifier", None) + self._check_external_identifier_on_entry_creation(external_identifier) + obj.identifier = obj.generate_new_identifier() obj.title = properties["title"] obj.is_cef = properties["is_cef"] @@ -131,7 +133,7 @@ class CompensationAPISerializerV1(AbstractModelAPISerializerV1, AbstractCompensa obj = self._set_compensation_states(obj, properties["after_states"], obj.after_states) obj = self._set_deadlines(obj, properties["deadlines"]) - self._set_external_identifier(obj, properties.get("external_identifier", None)) + self._set_external_identifier(obj.id, properties.get("external_identifier", None), obj.created) obj.log.add(obj.created) celery_update_parcels.delay(obj.geometry.id) @@ -156,10 +158,6 @@ class CompensationAPISerializerV1(AbstractModelAPISerializerV1, AbstractCompensa # Fill in data to objects properties = json_model["properties"] - - external_identifier = properties.get("external_identifier", None) - self._check_external_identifier_on_entry_creation(external_identifier) - obj.title = properties["title"] obj.is_cef = properties["is_cef"] obj.is_coherence_keeping = properties["is_coherence_keeping"] @@ -177,7 +175,7 @@ class CompensationAPISerializerV1(AbstractModelAPISerializerV1, AbstractCompensa obj = self._set_compensation_states(obj, properties["after_states"], obj.after_states) obj = self._set_deadlines(obj, properties["deadlines"]) - self._set_external_identifier(obj, properties.get("external_identifier", None)) + self._set_external_identifier(obj.id, properties.get("external_identifier", None), update_action) obj.log.add(update_action) celery_update_parcels.delay(obj.geometry.id) diff --git a/api/utils/serializer/v1/ecoaccount.py b/api/utils/serializer/v1/ecoaccount.py index e930b0dc..123c9e4e 100644 --- a/api/utils/serializer/v1/ecoaccount.py +++ b/api/utils/serializer/v1/ecoaccount.py @@ -149,7 +149,7 @@ class EcoAccountAPISerializerV1(AbstractModelAPISerializerV1, obj = self._set_compensation_states(obj, properties["after_states"], obj.after_states) obj = self._set_deadlines(obj, properties["deadlines"]) - self._set_external_identifier(obj, properties.get("external_identifier", None)) + self._set_external_identifier(obj.id, properties.get("external_identifier", None), obj.created) obj.log.add(obj.created) obj.users.add(user) @@ -199,7 +199,7 @@ class EcoAccountAPISerializerV1(AbstractModelAPISerializerV1, obj = self._set_compensation_states(obj, properties["after_states"], obj.after_states) obj = self._set_deadlines(obj, properties["deadlines"]) - self._set_external_identifier(obj, external_identifier) + self._set_external_identifier(obj.id, external_identifier, update_action) obj.log.add(update_action) celery_update_parcels.delay(obj.geometry.id) diff --git a/api/utils/serializer/v1/ema.py b/api/utils/serializer/v1/ema.py index 2f045919..5f0b78dd 100644 --- a/api/utils/serializer/v1/ema.py +++ b/api/utils/serializer/v1/ema.py @@ -123,7 +123,7 @@ class EmaAPISerializerV1(AbstractModelAPISerializerV1, AbstractCompensationAPISe obj = self._set_compensation_states(obj, properties["after_states"], obj.after_states) obj = self._set_deadlines(obj, properties["deadlines"]) - self._set_external_identifier(obj, external_identifier) + self._set_external_identifier(obj.id, external_identifier, obj.created) obj.log.add(obj.created) obj.users.add(user) @@ -166,7 +166,7 @@ class EmaAPISerializerV1(AbstractModelAPISerializerV1, AbstractCompensationAPISe obj = self._set_compensation_states(obj, properties["after_states"], obj.after_states) obj = self._set_deadlines(obj, properties["deadlines"]) - self._set_external_identifier(obj, properties.get("external_identifier", None)) + self._set_external_identifier(obj.id, properties.get("external_identifier", None), update_action) obj.log.add(update_action) celery_update_parcels.delay(obj.geometry.id) diff --git a/api/utils/serializer/v1/intervention.py b/api/utils/serializer/v1/intervention.py index da4ff327..332a6912 100644 --- a/api/utils/serializer/v1/intervention.py +++ b/api/utils/serializer/v1/intervention.py @@ -165,7 +165,7 @@ class InterventionAPISerializerV1(AbstractModelAPISerializerV1, obj.legal.save() obj.save() - self._set_external_identifier(obj, external_identifier) + self._set_external_identifier(obj.id, external_identifier, obj.created) obj.users.add(user) obj.log.add(obj.created) @@ -204,8 +204,8 @@ class InterventionAPISerializerV1(AbstractModelAPISerializerV1, obj.legal.save() obj.save() - self._set_external_identifier(obj, properties.get("external_identifier", None)) obj.mark_as_edited(user, edit_comment="API update") + self._set_external_identifier(obj.id, properties.get("external_identifier", None), update_action) obj.send_data_to_egon() celery_update_parcels.delay(obj.geometry.id) diff --git a/api/utils/serializer/v1/serializer.py b/api/utils/serializer/v1/serializer.py index adadee93..dea48e83 100644 --- a/api/utils/serializer/v1/serializer.py +++ b/api/utils/serializer/v1/serializer.py @@ -138,12 +138,12 @@ class AbstractModelAPISerializerV1(AbstractModelAPISerializer): success = entry.deleted is not None return success - def _set_external_identifier(self, obj, external_identifier): + def _set_external_identifier(self, internal_identifier, external_identifier, log_entry): """ If an external identifier was provided in the payload, we set it in the database Args: - obj (BaseObject): The already processed konova object (EIV, KOM, ...) + internal_identifier (BaseObject): The already processed konova object (EIV, KOM, ...) external_identifier (any): The external identifier taken from the payload Returns: @@ -153,11 +153,11 @@ class AbstractModelAPISerializerV1(AbstractModelAPISerializer): return None ext_id_obj = ExternalIdentifier.objects.get_or_create( - internal_id=obj.id, + internal_id=internal_identifier, external_id=external_identifier )[0] if not ext_id_obj.created: - ext_id_obj.created = obj.created + ext_id_obj.created = log_entry ext_id_obj.save() return ext_id_obj