diff --git a/src/objects/accounts/migrations/0004_user_filled_email_unique.py b/src/objects/accounts/migrations/0004_user_filled_email_unique.py new file mode 100644 index 00000000..bab66f15 --- /dev/null +++ b/src/objects/accounts/migrations/0004_user_filled_email_unique.py @@ -0,0 +1,20 @@ +# Generated by Django 4.2.11 on 2024-07-02 14:39 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("accounts", "0003_auto_20201223_1231"), + ] + + 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/objects/accounts/models.py b/src/objects/accounts/models.py index 05f53e34..42b77dfd 100644 --- a/src/objects/accounts/models.py +++ b/src/objects/accounts/models.py @@ -1,4 +1,5 @@ from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin +from django.db.models import Q from django.db import models from django.utils import timezone from django.utils.translation import gettext_lazy as _ @@ -46,6 +47,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/objects/accounts/tests/test_user_manager.py b/src/objects/accounts/tests/test_user_manager.py index 1a6ab7d2..3f4e0c90 100644 --- a/src/objects/accounts/tests/test_user_manager.py +++ b/src/objects/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,15 @@ 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)