(mail) add first_name and last_name for Mailbox

Mail provisioning API needs a full name to create a new mailbox.
This commit is contained in:
Sabrina Demagny
2024-08-07 12:29:40 +02:00
parent 402e73582c
commit c00c59b301
9 changed files with 123 additions and 8 deletions

View File

@@ -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")

View File

@@ -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):

View File

@@ -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")

View File

@@ -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),
),
]

View File

@@ -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),
]

View File

@@ -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),
),
]

View File

@@ -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,

View File

@@ -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),
}

View File

@@ -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),
},