Skip to content

Commit 1a21eb9

Browse files
[#310] Add validate_bag_id + migrations
[#310] Update migrations [#310] Create tests [#310] Fix old tests
1 parent 5639fa0 commit 1a21eb9

16 files changed

+716
-134
lines changed

src/openklant/components/contactgegevens/api/tests/test_apis.py

+22-22
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ def test_persoon_detail(self):
1717
geslacht="m",
1818
voorvoegsel="",
1919
voornamen="John",
20-
adres_nummeraanduiding_id="nummeraanduiding_id",
20+
adres_nummeraanduiding_id="1234567890000001",
2121
adres_adresregel1="adresregel1",
2222
adres_adresregel2="adresregel2",
2323
adres_adresregel3="adresregel3",
@@ -30,7 +30,7 @@ def test_persoon_detail(self):
3030
)
3131

3232
expected_adres = {
33-
"nummeraanduidingId": "nummeraanduiding_id",
33+
"nummeraanduidingId": "1234567890000001",
3434
"adresregel1": "adresregel1",
3535
"adresregel2": "adresregel2",
3636
"adresregel3": "adresregel3",
@@ -64,7 +64,7 @@ def test_create_persoon(self):
6464
"geslacht": "m",
6565
"voornamen": "Devin",
6666
"adres": {
67-
"nummeraanduidingId": "nummeraanduiding_id",
67+
"nummeraanduidingId": "1234567890000001",
6868
"adresregel1": "adresregel1",
6969
"adresregel2": "adresregel2",
7070
"adresregel3": "adresregel3",
@@ -88,7 +88,7 @@ def test_create_persoon(self):
8888
self.assertEqual(
8989
data["adres"],
9090
{
91-
"nummeraanduidingId": "nummeraanduiding_id",
91+
"nummeraanduidingId": "1234567890000001",
9292
"adresregel1": "adresregel1",
9393
"adresregel2": "adresregel2",
9494
"adresregel3": "adresregel3",
@@ -105,7 +105,7 @@ def test_update_persoon(self):
105105
geslacht="m",
106106
voorvoegsel="",
107107
voornamen="Devin",
108-
adres_nummeraanduiding_id="nummeraanduiding_id",
108+
adres_nummeraanduiding_id="1234567890000001",
109109
adres_adresregel1="adresregel1",
110110
adres_adresregel2="adresregel2",
111111
adres_adresregel3="adresregel3",
@@ -132,7 +132,7 @@ def test_update_persoon(self):
132132
self.assertEqual(
133133
data["adres"],
134134
{
135-
"nummeraanduidingId": "nummeraanduiding_id",
135+
"nummeraanduidingId": "1234567890000001",
136136
"adresregel1": "adresregel1",
137137
"adresregel2": "adresregel2",
138138
"adresregel3": "adresregel3",
@@ -149,7 +149,7 @@ def test_update_persoon(self):
149149
"voorvoegsel": "changed",
150150
"voornamen": "changed",
151151
"adres": {
152-
"nummeraanduidingId": "changed",
152+
"nummeraanduidingId": "1234567890000002",
153153
"adresregel1": "changed",
154154
"adresregel2": "changed",
155155
"adresregel3": "changed",
@@ -169,7 +169,7 @@ def test_update_persoon(self):
169169
self.assertEqual(
170170
data["adres"],
171171
{
172-
"nummeraanduidingId": "changed",
172+
"nummeraanduidingId": "1234567890000002",
173173
"adresregel1": "changed",
174174
"adresregel2": "changed",
175175
"adresregel3": "changed",
@@ -186,7 +186,7 @@ def test_update_partial_persoon(self):
186186
geslacht="m",
187187
voorvoegsel="",
188188
voornamen="Devin",
189-
adres_nummeraanduiding_id="nummeraanduiding_id",
189+
adres_nummeraanduiding_id="1234567890000001",
190190
adres_adresregel1="adresregel1",
191191
adres_adresregel2="adresregel2",
192192
adres_adresregel3="adresregel3",
@@ -213,7 +213,7 @@ def test_update_partial_persoon(self):
213213
self.assertEqual(
214214
data["adres"],
215215
{
216-
"nummeraanduidingId": "nummeraanduiding_id",
216+
"nummeraanduidingId": "1234567890000001",
217217
"adresregel1": "adresregel1",
218218
"adresregel2": "adresregel2",
219219
"adresregel3": "adresregel3",
@@ -237,7 +237,7 @@ def test_update_partial_persoon(self):
237237
self.assertEqual(
238238
data["adres"],
239239
{
240-
"nummeraanduidingId": "nummeraanduiding_id",
240+
"nummeraanduidingId": "1234567890000001",
241241
"adresregel1": "adresregel1",
242242
"adresregel2": "adresregel2",
243243
"adresregel3": "adresregel3",
@@ -266,7 +266,7 @@ def test_organisatie_detail(self):
266266
handelsnaam="Devin Townsend",
267267
oprichtingsdatum="1980-02-23",
268268
opheffingsdatum="2020-09-05",
269-
adres_nummeraanduiding_id="nummeraanduiding_id",
269+
adres_nummeraanduiding_id="1234567890000001",
270270
adres_adresregel1="adresregel1",
271271
adres_adresregel2="adresregel2",
272272
adres_adresregel3="adresregel3",
@@ -279,7 +279,7 @@ def test_organisatie_detail(self):
279279
)
280280

281281
expected_adres = {
282-
"nummeraanduidingId": "nummeraanduiding_id",
282+
"nummeraanduidingId": "1234567890000001",
283283
"adresregel1": "adresregel1",
284284
"adresregel2": "adresregel2",
285285
"adresregel3": "adresregel3",
@@ -308,7 +308,7 @@ def test_create_organisatie(self):
308308
"handelsnaam": "Devin Townsend",
309309
"oprichtingsdatum": "1996-03-12",
310310
"adres": {
311-
"nummeraanduidingId": "nummeraanduiding_id",
311+
"nummeraanduidingId": "1234567890000001",
312312
"adresregel1": "adresregel1",
313313
"adresregel2": "adresregel2",
314314
"adresregel3": "adresregel3",
@@ -329,7 +329,7 @@ def test_create_organisatie(self):
329329
self.assertEqual(
330330
data["adres"],
331331
{
332-
"nummeraanduidingId": "nummeraanduiding_id",
332+
"nummeraanduidingId": "1234567890000001",
333333
"adresregel1": "adresregel1",
334334
"adresregel2": "adresregel2",
335335
"adresregel3": "adresregel3",
@@ -343,7 +343,7 @@ def test_update_organisatie(self):
343343
handelsnaam="Devin Townsend",
344344
oprichtingsdatum="1996-03-12",
345345
opheffingsdatum=None,
346-
adres_nummeraanduiding_id="nummeraanduiding_id",
346+
adres_nummeraanduiding_id="1234567890000001",
347347
adres_adresregel1="adresregel1",
348348
adres_adresregel2="adresregel2",
349349
adres_adresregel3="adresregel3",
@@ -367,7 +367,7 @@ def test_update_organisatie(self):
367367
self.assertEqual(
368368
data["adres"],
369369
{
370-
"nummeraanduidingId": "nummeraanduiding_id",
370+
"nummeraanduidingId": "1234567890000001",
371371
"adresregel1": "adresregel1",
372372
"adresregel2": "adresregel2",
373373
"adresregel3": "adresregel3",
@@ -381,7 +381,7 @@ def test_update_organisatie(self):
381381
"oprichtingsdatum": "1996-03-13",
382382
"opheffingsdatum": "2023-11-22",
383383
"adres": {
384-
"nummeraanduidingId": "changed",
384+
"nummeraanduidingId": "1234567890000002",
385385
"adresregel1": "changed",
386386
"adresregel2": "changed",
387387
"adresregel3": "changed",
@@ -397,7 +397,7 @@ def test_update_organisatie(self):
397397
self.assertEqual(
398398
data["adres"],
399399
{
400-
"nummeraanduidingId": "changed",
400+
"nummeraanduidingId": "1234567890000002",
401401
"adresregel1": "changed",
402402
"adresregel2": "changed",
403403
"adresregel3": "changed",
@@ -411,7 +411,7 @@ def test_update_partial_organisatie(self):
411411
handelsnaam="Devin Townsend",
412412
oprichtingsdatum="1996-03-12",
413413
opheffingsdatum=None,
414-
adres_nummeraanduiding_id="nummeraanduiding_id",
414+
adres_nummeraanduiding_id="1234567890000001",
415415
adres_adresregel1="adresregel1",
416416
adres_adresregel2="adresregel2",
417417
adres_adresregel3="adresregel3",
@@ -435,7 +435,7 @@ def test_update_partial_organisatie(self):
435435
self.assertEqual(
436436
data["adres"],
437437
{
438-
"nummeraanduidingId": "nummeraanduiding_id",
438+
"nummeraanduidingId": "1234567890000001",
439439
"adresregel1": "adresregel1",
440440
"adresregel2": "adresregel2",
441441
"adresregel3": "adresregel3",
@@ -457,7 +457,7 @@ def test_update_partial_organisatie(self):
457457
self.assertEqual(
458458
data["adres"],
459459
{
460-
"nummeraanduidingId": "nummeraanduiding_id",
460+
"nummeraanduidingId": "1234567890000001",
461461
"adresregel1": "adresregel1",
462462
"adresregel2": "adresregel2",
463463
"adresregel3": "adresregel3",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
# Generated by Django 4.2.17 on 2025-01-28 09:10
2+
3+
import logging
4+
import openklant.utils.validators
5+
from django.core.exceptions import ValidationError
6+
from django.db import IntegrityError
7+
from django.db import migrations, models
8+
from openklant.utils.validators import validate_bag_id
9+
10+
logger = logging.getLogger(__name__)
11+
12+
13+
def _check_records(records):
14+
total_failed_records = 0
15+
for record in records:
16+
if record.adres_nummeraanduiding_id:
17+
try:
18+
validate_bag_id(record.adres_nummeraanduiding_id)
19+
except ValidationError:
20+
logger.warning(
21+
"%s(pk=%s, uuid=%s) Field: 'adres_nummeraanduiding_id'. Invalid BAG ID: %s",
22+
type(record).__qualname__,
23+
record.pk,
24+
record.uuid,
25+
record.adres_nummeraanduiding_id,
26+
)
27+
total_failed_records += 1
28+
return total_failed_records
29+
30+
31+
def _check_records_field_length(apps, schema_editor):
32+
Organisatie = apps.get_model("contactgegevens", "Organisatie")
33+
Persoon = apps.get_model("contactgegevens", "Persoon")
34+
35+
for model in [Organisatie, Persoon]:
36+
records = model.objects.all()
37+
if total_failed_records := _check_records(records):
38+
raise IntegrityError(
39+
"The migration cannot proceed due to %s records that don't comply with the %s model's requirements. "
40+
"Possible data inconsistency or mapping error."
41+
% (total_failed_records, model.__qualname__)
42+
)
43+
44+
45+
class Migration(migrations.Migration):
46+
47+
dependencies = [
48+
(
49+
"contactgegevens",
50+
"0004_alter_organisatie_adres_land_alter_organisatie_land_and_more",
51+
),
52+
]
53+
54+
operations = [
55+
migrations.RunPython(
56+
code=_check_records_field_length,
57+
reverse_code=migrations.RunPython.noop,
58+
),
59+
migrations.AlterField(
60+
model_name="organisatie",
61+
name="adres_nummeraanduiding_id",
62+
field=models.CharField(
63+
blank=True,
64+
help_text="Identificatie van het adres bij de Basisregistratie Adressen en Gebouwen.",
65+
max_length=16,
66+
validators=[
67+
openklant.utils.validators.CustomRegexValidator(
68+
message="Ongeldige nummeraanduiding BAG-ID", regex="^[0-9]{16}$"
69+
)
70+
],
71+
verbose_name="nummeraanduiding ID",
72+
),
73+
),
74+
migrations.AlterField(
75+
model_name="persoon",
76+
name="adres_nummeraanduiding_id",
77+
field=models.CharField(
78+
blank=True,
79+
help_text="Identificatie van het adres bij de Basisregistratie Adressen en Gebouwen.",
80+
max_length=16,
81+
validators=[
82+
openklant.utils.validators.CustomRegexValidator(
83+
message="Ongeldige nummeraanduiding BAG-ID", regex="^[0-9]{16}$"
84+
)
85+
],
86+
verbose_name="nummeraanduiding ID",
87+
),
88+
),
89+
]

src/openklant/components/contactgegevens/mixins.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from vng_api_common.descriptors import GegevensGroepType
66

7-
from openklant.utils.validators import validate_country
7+
from openklant.utils.validators import validate_bag_id, validate_country
88

99

1010
class AdresMixin(models.Model):
@@ -13,7 +13,8 @@ class AdresMixin(models.Model):
1313
help_text=_(
1414
"Identificatie van het adres bij de Basisregistratie Adressen en Gebouwen."
1515
),
16-
max_length=255,
16+
max_length=16,
17+
validators=[validate_bag_id],
1718
blank=True,
1819
)
1920
adres_adresregel1 = models.CharField(

src/openklant/components/contactgegevens/openapi.yaml

+4-2
Original file line numberDiff line numberDiff line change
@@ -382,7 +382,8 @@ components:
382382
type: string
383383
description: Identificatie van het adres bij de Basisregistratie Adressen
384384
en Gebouwen.
385-
maxLength: 255
385+
pattern: ^[0-9]{16}$
386+
maxLength: 16
386387
adresregel1:
387388
type: string
388389
description: Eerste deel van het adres dat niet voorkomt in de Basisregistratie
@@ -642,7 +643,8 @@ components:
642643
type: string
643644
description: Identificatie van het adres bij de Basisregistratie Adressen
644645
en Gebouwen.
645-
maxLength: 255
646+
pattern: ^[0-9]{16}$
647+
maxLength: 16
646648
adresregel1:
647649
type: string
648650
description: Eerste deel van het adres dat niet voorkomt in de Basisregistratie

0 commit comments

Comments
 (0)