Skip to content

Commit 4ada2bb

Browse files
committed
:sparklse: support creating objects with non-configured objecttypes
1 parent cd8d3fe commit 4ada2bb

File tree

2 files changed

+67
-2
lines changed

2 files changed

+67
-2
lines changed

src/objects/api/fields.py

+20-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
from django.core.exceptions import ObjectDoesNotExist
1+
from django.core.exceptions import ObjectDoesNotExist, ValidationError
22
from django.utils.encoding import smart_str
33
from django.utils.translation import gettext_lazy as _
44

55
from rest_framework import serializers
6+
from vng_api_common.utils import get_uuid_from_path
7+
from zgw_consumers.models import Service
68

79
from objects.core.models import ObjectRecord
810

@@ -42,7 +44,23 @@ def to_internal_value(self, data):
4244
try:
4345
return self.get_queryset().get_by_url(data)
4446
except ObjectDoesNotExist:
45-
self.fail("does_not_exist", value=smart_str(data))
47+
# if service is configured, but objec_type is missing
48+
# let's try to create an ObjectType
49+
service = Service.get_service(data)
50+
if not service:
51+
self.fail("does_not_exist", value=smart_str(data))
52+
53+
uuid = get_uuid_from_path(data)
54+
object_type = self.get_queryset().model(service=service, uuid=uuid)
55+
56+
try:
57+
object_type.clean()
58+
except ValidationError:
59+
self.fail("does_not_exist", value=smart_str(data))
60+
61+
object_type.save()
62+
return object_type
63+
4664
except (TypeError, ValueError):
4765
self.fail("invalid")
4866

src/objects/tests/v2/test_auth.py

+47
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from rest_framework import status
55
from rest_framework.test import APITestCase
66

7+
from objects.core.models import ObjectType
78
from objects.core.tests.factories import (
89
ObjectFactory,
910
ObjectRecordFactory,
@@ -376,6 +377,52 @@ def test_create_superuser(self, m):
376377

377378
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
378379

380+
def test_create_superuser_no_service(self):
381+
url = reverse("object-list")
382+
data = {
383+
"type": f"{OBJECT_TYPES_API}objecttypes/8be76be2-6567-4f5c-a17b-05217ab6d7b2",
384+
"record": {
385+
"typeVersion": 1,
386+
"data": {"plantDate": "2020-04-12", "diameter": 30},
387+
"startAt": "2020-01-01",
388+
},
389+
}
390+
391+
response = self.client.post(url, data, **GEO_WRITE_KWARGS)
392+
393+
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
394+
395+
@requests_mock.Mocker()
396+
def test_create_superuser_no_object_type(self, m):
397+
objecttype_url = (
398+
f"{OBJECT_TYPES_API}objecttypes/8be76be2-6567-4f5c-a17b-05217ab6d7b2"
399+
)
400+
service = ServiceFactory.create(api_root=OBJECT_TYPES_API)
401+
url = reverse("object-list")
402+
data = {
403+
"type": objecttype_url,
404+
"record": {
405+
"typeVersion": 1,
406+
"data": {"plantDate": "2020-04-12", "diameter": 30},
407+
"startAt": "2020-01-01",
408+
},
409+
}
410+
# mocks
411+
mock_service_oas_get(m, OBJECT_TYPES_API, "objecttypes")
412+
m.get(objecttype_url, json=mock_objecttype(objecttype_url))
413+
m.get(
414+
f"{objecttype_url}/versions/1",
415+
json=mock_objecttype_version(objecttype_url),
416+
)
417+
418+
response = self.client.post(url, data, **GEO_WRITE_KWARGS)
419+
420+
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
421+
# check created object type
422+
object_type = ObjectType.objects.get()
423+
self.assertEqual(object_type.service, service)
424+
self.assertEqual(object_type.url, objecttype_url)
425+
379426
@requests_mock.Mocker()
380427
def test_update_superuser(self, m):
381428
object_type = ObjectTypeFactory(service__api_root=OBJECT_TYPES_API)

0 commit comments

Comments
 (0)