diff --git a/django_email_learning/migrations/0006_alter_apikey_salt_alter_imapconnection_salt_and_more.py b/django_email_learning/migrations/0006_alter_apikey_salt_alter_imapconnection_salt_and_more.py new file mode 100644 index 00000000..439544bd --- /dev/null +++ b/django_email_learning/migrations/0006_alter_apikey_salt_alter_imapconnection_salt_and_more.py @@ -0,0 +1,39 @@ +# Generated by Django 6.0.1 on 2026-02-02 08:56 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("django_email_learning", "0005_course_image_alter_apikey_salt_and_more"), + ] + + operations = [ + migrations.AlterField( + model_name="apikey", + name="salt", + field=models.CharField( + default="9a60f001297443b3b6ac8d6cc7754ca6", + editable=False, + max_length=32, + ), + ), + migrations.AlterField( + model_name="imapconnection", + name="salt", + field=models.CharField( + default="9a60f001297443b3b6ac8d6cc7754ca6", + editable=False, + max_length=32, + ), + ), + migrations.AlterField( + model_name="learner", + name="email", + field=models.EmailField(max_length=254), + ), + migrations.AlterUniqueTogether( + name="learner", + unique_together={("organization", "email")}, + ), + ] diff --git a/django_email_learning/models.py b/django_email_learning/models.py index 950cf7b1..784f5e5c 100644 --- a/django_email_learning/models.py +++ b/django_email_learning/models.py @@ -424,7 +424,7 @@ def save(self, *args, **kwargs) -> None: # type: ignore[no-untyped-def] class Learner(models.Model): organization = models.ForeignKey(Organization, on_delete=models.CASCADE) - email = models.EmailField(unique=True) + email = models.EmailField() created_at = models.DateTimeField(auto_now_add=True) def save(self, *args, **kwargs) -> None: # type: ignore[no-untyped-def] @@ -432,6 +432,9 @@ def save(self, *args, **kwargs) -> None: # type: ignore[no-untyped-def] self.full_clean() super().save(*args, **kwargs) + class Meta: + unique_together = [["organization", "email"]] + class Enrollment(models.Model): state_transitions = { diff --git a/tests/test_models/test_learner.py b/tests/test_models/test_learner.py index bd371f76..373a8f90 100644 --- a/tests/test_models/test_learner.py +++ b/tests/test_models/test_learner.py @@ -22,11 +22,13 @@ def test_learner_email_case_insensitivity(db): assert learner.email == "user@example.com" -def test_learner_unique_email_constraint(db): +def test_learner_unique_together_email_constraint(db): Learner.objects.create(email="user@example.com", organization_id=1) with pytest.raises(ValidationError) as exc_info: Learner.objects.create(email="USER@EXAMPLE.COM", organization_id=1) - assert "Learner with this Email already exists." in str(exc_info.value) + assert "Learner with this Organization and Email already exists." in str( + exc_info.value + ) learner_count = Learner.objects.filter( email__iexact="user@example.com", organization_id=1 ).count()