diff --git a/src/openklant/components/klantinteracties/api/serializers/klantcontacten.py b/src/openklant/components/klantinteracties/api/serializers/klantcontacten.py index 7145c211..94352b37 100644 --- a/src/openklant/components/klantinteracties/api/serializers/klantcontacten.py +++ b/src/openklant/components/klantinteracties/api/serializers/klantcontacten.py @@ -539,24 +539,24 @@ def create(self, validated_data): return super().create(validated_data) -class BetrokkeneConvenienceSerializer(BetrokkeneSerializer): +class BetrokkeneKlantcontactReadOnlySerializer(BetrokkeneSerializer): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields["had_klantcontact"].read_only = True -class OnderwerpobjectConvenienceSerializer(OnderwerpobjectSerializer): +class OnderwerpobjectKlantcontactReadOnlySerializer(OnderwerpobjectSerializer): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields["klantcontact"].read_only = True -class KlantContactConvenienceSerializer(serializers.Serializer): +class MaakKlantcontactSerializer(serializers.Serializer): klantcontact = KlantcontactSerializer() - betrokkene = BetrokkeneConvenienceSerializer(required=False) - onderwerpobject = OnderwerpobjectConvenienceSerializer(required=False) + betrokkene = BetrokkeneKlantcontactReadOnlySerializer(required=False) + onderwerpobject = OnderwerpobjectKlantcontactReadOnlySerializer(required=False) @transaction.atomic def create(self, validated_data): @@ -570,7 +570,6 @@ def create(self, validated_data): betrokkene = None if betrokkene_data := validated_data.pop("betrokkene", None): betrokkene_data["had_klantcontact"] = {"uuid": str(klantcontact.uuid)} - # TODO for some reason `was_partij` is converted to `partij` by the serializer betrokkene_data.setdefault( "was_partij", betrokkene_data.get("partij", None) ) diff --git a/src/openklant/components/klantinteracties/api/tests/test_klantcontacten.py b/src/openklant/components/klantinteracties/api/tests/test_klantcontacten.py index 8192ac94..aa196bba 100644 --- a/src/openklant/components/klantinteracties/api/tests/test_klantcontacten.py +++ b/src/openklant/components/klantinteracties/api/tests/test_klantcontacten.py @@ -1481,9 +1481,9 @@ def test_destroy_actorklantcontact(self): self.assertEqual(data["count"], 0) -class ConvenienceEndpointTests(APITestCase): +class MaakKlantcontactEndpointTests(APITestCase): maxDiff = None - url = reverse("klantinteracties:klantcontact-convenience-list") + url = reverse("klantinteracties:maak-klantcontact-list") def test_create_success(self): post_data = { diff --git a/src/openklant/components/klantinteracties/api/urls.py b/src/openklant/components/klantinteracties/api/urls.py index 78a49d38..81e4531b 100644 --- a/src/openklant/components/klantinteracties/api/urls.py +++ b/src/openklant/components/klantinteracties/api/urls.py @@ -18,8 +18,8 @@ ActorKlantcontactViewSet, BetrokkeneViewSet, BijlageViewSet, - KlantContactConvenienceViewSet, KlantcontactViewSet, + MaakKlantcontactViewSet, OnderwerpobjectViewSet, ) from openklant.components.klantinteracties.api.viewsets.partijen import ( @@ -50,9 +50,9 @@ router.register("onderwerpobjecten", OnderwerpobjectViewSet) router.register("bijlagen", BijlageViewSet) router.register( - "klantcontact-convenience", - KlantContactConvenienceViewSet, - basename="klantcontact-convenience", + "maak-klantcontact", + MaakKlantcontactViewSet, + basename="maak-klantcontact", ) router.register("internetaken", InterneTaakViewSet) diff --git a/src/openklant/components/klantinteracties/api/viewsets/klantcontacten.py b/src/openklant/components/klantinteracties/api/viewsets/klantcontacten.py index b6fb194b..16e239d4 100644 --- a/src/openklant/components/klantinteracties/api/viewsets/klantcontacten.py +++ b/src/openklant/components/klantinteracties/api/viewsets/klantcontacten.py @@ -13,8 +13,8 @@ ActorKlantcontactSerializer, BetrokkeneSerializer, BijlageSerializer, - KlantContactConvenienceSerializer, KlantcontactSerializer, + MaakKlantcontactSerializer, OnderwerpobjectSerializer, ) from openklant.components.klantinteracties.models.actoren import ActorKlantcontact @@ -265,19 +265,19 @@ class ActorKlantcontactViewSet(viewsets.ModelViewSet): permission_classes = (TokenPermissions,) -@extend_schema(tags=["klantcontact-convenience"]) +@extend_schema(tags=["maak-klantcontact"]) @extend_schema_view( create=extend_schema( summary="Maak een KlantContact, Betrokkene en een OnderwerpObject aan.", description="Maak een KlantContact, Betrokkene en een OnderwerpObject aan.", ), ) -class KlantContactConvenienceViewSet(mixins.CreateModelMixin, viewsets.GenericViewSet): +class MaakKlantcontactViewSet(mixins.CreateModelMixin, viewsets.GenericViewSet): """ - Convenience endpoint om in één request een Betrokkene, KlantContact en een OnderwerpObject + Endpoint om in één request een Klantcontact met een Betrokkene en een OnderwerpObject aan te maken. De aangemaakte objecten worden automatisch aan elkaar gekoppeld. """ - serializer_class = KlantContactConvenienceSerializer + serializer_class = MaakKlantcontactSerializer authentication_classes = (TokenAuthentication,) permission_classes = (TokenPermissions,) diff --git a/src/openklant/components/klantinteracties/openapi.yaml b/src/openklant/components/klantinteracties/openapi.yaml index 822cd5e2..6575bb24 100644 --- a/src/openklant/components/klantinteracties/openapi.yaml +++ b/src/openklant/components/klantinteracties/openapi.yaml @@ -1547,28 +1547,6 @@ paths: responses: '204': description: No response body - /klantcontact-convenience: - post: - operationId: klantcontactConvenienceCreate - description: Maak een KlantContact, Betrokkene en een OnderwerpObject aan. - summary: Maak een KlantContact, Betrokkene en een OnderwerpObject aan. - tags: - - klantcontact-convenience - requestBody: - content: - application/json: - schema: - $ref: '#/components/schemas/KlantContactConvenience' - required: true - security: - - tokenAuth: [] - responses: - '201': - content: - application/json: - schema: - $ref: '#/components/schemas/KlantContactConvenience' - description: '' /klantcontacten: get: operationId: klantcontactenList @@ -1854,6 +1832,28 @@ paths: responses: '204': description: No response body + /maak-klantcontact: + post: + operationId: maakKlantcontactCreate + description: Maak een KlantContact, Betrokkene en een OnderwerpObject aan. + summary: Maak een KlantContact, Betrokkene en een OnderwerpObject aan. + tags: + - maak-klantcontact + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/MaakKlantcontact' + required: true + security: + - tokenAuth: [] + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/MaakKlantcontact' + description: '' /onderwerpobjecten: get: operationId: onderwerpobjectenList @@ -3008,7 +3008,64 @@ components: - uuid - volledigeNaam - wasPartij - BetrokkeneConvenience: + BetrokkeneCorrespondentieadres: + type: object + description: |- + Generate a serializer out of a GegevensGroepType. + + Usage:: + + >>> class VerlengingSerializer(GegevensGroepSerializer): + ... class Meta: + ... model = Zaak + ... gegevensgroep = 'verlenging' + >>> + + Where ``Zaak.verlenging`` is a :class:``GegevensGroepType``. + properties: + nummeraanduidingId: + type: string + description: Identificatie van het adres bij de Basisregistratie Adressen + en Gebouwen. + maxLength: 255 + adresregel1: + type: string + description: Eerste deel van het adres dat niet voorkomt in de Basisregistratie + Adressen en Gebouwen. + maxLength: 80 + adresregel2: + type: string + description: Tweede deel van het adres dat niet voorkomt in de Basisregistratie + Adressen en Gebouwen. + maxLength: 80 + adresregel3: + type: string + description: Derde deel van het adres dat niet voorkomt in de Basisregistratie + Adressen en Gebouwen. + maxLength: 80 + land: + type: string + description: Een code, opgenomen in Tabel 34, Landentabel, die het land + (buiten Nederland) aangeeft alwaar de ingeschrevene verblijft. + maxLength: 4 + minLength: 4 + BetrokkeneForeignKey: + type: object + properties: + uuid: + type: string + format: uuid + description: Unieke (technische) identificatiecode van de betrokkene bij + klantcontact. + url: + type: string + format: uri + readOnly: true + description: De unieke URL van deze betrokkene binnen deze API. + required: + - url + - uuid + BetrokkeneKlantcontactReadOnly: type: object description: |- Set gegevensgroepdata from validated nested data. @@ -3089,63 +3146,6 @@ components: - uuid - volledigeNaam - wasPartij - BetrokkeneCorrespondentieadres: - type: object - description: |- - Generate a serializer out of a GegevensGroepType. - - Usage:: - - >>> class VerlengingSerializer(GegevensGroepSerializer): - ... class Meta: - ... model = Zaak - ... gegevensgroep = 'verlenging' - >>> - - Where ``Zaak.verlenging`` is a :class:``GegevensGroepType``. - properties: - nummeraanduidingId: - type: string - description: Identificatie van het adres bij de Basisregistratie Adressen - en Gebouwen. - maxLength: 255 - adresregel1: - type: string - description: Eerste deel van het adres dat niet voorkomt in de Basisregistratie - Adressen en Gebouwen. - maxLength: 80 - adresregel2: - type: string - description: Tweede deel van het adres dat niet voorkomt in de Basisregistratie - Adressen en Gebouwen. - maxLength: 80 - adresregel3: - type: string - description: Derde deel van het adres dat niet voorkomt in de Basisregistratie - Adressen en Gebouwen. - maxLength: 80 - land: - type: string - description: Een code, opgenomen in Tabel 34, Landentabel, die het land - (buiten Nederland) aangeeft alwaar de ingeschrevene verblijft. - maxLength: 4 - minLength: 4 - BetrokkeneForeignKey: - type: object - properties: - uuid: - type: string - format: uuid - description: Unieke (technische) identificatiecode van de betrokkene bij - klantcontact. - url: - type: string - format: uri - readOnly: true - description: De unieke URL van deze betrokkene binnen deze API. - required: - - url - - uuid Bezoekadres: type: object description: |- @@ -3653,17 +3653,6 @@ components: required: - url - uuid - KlantContactConvenience: - type: object - properties: - klantcontact: - $ref: '#/components/schemas/Klantcontact' - betrokkene: - $ref: '#/components/schemas/BetrokkeneConvenience' - onderwerpobject: - $ref: '#/components/schemas/OnderwerpobjectConvenience' - required: - - klantcontact Klantcontact: type: object properties: @@ -3776,6 +3765,17 @@ components: required: - url - uuid + MaakKlantcontact: + type: object + properties: + klantcontact: + $ref: '#/components/schemas/Klantcontact' + betrokkene: + $ref: '#/components/schemas/BetrokkeneKlantcontactReadOnly' + onderwerpobject: + $ref: '#/components/schemas/OnderwerpobjectKlantcontactReadOnly' + required: + - klantcontact Onderwerpobject: type: object description: |- @@ -3814,7 +3814,22 @@ components: - url - uuid - wasKlantcontact - OnderwerpobjectConvenience: + OnderwerpobjectForeignKey: + type: object + properties: + uuid: + type: string + format: uuid + description: Unieke (technische) identificatiecode van het onderwerpdeel. + url: + type: string + format: uri + readOnly: true + description: De unieke URL van dit onderwerp object binnen deze API. + required: + - url + - uuid + OnderwerpobjectKlantcontactReadOnly: type: object description: |- Set gegevensgroepdata from validated nested data. @@ -3853,21 +3868,6 @@ components: - url - uuid - wasKlantcontact - OnderwerpobjectForeignKey: - type: object - properties: - uuid: - type: string - format: uuid - description: Unieke (technische) identificatiecode van het onderwerpdeel. - url: - type: string - format: uri - readOnly: true - description: De unieke URL van dit onderwerp object binnen deze API. - required: - - url - - uuid Onderwerpobjectidentificator: type: object description: |-