Updated test, added alias recipient deletion

This commit is contained in:
Spitap
2023-08-27 12:17:09 +02:00
parent c57fd8c51e
commit a95c394d2b
5 changed files with 124 additions and 13 deletions
+19 -9
View File
@@ -544,10 +544,10 @@ class WritableAccountSerializer(v1_serializers.WritableAccountSerializer):
if aliases:
for alias in aliases:
models.modify_or_create_alias(
"{}@{}".format(alias["localpart"], alias["domain"]),
[user.username],
creator,
alias["domain"]
address="{}@{}".format(alias["localpart"], alias["domain"]),
recipients=[user.username],
creator=creator,
domain=alias["domain"]
)
return user
@@ -572,14 +572,24 @@ class WritableAccountSerializer(v1_serializers.WritableAccountSerializer):
mailbox_data["full_address"] = validated_data["username"]
instance.email = validated_data["username"]
self._create_mailbox(creator, instance, mailbox_data)
if aliases and "username" in validated_data:
if aliases is not None and "username" in validated_data:
# We create a list to keep track of alias we need to delete
alias_recipients = instance.mailbox.alias_addresses
for alias in aliases:
address="{}@{}".format(alias["localpart"], alias["domain"])
models.modify_or_create_alias(
"{}@{}".format(alias["localpart"], alias["domain"]),
[validated_data["username"]],
creator,
alias["domain"]
address=address,
recipients=[validated_data["username"]],
creator=creator,
domain=alias["domain"]
)
try:
alias_recipients.remove(address)
except ValueError:
continue
for alias in alias_recipients:
models.remove_recipient_from_alias(
alias, validated_data["username"])
instance.save()
resources = validated_data.get("resources")
if resources:
+78 -1
View File
@@ -253,7 +253,10 @@ class AccountViewSetTestCase(ModoAPITestCase):
"password": "Toto12345",
"mailbox": {
"quota": 10
}
},
"aliases": [
"aliasupdate1@test.com"
]
}
resp = self.client.patch(url, data, format="json")
self.assertEqual(resp.status_code, 200)
@@ -304,6 +307,80 @@ class AccountViewSetTestCase(ModoAPITestCase):
self.assertEqual(account.mailbox.message_limit, None)
self.assertEqual(account.mailbox.is_send_only, False)
def test_update_aliases(self):
account = core_models.User.objects.get(username="user@test.com")
url = reverse("v2:account-detail", args=[account.pk])
data = {
"username": "user@test.com",
"role": "SimpleUsers",
"password": "Toto12345",
"mailbox": {
"quota": 10
},
"aliases": [
"aliasupdate1@test.com"
]
}
resp = self.client.patch(url, data, format="json")
self.assertEqual(resp.status_code, 200)
self.assertTrue(
models.Alias.objects.filter(address="aliasupdate1@test.com").exists())
# Create an alias for another user
url = reverse("v2:account-list")
data = {
"username": "toto@test.com",
"role": "SimpleUsers",
"mailbox": {
"use_domain_quota": True
},
"password": "Toto12345",
"language": "fr",
"aliases": ["totoalias@test.com"]
}
resp = self.client.post(url, data, format="json")
self.assertEqual(resp.status_code, 201)
# Try updating existing account with this newly created alias
url = reverse("v2:account-detail", args=[account.pk])
data = {
"username": "user@test.com",
"role": "SimpleUsers",
"password": "Toto12345",
"mailbox": {
"quota": 10
},
"aliases": [
"totoalias@test.com",
"aliasupdate1@test.com",
]
}
resp = self.client.patch(url, data, format="json")
self.assertEqual(resp.status_code, 200)
alias = models.Alias.objects.filter(address="totoalias@test.com")
self.assertTrue(alias.exists())
alias_recipients = list(alias.first().recipients)
self.assertIn("toto@test.com", alias_recipients)
self.assertIn("user@test.com", alias_recipients)
# Try deleting the aliases
data = {
"username": "user@test.com",
"role": "SimpleUsers",
"mailbox": {
"quota": 10
},
"aliases": []
}
resp = self.client.patch(url, data, format="json")
self.assertEqual(resp.status_code, 200)
self.assertFalse(
models.Alias.objects.filter(address="aliasupdate1@test.com").exists())
alias_recipients = list(models.Alias.objects.filter(
address="totoalias@test.com").first().recipients
)
self.assertEqual(alias_recipients, ["toto@test.com"])
def test_update_admin(self):
account = core_models.User.objects.get(username="admin")
url = reverse("v2:account-detail", args=[account.pk])
@@ -68,7 +68,8 @@ class ImportCommand(BaseCommand):
except ValidationError as e:
raise CommandError(
_("It seems that your CSV is badly formatted at row: ") +
options["sepchar"].join(row)
options["sepchar"].join(row) +
_(f"Details: {e.message}")
)
if not fct:
continue
+6 -1
View File
@@ -2,7 +2,11 @@
from .alarm import Alarm
from .alias import (
Alias, AliasRecipient, validate_alias_address, modify_or_create_alias)
Alias,
AliasRecipient,
validate_alias_address,
modify_or_create_alias,
remove_recipient_from_alias)
from .base import AdminObject
from .domain import Domain
from .domain_alias import DomainAlias
@@ -24,4 +28,5 @@ __all__ = [
"SenderAddress",
"validate_alias_address",
"modify_or_create_alias",
"remove_recipient_from_alias",
]
+19 -1
View File
@@ -56,7 +56,7 @@ def validate_alias_address(
return local_part, domain
def modify_or_create_alias(address, recipients, creator=None, domain=None):
def modify_or_create_alias(address, recipients, creator, domain):
"""Add recipient if the alias already exists or create it."""
alias = Alias.objects.filter(address=address, internal=False)
@@ -71,6 +71,24 @@ def modify_or_create_alias(address, recipients, creator=None, domain=None):
)
def remove_recipient_from_alias(address, recipient_to_delete):
"""Delete the selected recipient from an alias
or delete the whole alias if only one is left."""
alias = Alias.objects.filter(
address=address, internal=False)
if alias.exists():
alias_recipients = list(alias.first().recipients)
if recipient_to_delete in alias_recipients:
if len(alias_recipients) == 1:
# Only recipient, we delete the AliasExists
alias.delete()
else:
alias_recipients.remove(recipient_to_delete)
alias = alias.first()
alias.set_recipients(alias_recipients)
alias.save()
class AliasManager(models.Manager):
"""Custom manager for Alias."""