Skip to content

Commit

Permalink
✨ [#234] Apply DigitaalAdres email validation in admin
Browse files Browse the repository at this point in the history
  • Loading branch information
stevenbal committed Oct 24, 2024
1 parent 3103dea commit 90076ed
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 19 deletions.
14 changes: 14 additions & 0 deletions src/openklant/components/klantinteracties/admin/digitaal_adres.py
Original file line number Diff line number Diff line change
@@ -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
6 changes: 5 additions & 1 deletion src/openklant/components/klantinteracties/api/validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -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})
77 changes: 59 additions & 18 deletions src/openklant/components/klantinteracties/tests/test_admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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
Expand Down Expand Up @@ -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())

0 comments on commit 90076ed

Please sign in to comment.