Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions src/objects/api/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

import structlog
from rest_framework import serializers
from rest_framework.validators import UniqueValidator
from rest_framework_gis.serializers import GeometryField

from objects.core.models import Object, ObjectRecord, ObjectType, Reference
Expand Down Expand Up @@ -102,7 +103,13 @@ class ObjectSerializer(DynamicFieldsMixin, serializers.HyperlinkedModelSerialize
uuid = serializers.UUIDField(
source="object.uuid",
required=False,
validators=[IsImmutableValidator()],
validators=[
IsImmutableValidator(),
UniqueValidator(
queryset=Object.objects.all(),
message=_("An object with this UUID already exists."),
),
],
help_text=_("Unique identifier (UUID4)"),
)
type = ObjectTypeField(
Expand All @@ -128,13 +135,16 @@ class Meta:
@transaction.atomic
def create(self, validated_data):
object_data = validated_data.pop("object", {})
if object_type := validated_data.pop("_object_type"):

if object_type := validated_data.pop("_object_type", None):
object_data["object_type"] = object_type

object = Object.objects.create(**object_data)

validated_data["object"] = object
references = validated_data.pop("references", [])
record = super().create(validated_data)

Reference.objects.bulk_create(
Reference(record=record, **ref_data) for ref_data in references
)
Expand Down
28 changes: 28 additions & 0 deletions src/objects/tests/v2/test_validation.py
Original file line number Diff line number Diff line change
Expand Up @@ -535,3 +535,31 @@ def test_update_geometry_not_allowed(self, m):
response.json()["non_field_errors"],
["This object type doesn't support geometry"],
)

def test_create_object_with_duplicate_uuid_returns_400(self, m):
mock_service_oas_get(m, OBJECT_TYPES_API, "objecttypes")
m.get(
f"{self.object_type.url}/versions/1",
json=mock_objecttype_version(self.object_type.url),
)

url = reverse("object-list")

data = {
"uuid": "11111111-1111-1111-1111-111111111111",
"type": self.object_type.url,
"record": {
"typeVersion": 1,
"data": {"diameter": 30},
"startAt": "2026-02-05",
},
}

response = self.client.post(url, data, **GEO_WRITE_KWARGS)
self.assertEqual(response.status_code, status.HTTP_201_CREATED)

response = self.client.post(url, data, **GEO_WRITE_KWARGS)
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertEqual(
response.json()["uuid"], ["An object with this UUID already exists."]
)
Loading