Skip to content

Commit 91edb96

Browse files
[#239] Add uuid as an allowed parameter
1 parent 7c30177 commit 91edb96

File tree

2 files changed

+139
-20
lines changed

2 files changed

+139
-20
lines changed

src/openklant/components/klantinteracties/api/serializers/partijen.py

+38-15
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,7 @@ class PartijIdentificatorSerializer(
376376
source="partij",
377377
)
378378
partij_identificator = PartijIdentificatorGroepTypeSerializer(
379-
required=True,
379+
required=False,
380380
allow_null=True,
381381
help_text=_(
382382
"Gegevens die een partij in een basisregistratie "
@@ -395,23 +395,25 @@ class Meta:
395395
)
396396

397397
extra_kwargs = {
398-
"uuid": {"read_only": True},
398+
"uuid": {"required": False, "validators": [partij_identificator_exists]},
399399
"url": {
400400
"view_name": "klantinteracties:partijidentificator-detail",
401401
"lookup_field": "uuid",
402402
"help_text": "De unieke URL van deze partij indentificator binnen deze API.",
403403
},
404404
}
405405

406-
def validate(self, attrs):
407-
partij_identificator = get_field_value(self, attrs, "partij_identificator")
408-
PartijIdentificatorValidator(
409-
code_register=partij_identificator["code_register"],
410-
code_objecttype=partij_identificator["code_objecttype"],
411-
code_soort_object_id=partij_identificator["code_soort_object_id"],
412-
object_id=partij_identificator["object_id"],
413-
).validate()
414-
return super().validate(attrs)
406+
def validate_partij_identificator(self, value):
407+
if value:
408+
PartijIdentificatorValidator(
409+
code_register=get_field_value(self, value, "code_register"),
410+
code_objecttype=get_field_value(self, value, "code_objecttype"),
411+
code_soort_object_id=get_field_value(
412+
self, value, "code_soort_object_id"
413+
),
414+
object_id=get_field_value(self, value, "object_id"),
415+
).validate()
416+
return value
415417

416418
@transaction.atomic
417419
def update(self, instance, validated_data):
@@ -500,6 +502,7 @@ class PartijSerializer(NestedGegevensGroepMixin, PolymorphicSerializer):
500502
partij_identificatoren = PartijIdentificatorSerializer(
501503
many=True,
502504
required=False,
505+
allow_null=True,
503506
source="partijidentificator_set",
504507
help_text=_("Partij-identificatoren die hoorde bij deze partij."),
505508
)
@@ -572,12 +575,27 @@ def get_vertegenwoordigden(self, obj):
572575
if vertegenwoordigende
573576
]
574577

578+
def validate_partij_identificatoren(self, value):
579+
if not value:
580+
return value
581+
582+
for identificator in value:
583+
if {"uuid", "partij_identificator"} <= identificator.keys():
584+
raise serializers.ValidationError(
585+
{
586+
"partij_identificatoren": _(
587+
"Slechts één van deze twee sleutels `uuid` of `partij_identificator` is toegestaan."
588+
)
589+
}
590+
)
591+
return value
592+
575593
@transaction.atomic
576594
def update(self, instance, validated_data):
595+
577596
method = self.context.get("request").method
578597
partij_identificatie = validated_data.pop("partij_identificatie", None)
579598
partij_identificatoren = validated_data.pop("partijidentificator_set", None)
580-
581599
if "digitaaladres_set" in validated_data:
582600
existing_digitale_adressen = instance.digitaaladres_set.all()
583601
digitaal_adres_uuids = [
@@ -844,9 +862,14 @@ def create(self, validated_data):
844862
data=partij_identificator
845863
)
846864
partij_identificator_serializer.is_valid(raise_exception=True)
847-
partij_identificator_serializer.create(
848-
partij_identificator_serializer.validated_data
849-
)
865+
if "uuid" in partij_identificator:
866+
PartijIdentificator.objects.filter(
867+
uuid=partij_identificator["uuid"]
868+
).update(partij=partij)
869+
else:
870+
partij_identificator_serializer.create(
871+
partij_identificator_serializer.validated_data
872+
)
850873

851874
return partij
852875

src/openklant/components/klantinteracties/api/tests/test_partijen.py

+101-5
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,14 @@ def test_read_partij(self):
9898
def test_create_partij(self):
9999
digitaal_adres, digitaal_adres2 = DigitaalAdresFactory.create_batch(2)
100100
rekeningnummer, rekeningnummer2 = RekeningnummerFactory.create_batch(2)
101+
102+
partij_identificator = PartijIdentificatorFactory.create(
103+
partij_identificator_code_objecttype="natuurlijk_persoon",
104+
partij_identificator_code_soort_object_id="bsn",
105+
partij_identificator_object_id="296648875",
106+
partij_identificator_code_register="brp",
107+
)
108+
101109
list_url = reverse("klantinteracties:partij-list")
102110
data = {
103111
"nummer": "1298329191",
@@ -140,7 +148,10 @@ def test_create_partij(self):
140148
"objectId": "296648875",
141149
"codeRegister": "brp",
142150
},
143-
}
151+
},
152+
{
153+
"uuid": str(partij_identificator.uuid),
154+
},
144155
],
145156
}
146157

@@ -184,6 +195,14 @@ def test_create_partij(self):
184195
"land": "6030",
185196
},
186197
)
198+
self.assertEqual(len(data["partijIdentificatoren"]), 2)
199+
self.assertTrue(
200+
str(partij_identificator.uuid)
201+
in [
202+
identificator["uuid"] for identificator in data["partijIdentificatoren"]
203+
]
204+
)
205+
187206
self.assertEqual(
188207
data["partijIdentificatoren"][0]["partijIdentificator"],
189208
{
@@ -193,6 +212,9 @@ def test_create_partij(self):
193212
"codeRegister": "brp",
194213
},
195214
)
215+
216+
data["partijIdentificatoren"] = None
217+
196218
with self.subTest("create_partij_without_foreignkey_relations"):
197219
data["nummer"] = "1298329192"
198220
data["digitaleAdressen"] = []
@@ -886,6 +908,8 @@ def test_update_partij(self):
886908
},
887909
)
888910

911+
data["partijIdentificatoren"] = None
912+
889913
with self.subTest(
890914
"test_voorkeurs_digitaal_adres_must_be_part_of_digitale_adressen"
891915
):
@@ -2290,7 +2314,7 @@ def test_invalid_validation_partij_identificator_code_objecttype(self):
22902314
self.assertEqual(response.data["title"], "Invalid input.")
22912315
self.assertEqual(
22922316
response.data["invalid_params"][0]["name"],
2293-
"partijIdentificatorCodeObjecttype",
2317+
"partijIdentificator.partijIdentificatorCodeObjecttype",
22942318
)
22952319
self.assertEqual(response.data["invalid_params"][0]["code"], "invalid")
22962320
self.assertEqual(
@@ -2318,7 +2342,7 @@ def test_invalid_validation_partij_identificator_code_soort_object_id(self):
23182342
self.assertEqual(response.data["title"], "Invalid input.")
23192343
self.assertEqual(
23202344
response.data["invalid_params"][0]["name"],
2321-
"partijIdentificatorCodeSoortObjectId",
2345+
"partijIdentificator.partijIdentificatorCodeSoortObjectId",
23222346
)
23232347
self.assertEqual(response.data["invalid_params"][0]["code"], "invalid")
23242348
self.assertEqual(
@@ -2346,7 +2370,7 @@ def test_invalid_validation_partij_identificator_object_id(self):
23462370
self.assertEqual(response.data["title"], "Invalid input.")
23472371
self.assertEqual(
23482372
response.data["invalid_params"][0]["name"],
2349-
"partijIdentificatorObjectId",
2373+
"partijIdentificator.partijIdentificatorObjectId",
23502374
)
23512375
self.assertEqual(response.data["invalid_params"][0]["code"], "invalid")
23522376
self.assertEqual(
@@ -2374,7 +2398,7 @@ def test_invalid_overig_code_objecttype_validation_partij_identificator(self):
23742398
self.assertEqual(response.data["title"], "Invalid input.")
23752399
self.assertEqual(
23762400
response.data["invalid_params"][0]["name"],
2377-
"partijIdentificatorCodeObjecttype",
2401+
"partijIdentificator.partijIdentificatorCodeObjecttype",
23782402
)
23792403
self.assertEqual(response.data["invalid_params"][0]["code"], "invalid")
23802404
self.assertEqual(
@@ -2446,6 +2470,78 @@ def test_valid_overig_code_register_validation_partij_identificator(self):
24462470
"overig",
24472471
)
24482472

2473+
def test_valid_empty_partij_identificator(self):
2474+
url = reverse("klantinteracties:partijidentificator-list")
2475+
partij = PartijFactory.create()
2476+
data = {
2477+
"identificeerdePartij": {"uuid": str(partij.uuid)},
2478+
"anderePartijIdentificator": "anderePartijIdentificator",
2479+
"partijIdentificator": {},
2480+
}
2481+
response = self.client.post(url, data)
2482+
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
2483+
self.assertEqual(
2484+
response.data["partij_identificator"],
2485+
{
2486+
"code_objecttype": "",
2487+
"code_soort_object_id": "",
2488+
"object_id": "",
2489+
"code_register": "",
2490+
},
2491+
)
2492+
2493+
data = {
2494+
"identificeerdePartij": {"uuid": str(partij.uuid)},
2495+
"anderePartijIdentificator": "anderePartijIdentificator",
2496+
"partijIdentificator": None,
2497+
}
2498+
response = self.client.post(url, data)
2499+
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
2500+
self.assertEqual(
2501+
response.data["partij_identificator"],
2502+
{
2503+
"code_objecttype": "",
2504+
"code_soort_object_id": "",
2505+
"object_id": "",
2506+
"code_register": "",
2507+
},
2508+
)
2509+
2510+
data = {
2511+
"identificeerdePartij": {"uuid": str(partij.uuid)},
2512+
"anderePartijIdentificator": "anderePartijIdentificator",
2513+
}
2514+
response = self.client.post(url, data)
2515+
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
2516+
self.assertEqual(
2517+
response.data["partij_identificator"],
2518+
{
2519+
"code_objecttype": "",
2520+
"code_soort_object_id": "",
2521+
"object_id": "",
2522+
"code_register": "",
2523+
},
2524+
)
2525+
2526+
data = {
2527+
"identificeerdePartij": {"uuid": str(partij.uuid)},
2528+
"anderePartijIdentificator": "anderePartijIdentificator",
2529+
"partijIdentificator": {
2530+
"code_register": "brp",
2531+
},
2532+
}
2533+
response = self.client.post(url, data)
2534+
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
2535+
self.assertEqual(
2536+
response.data["partij_identificator"],
2537+
{
2538+
"code_objecttype": "",
2539+
"code_soort_object_id": "",
2540+
"object_id": "",
2541+
"code_register": "brp",
2542+
},
2543+
)
2544+
24492545

24502546
class CategorieRelatieTests(APITestCase):
24512547
def test_list_categorie_relatie(self):

0 commit comments

Comments
 (0)