From 780de808ffdfe932012257c71c35c94663f935d4 Mon Sep 17 00:00:00 2001 From: Viicos <65306057+Viicos@users.noreply.github.com> Date: Wed, 31 Jan 2024 17:44:09 +0100 Subject: [PATCH] [#3688] Add a `objecttypes_service` field, add tests --- ...10_objectsapiconfig_objecttypes_service.py | 30 ++++++++++++++++ .../contrib/objects_api/models.py | 28 +++++++++++++++ .../contrib/objects_api/tests/test_models.py | 36 +++++++++++++++++++ 3 files changed, 94 insertions(+) create mode 100644 src/openforms/registrations/contrib/objects_api/migrations/0010_objectsapiconfig_objecttypes_service.py create mode 100644 src/openforms/registrations/contrib/objects_api/tests/test_models.py diff --git a/src/openforms/registrations/contrib/objects_api/migrations/0010_objectsapiconfig_objecttypes_service.py b/src/openforms/registrations/contrib/objects_api/migrations/0010_objectsapiconfig_objecttypes_service.py new file mode 100644 index 0000000000..68e225625f --- /dev/null +++ b/src/openforms/registrations/contrib/objects_api/migrations/0010_objectsapiconfig_objecttypes_service.py @@ -0,0 +1,30 @@ +# Generated by Django 3.2.23 on 2024-01-31 14:16 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ("zgw_consumers", "0019_alter_service_uuid"), + ( + "registrations_objects_api", + "0009_objectsapiconfig_payment_status_update_json", + ), + ] + + operations = [ + migrations.AddField( + model_name="objectsapiconfig", + name="objecttypes_service", + field=models.OneToOneField( + limit_choices_to={"api_type": "orc"}, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="+", + to="zgw_consumers.service", + verbose_name="Objecttypes API", + ), + ), + ] diff --git a/src/openforms/registrations/contrib/objects_api/models.py b/src/openforms/registrations/contrib/objects_api/models.py index 2417b940a4..ac0d370c13 100644 --- a/src/openforms/registrations/contrib/objects_api/models.py +++ b/src/openforms/registrations/contrib/objects_api/models.py @@ -1,7 +1,9 @@ +from django.core.exceptions import ValidationError from django.db import models from django.template.loader import render_to_string from django.utils.translation import gettext_lazy as _ +from furl import furl from solo.models import SingletonModel from zgw_consumers.constants import APITypes @@ -34,6 +36,14 @@ class ObjectsAPIConfig(SingletonModel): null=True, related_name="+", ) + objecttypes_service = models.OneToOneField( + "zgw_consumers.Service", + verbose_name=_("Objecttypes API"), + on_delete=models.PROTECT, + limit_choices_to={"api_type": APITypes.orc}, + null=True, + related_name="+", + ) drc_service = models.OneToOneField( "zgw_consumers.Service", verbose_name=_("Documenten API"), @@ -143,6 +153,24 @@ class ObjectsAPIConfig(SingletonModel): class Meta: verbose_name = _("Objects API configuration") + def clean(self) -> None: + super().clean() + + if ( + self.objecttypes_service + and self.objecttype + and not furl(self.objecttype).host + == furl(self.objects_service.api_root).host + ): + raise ValidationError( + { + "objecttype": _( + "The provided Objecttype is not part of the configured Objecttypes API." + ) + }, + code="invalid", + ) + def apply_defaults_to(self, options): options.setdefault("objecttype", self.objecttype) options.setdefault("objecttype_version", self.objecttype_version) diff --git a/src/openforms/registrations/contrib/objects_api/tests/test_models.py b/src/openforms/registrations/contrib/objects_api/tests/test_models.py new file mode 100644 index 0000000000..29b4b22f99 --- /dev/null +++ b/src/openforms/registrations/contrib/objects_api/tests/test_models.py @@ -0,0 +1,36 @@ +from django.core.exceptions import ValidationError +from django.test import TestCase + +from zgw_consumers.constants import APITypes + +from zgw_consumers_ext.tests.factories import ServiceFactory + +from ..models import ObjectsAPIConfig + + +class ObjectsAPIConfigTests(TestCase): + + def test_invalid_objecttypes_url(self): + config = ObjectsAPIConfig( + objecttypes_service=ServiceFactory.build( + api_root="https://objecttypen.nl/api/v1/", + api_type=APITypes.orc, + ), + objecttype="https://example.com/api/dummy/", + ) + + self.assertRaises(ValidationError, config.clean) + + def test_valid_objecttypes_url(self): + config = ObjectsAPIConfig( + objecttypes_service=ServiceFactory.build( + api_root="https://objecttypen.nl/api/v1/", + api_type=APITypes.orc, + ), + objecttype="https://objecttypen.nl/api/v1/objecttypes/1", + ) + + try: + config.clean() + except ValidationError as e: + self.fail(f"Unexpected exception : {e}")