diff --git a/src/backend/mailbox_manager/admin.py b/src/backend/mailbox_manager/admin.py index 71031ce..17d0147 100644 --- a/src/backend/mailbox_manager/admin.py +++ b/src/backend/mailbox_manager/admin.py @@ -38,4 +38,4 @@ class MailDomainAccessAdmin(admin.ModelAdmin): class MailboxAdmin(admin.ModelAdmin): """Admin for mailbox model.""" - list_display = ("__str__", "domain") + list_display = ("__str__", "first_name", "last_name") diff --git a/src/backend/mailbox_manager/api/serializers.py b/src/backend/mailbox_manager/api/serializers.py index 13d2101..ebb4998 100644 --- a/src/backend/mailbox_manager/api/serializers.py +++ b/src/backend/mailbox_manager/api/serializers.py @@ -10,7 +10,7 @@ class MailboxSerializer(serializers.ModelSerializer): class Meta: model = models.Mailbox - fields = ["id", "local_part", "secondary_email"] + fields = ["id", "first_name", "last_name", "local_part", "secondary_email"] class MailDomainSerializer(serializers.ModelSerializer): diff --git a/src/backend/mailbox_manager/factories.py b/src/backend/mailbox_manager/factories.py index 70feea2..48ababb 100644 --- a/src/backend/mailbox_manager/factories.py +++ b/src/backend/mailbox_manager/factories.py @@ -62,16 +62,16 @@ class MailDomainAccessFactory(factory.django.DjangoModelFactory): class MailboxFactory(factory.django.DjangoModelFactory): - """A factory to create mailboxes for mail domain members.""" + """A factory to create mailboxes for a mail domain.""" class Meta: model = models.Mailbox - class Params: - """Parameters for fields.""" + first_name = factory.Faker("first_name", locale="fr_FR") + last_name = factory.Faker("last_name", locale="de_DE") - full_name = factory.Faker("name") - - local_part = factory.LazyAttribute(lambda a: a.full_name.lower().replace(" ", ".")) + local_part = factory.LazyAttribute( + lambda a: f"{slugify(a.first_name)}.{slugify(a.last_name)}" + ) domain = factory.SubFactory(MailDomainEnabledFactory) secondary_email = factory.Faker("email") diff --git a/src/backend/mailbox_manager/migrations/0008_mailbox_first_name_mailbox_last_name.py b/src/backend/mailbox_manager/migrations/0008_mailbox_first_name_mailbox_last_name.py new file mode 100644 index 0000000..bc83e1b --- /dev/null +++ b/src/backend/mailbox_manager/migrations/0008_mailbox_first_name_mailbox_last_name.py @@ -0,0 +1,23 @@ +# Generated by Django 5.0.6 on 2024-08-07 09:43 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('mailbox_manager', '0007_alter_maildomainaccess_role'), + ] + + operations = [ + migrations.AddField( + model_name='mailbox', + name='first_name', + field=models.CharField(blank=True, max_length=200), + ), + migrations.AddField( + model_name='mailbox', + name='last_name', + field=models.CharField(blank=True, max_length=200), + ), + ] diff --git a/src/backend/mailbox_manager/migrations/0009_fill_mailbox_first_name_mailbox_last_name.py b/src/backend/mailbox_manager/migrations/0009_fill_mailbox_first_name_mailbox_last_name.py new file mode 100644 index 0000000..7c5d87b --- /dev/null +++ b/src/backend/mailbox_manager/migrations/0009_fill_mailbox_first_name_mailbox_last_name.py @@ -0,0 +1,22 @@ +# Generated by Django 5.0.6 on 2024-08-07 09:43 + +from django.db import migrations, models +from django.db.models import F + + +def populate_first_name_last_name(apps, schema_editor): + Mailbox = apps.get_model('mailbox_manager', 'Mailbox') + Mailbox.objects.filter(first_name='').update(first_name=F("local_part")) + Mailbox.objects.filter(last_name='').update(last_name=F("local_part")) + + +class Migration(migrations.Migration): + + dependencies = [ + ('mailbox_manager', '0008_mailbox_first_name_mailbox_last_name'), + ] + + operations = [ + migrations.RunPython(populate_first_name_last_name, reverse_code=migrations.RunPython.noop), + + ] diff --git a/src/backend/mailbox_manager/migrations/0010_alter_mailbox_first_name_alter_mailbox_last_name.py b/src/backend/mailbox_manager/migrations/0010_alter_mailbox_first_name_alter_mailbox_last_name.py new file mode 100644 index 0000000..8ee0f14 --- /dev/null +++ b/src/backend/mailbox_manager/migrations/0010_alter_mailbox_first_name_alter_mailbox_last_name.py @@ -0,0 +1,23 @@ +# Generated by Django 5.0.6 on 2024-08-07 10:28 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('mailbox_manager', '0009_fill_mailbox_first_name_mailbox_last_name'), + ] + + operations = [ + migrations.AlterField( + model_name='mailbox', + name='first_name', + field=models.CharField(max_length=200), + ), + migrations.AlterField( + model_name='mailbox', + name='last_name', + field=models.CharField(max_length=200), + ), + ] diff --git a/src/backend/mailbox_manager/models.py b/src/backend/mailbox_manager/models.py index 750b14e..e427df9 100644 --- a/src/backend/mailbox_manager/models.py +++ b/src/backend/mailbox_manager/models.py @@ -108,6 +108,8 @@ class MailDomainAccess(BaseModel): class Mailbox(BaseModel): """Mailboxes for users from mail domain.""" + first_name = models.CharField(max_length=200, blank=False) + last_name = models.CharField(max_length=200, blank=False) local_part = models.CharField( _("local_part"), max_length=150, diff --git a/src/backend/mailbox_manager/tests/api/mailboxes/test_api_mailboxes_create.py b/src/backend/mailbox_manager/tests/api/mailboxes/test_api_mailboxes_create.py index 0c6dae9..c447f81 100644 --- a/src/backend/mailbox_manager/tests/api/mailboxes/test_api_mailboxes_create.py +++ b/src/backend/mailbox_manager/tests/api/mailboxes/test_api_mailboxes_create.py @@ -104,6 +104,47 @@ def test_api_mailboxes__create_roles_success(role): assert mailbox.secondary_email == mailbox_values["secondary_email"] assert response.json() == { "id": str(mailbox.id), + "first_name": str(mailbox.first_name), + "last_name": str(mailbox.last_name), + "local_part": str(mailbox.local_part), + "secondary_email": str(mailbox.secondary_email), + } + + +@pytest.mark.parametrize( + "role", + [ + enums.MailDomainRoleChoices.OWNER, + enums.MailDomainRoleChoices.ADMIN, + ], +) +def test_api_mailboxes__create_with_accent_success(role): + """Users with proper abilities should be able to create mailbox on the mail domain with a + first_name accentuated.""" + mail_domain = factories.MailDomainEnabledFactory() + access = factories.MailDomainAccessFactory(role=role, domain=mail_domain) + + client = APIClient() + client.force_login(access.user) + + mailbox_values = serializers.MailboxSerializer( + factories.MailboxFactory.build(first_name="Aimé") + ).data + response = client.post( + f"/api/v1.0/mail-domains/{mail_domain.slug}/mailboxes/", + mailbox_values, + format="json", + ) + + assert response.status_code == status.HTTP_201_CREATED + mailbox = models.Mailbox.objects.get() + + assert mailbox.local_part == mailbox_values["local_part"] + assert mailbox.secondary_email == mailbox_values["secondary_email"] + assert response.json() == { + "id": str(mailbox.id), + "first_name": str(mailbox.first_name), + "last_name": str(mailbox.last_name), "local_part": str(mailbox.local_part), "secondary_email": str(mailbox.secondary_email), } diff --git a/src/backend/mailbox_manager/tests/api/mailboxes/test_api_mailboxes_list.py b/src/backend/mailbox_manager/tests/api/mailboxes/test_api_mailboxes_list.py index 6aec390..e8ab223 100644 --- a/src/backend/mailbox_manager/tests/api/mailboxes/test_api_mailboxes_list.py +++ b/src/backend/mailbox_manager/tests/api/mailboxes/test_api_mailboxes_list.py @@ -65,11 +65,15 @@ def test_api_mailboxes__list_roles(role): assert response.json()["results"] == [ { "id": str(mailbox2.id), + "first_name": str(mailbox2.first_name), + "last_name": str(mailbox2.last_name), "local_part": str(mailbox2.local_part), "secondary_email": str(mailbox2.secondary_email), }, { "id": str(mailbox1.id), + "first_name": str(mailbox1.first_name), + "last_name": str(mailbox1.last_name), "local_part": str(mailbox1.local_part), "secondary_email": str(mailbox1.secondary_email), },