diff --git a/src/openklant/accounts/migrations/0003_user_filled_email_unique.py b/src/openklant/accounts/migrations/0003_user_filled_email_unique.py new file mode 100644 index 00000000..f4d043c6 --- /dev/null +++ b/src/openklant/accounts/migrations/0003_user_filled_email_unique.py @@ -0,0 +1,21 @@ +# Generated by Django 4.2.11 on 2024-07-02 14:30 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("accounts", "0002_auto_20211116_0918"), + ] + + operations = [ + migrations.AddConstraint( + model_name="user", + constraint=models.UniqueConstraint( + condition=models.Q(("email", ""), _negated=True), + fields=("email",), + name="filled_email_unique", + ), + ), + ] diff --git a/src/openklant/accounts/models.py b/src/openklant/accounts/models.py index f67dc0e5..7b2e2b9c 100644 --- a/src/openklant/accounts/models.py +++ b/src/openklant/accounts/models.py @@ -1,6 +1,7 @@ from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin from django.contrib.auth.validators import UnicodeUsernameValidator from django.db import models +from django.db.models import Q from django.utils import timezone from django.utils.translation import gettext_lazy as _ @@ -52,6 +53,11 @@ class User(AbstractBaseUser, PermissionsMixin): class Meta: verbose_name = _("user") verbose_name_plural = _("users") + constraints = [ + models.UniqueConstraint( + fields=["email"], condition=~Q(email=""), name="filled_email_unique" + ) + ] def get_full_name(self): """ diff --git a/src/openklant/accounts/tests/test_user_manager.py b/src/openklant/accounts/tests/test_user_manager.py index 1a6ab7d2..b3a9d154 100644 --- a/src/openklant/accounts/tests/test_user_manager.py +++ b/src/openklant/accounts/tests/test_user_manager.py @@ -1,3 +1,4 @@ +from django.db import IntegrityError from django.test import TestCase from ..models import User @@ -20,3 +21,16 @@ def test_create_user(self): self.assertFalse(user.is_superuser) self.assertFalse(user.is_staff) self.assertFalse(user.has_usable_password()) + + def test_create_users_with_same_email(self): + User.objects.create(username="AAA", email="aaa@aaa.aaa", password="aaa!") + + with self.assertRaises(IntegrityError): + User.objects.create(username="BBB", email="aaa@aaa.aaa", password="bbb!") + + def test_create_user_with_blank_emails(self): + User.objects.create(username="AAA", email="", password="aaa!") + User.objects.create(username="BBB", email="", password="bbb!") + + self.assertEqual(User.objects.count(), 2) +