diff --git a/src/openklant/components/klantinteracties/admin/digitaal_adres.py b/src/openklant/components/klantinteracties/admin/digitaal_adres.py index 152d68c5..034a5dc4 100644 --- a/src/openklant/components/klantinteracties/admin/digitaal_adres.py +++ b/src/openklant/components/klantinteracties/admin/digitaal_adres.py @@ -1,10 +1,24 @@ +from django import forms from django.contrib import admin +from ..api.validators import OptionalEmailValidator from ..models.digitaal_adres import DigitaalAdres +class DigitaalAdresAdminForm(forms.ModelForm): + class Meta: + model = DigitaalAdres + fields = "__all__" + + def clean(self): + data = self.cleaned_data + OptionalEmailValidator()(data, None) + return data + + @admin.register(DigitaalAdres) class DigitaalAdresAdmin(admin.ModelAdmin): readonly_fields = ("uuid",) search_fields = ("adres",) autocomplete_fields = ("partij",) + form = DigitaalAdresAdminForm diff --git a/src/openklant/components/klantinteracties/api/validators.py b/src/openklant/components/klantinteracties/api/validators.py index ad8a1757..ba1e1e49 100644 --- a/src/openklant/components/klantinteracties/api/validators.py +++ b/src/openklant/components/klantinteracties/api/validators.py @@ -188,4 +188,8 @@ def __call__(self, attrs: dict, serializer): try: super().__call__(get_field_value(serializer, attrs, "adres")) except ValidationError as e: - raise exceptions.ValidationError({"adres": e.message}) + # re-raise as field error + if serializer: + raise exceptions.ValidationError({"adres": e.message}) + else: + raise ValidationError({"adres": e}) diff --git a/src/openklant/components/klantinteracties/tests/test_admin.py b/src/openklant/components/klantinteracties/tests/test_admin.py index 27ab00c6..5314e8a6 100644 --- a/src/openklant/components/klantinteracties/tests/test_admin.py +++ b/src/openklant/components/klantinteracties/tests/test_admin.py @@ -3,34 +3,33 @@ from django.conf import settings from django.test import override_settings from django.urls import reverse +from django.utils.translation import gettext as _ from django_webtest import WebTest -from webtest import Form, TestResponse +from maykin_2fa.test import disable_admin_mfa +from webtest import TestResponse from openklant.accounts.tests.factories import SuperUserFactory +from openklant.components.klantinteracties.models.digitaal_adres import DigitaalAdres from openklant.components.klantinteracties.models.tests.factories.digitaal_adres import ( DigitaalAdresFactory, ) +from openklant.components.klantinteracties.models.tests.factories.klantcontacten import ( + BetrokkeneFactory, +) from openklant.components.klantinteracties.models.tests.factories.partijen import ( PersoonFactory, ) +from ..constants import SoortDigitaalAdres -class PartijAdminTests(WebTest): - def _login_user(self, username: str, password: str) -> None: - request = self.app.get(reverse("admin:login")) - - form: Form = request.forms["login-form"] - form["auth-username"] = username - form["auth-password"] = password - redirect = form.submit() - self.assertRedirects(redirect, reverse("admin:index")) - - @override_settings( - MAYKIN_2FA_ALLOW_MFA_BYPASS_BACKENDS=settings.AUTHENTICATION_BACKENDS - ) +@disable_admin_mfa() +class PartijAdminTests(WebTest): def test_search(self): + user = SuperUserFactory.create() + self.app.set_user(user) + nummer_persoon = PersoonFactory( partij__nummer="123456789", contactnaam_voornaam="Willem", @@ -52,10 +51,6 @@ def test_search(self): contactnaam_achternaam="Willemse", ) - SuperUserFactory(username="admin", password="admin") - - self._login_user(username="admin", password="admin") - admin_url = reverse("admin:klantinteracties_partij_changelist") # Test a nummer search query @@ -90,3 +85,49 @@ def test_search(self): self.assertContains(search_response, digitaal_adres_persoon.get_full_name()) self.assertNotContains(search_response, nummer_persoon.get_full_name()) self.assertNotContains(search_response, uuid_persoon.get_full_name()) + + +@disable_admin_mfa() +class DigitaalAdresAdminTests(WebTest): + def test_email_validation(self): + """ + Check that the admin applies conditional email validation on `adres`, only if + `soort_digitaal_adres` is `email` + """ + user = SuperUserFactory.create() + self.app.set_user(user) + + betrokkene = BetrokkeneFactory.create() + + admin_url = reverse("admin:klantinteracties_digitaaladres_add") + + with self.subTest("apply validation for soort_digitaal_adres == email"): + response: TestResponse = self.app.get(admin_url) + + form = response.form + form["betrokkene"] = betrokkene.pk + form["soort_digitaal_adres"] = SoortDigitaalAdres.email + form["adres"] = "invalid" + form["omschrijving"] = "foo" + + response = form.submit() + + self.assertEqual(response.status_code, 200) + self.assertFalse(DigitaalAdres.objects.exists()) + self.assertEqual( + response.context["errors"], [[_("Voer een geldig e-mailadres in.")]] + ) + + with self.subTest("do not apply validation for soort_digitaal_adres != email"): + response: TestResponse = self.app.get(admin_url) + + form = response.form + form["betrokkene"] = betrokkene.pk + form["soort_digitaal_adres"] = SoortDigitaalAdres.telefoonnummer + form["adres"] = "0612345678" + form["omschrijving"] = "foo" + + response = form.submit() + + self.assertEqual(response.status_code, 302) + self.assertTrue(DigitaalAdres.objects.exists())