Skip to content

Commit 48b7490

Browse files
committed
👌 [#234] PR feedback
* add explicit API test to check if no validation is applied if soort != email * remove re-raising of validationerrors for email validation in case of API context * move retrieval of soort_digitaal_adres to caller code (admin/serializer.validate)
1 parent f811b58 commit 48b7490

File tree

5 files changed

+42
-23
lines changed

5 files changed

+42
-23
lines changed

src/openklant/components/klantinteracties/admin/digitaal_adres.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ class Meta:
1010
model = DigitaalAdres
1111
fields = "__all__"
1212

13-
def clean(self):
13+
def clean_adres(self):
1414
data = self.cleaned_data
15-
OptionalEmailValidator()(data, None)
16-
return data
15+
OptionalEmailValidator()(data["adres"], data.get("soort_digitaal_adres"))
16+
return data["adres"]
1717

1818

1919
@admin.register(DigitaalAdres)

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

+12-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from openklant.components.klantinteracties.models.digitaal_adres import DigitaalAdres
1414
from openklant.components.klantinteracties.models.klantcontacten import Betrokkene
1515
from openklant.components.klantinteracties.models.partijen import Partij
16+
from openklant.utils.serializers import get_field_value
1617

1718

1819
class DigitaalAdresForeignKeySerializer(serializers.HyperlinkedModelSerializer):
@@ -88,7 +89,17 @@ class Meta:
8889
"help_text": _("De unieke URL van dit digitaal adres binnen deze API."),
8990
},
9091
}
91-
validators = [OptionalEmailValidator()]
92+
93+
def validate_adres(self, adres):
94+
"""
95+
Define the validator here, to avoid DRF spectacular marking the format for
96+
`adres` as `email`
97+
"""
98+
soort_digitaal_adres = get_field_value(
99+
self, self.initial_data, "soort_digitaal_adres"
100+
)
101+
OptionalEmailValidator()(adres, soort_digitaal_adres)
102+
return adres
92103

93104
@transaction.atomic
94105
def update(self, instance, validated_data):

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

+20
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from django.test import tag
12
from django.utils.translation import gettext as _
23

34
from rest_framework import status
@@ -92,6 +93,7 @@ def test_create_digitaal_adres(self):
9293
self.assertEqual(data["adres"], "foobar@example.com")
9394
self.assertEqual(data["omschrijving"], "omschrijving")
9495

96+
@tag("gh-234")
9597
def test_create_digitaal_adres_email_validation(self):
9698
list_url = reverse("klantinteracties:digitaaladres-list")
9799
data = {
@@ -140,6 +142,24 @@ def test_create_digitaal_adres_email_validation(self):
140142
],
141143
)
142144

145+
with self.subTest("no validation applied if soort is not email"):
146+
response = self.client.patch(
147+
detail_url,
148+
{
149+
"soortDigitaalAdres": SoortDigitaalAdres.telefoonnummer,
150+
"adres": "0612345678",
151+
},
152+
)
153+
154+
self.assertEqual(response.status_code, status.HTTP_200_OK)
155+
156+
digitaal_adres.refresh_from_db()
157+
158+
self.assertEqual(
159+
digitaal_adres.soort_digitaal_adres, SoortDigitaalAdres.telefoonnummer
160+
)
161+
self.assertEqual(digitaal_adres.adres, "0612345678")
162+
143163
def test_update_digitaal_adres(self):
144164
betrokkene, betrokkene2 = BetrokkeneFactory.create_batch(2)
145165
partij, partij2 = PartijFactory.create_batch(2)

src/openklant/components/klantinteracties/api/validators.py

+5-19
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
from django.core.exceptions import ValidationError
21
from django.core.validators import EmailValidator
32
from django.db import models
43
from django.utils.translation import gettext_lazy as _
54

6-
from rest_framework import exceptions, serializers
5+
from rest_framework import serializers
76
from rest_framework.validators import UniqueTogetherValidator, qs_filter
87

98
from openklant.components.klantinteracties.constants import SoortDigitaalAdres
@@ -26,7 +25,6 @@
2625
PartijIdentificator,
2726
)
2827
from openklant.components.klantinteracties.models.rekeningnummers import Rekeningnummer
29-
from openklant.utils.serializers import get_field_value
3028

3129

3230
class FKUniqueTogetherValidator(UniqueTogetherValidator):
@@ -175,21 +173,9 @@ def Rekeningnummer_exists(value):
175173
class OptionalEmailValidator(EmailValidator):
176174
"""
177175
EmailValidator for SoortDigitaalAdres that only attempts to validate if
178-
`SoortDigitaalAdres` is `email
176+
`SoortDigitaalAdres` is `email`
179177
"""
180178

181-
requires_context = True
182-
183-
def __call__(self, attrs: dict, serializer):
184-
if (
185-
get_field_value(serializer, attrs, "soort_digitaal_adres")
186-
== SoortDigitaalAdres.email
187-
):
188-
try:
189-
super().__call__(get_field_value(serializer, attrs, "adres"))
190-
except ValidationError as e:
191-
# re-raise as field error
192-
if serializer:
193-
raise exceptions.ValidationError({"adres": e.message})
194-
else:
195-
raise ValidationError({"adres": e})
179+
def __call__(self, value: str, soort_digitaal_adres: str):
180+
if soort_digitaal_adres == SoortDigitaalAdres.email:
181+
super().__call__(value)

src/openklant/components/klantinteracties/tests/test_admin.py

+2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from uuid import uuid4
22

3+
from django.test import tag
34
from django.urls import reverse
45
from django.utils.translation import gettext as _
56

@@ -87,6 +88,7 @@ def test_search(self):
8788

8889
@disable_admin_mfa()
8990
class DigitaalAdresAdminTests(WebTest):
91+
@tag("gh-234")
9092
def test_email_validation(self):
9193
"""
9294
Check that the admin applies conditional email validation on `adres`, only if

0 commit comments

Comments
 (0)