diff --git a/modoboa/core/models.py b/modoboa/core/models.py index 93df9a416..80b77bb15 100644 --- a/modoboa/core/models.py +++ b/modoboa/core/models.py @@ -90,6 +90,7 @@ class User(PermissionsMixin): for ooentry in self.objectaccess_set.filter(is_owner=True): if ooentry.content_object is not None: grant_access_to_object(owner, ooentry.content_object, True) + ungrant_access_to_object(ooentry.content_object, self) events.raiseEvent("AccountDeleted", self, fromuser, **kwargs) ungrant_access_to_object(self) diff --git a/modoboa/extensions/admin/tests/alias.py b/modoboa/extensions/admin/tests/alias.py index dbf6c3b90..10bc60a99 100644 --- a/modoboa/extensions/admin/tests/alias.py +++ b/modoboa/extensions/admin/tests/alias.py @@ -49,15 +49,19 @@ class AliasTestCase(ModoTestCase): ) self.assertEqual(user.mailbox_set.first().alias_set.count(), 1) self.assertEqual( - user.mailbox_set.first().alias_set.first(), "toto@test.com") + user.mailbox_set.first().alias_set.first().full_address, + "toto@test.com" + ) values = { - "email": "Titi@test.com", "recipient": "user@test.com", + "email": "Titi@test.com", "recipients": "user@test.com", "enabled": True } self.ajax_post(reverse("admin:alias_add"), values) self.assertEqual( - user.mailbox_set.first().alias_set.first(), "titi@test.com") + user.mailbox_set.first().alias_set.first().full_address, + "titi@test.com" + ) def test_dlist(self): values = dict(email="all@test.com", diff --git a/modoboa/extensions/admin/tests/domain_alias.py b/modoboa/extensions/admin/tests/domain_alias.py index a13abc915..c4a1e5538 100644 --- a/modoboa/extensions/admin/tests/domain_alias.py +++ b/modoboa/extensions/admin/tests/domain_alias.py @@ -19,6 +19,7 @@ class DomainAliasTestCase(ModoTestCase): domal = DomainAlias() domal.name = "domalias.net" domal.target = dom + domal.enabled = True domal.save() self.assertEqual(dom.domainalias_count, 1) diff --git a/modoboa/extensions/limits/tests.py b/modoboa/extensions/limits/tests.py index 1c2397b57..7fe604635 100644 --- a/modoboa/extensions/limits/tests.py +++ b/modoboa/extensions/limits/tests.py @@ -40,8 +40,29 @@ class PermissionsTestCase(ModoTestCase): ) self.assertEqual(resp, "Permission denied") + def test_delete_forward(self): + """Delete a forward created by a user. + + This test was added to help fixing #689. + """ + self.clt.logout() + self.clt.login(username="user@test2.com", password="toto") + + values = { + "dest": "rcpt@dest.com", + "keepcopies": True + } + self.ajax_post(reverse("user_forward"), values) + + user = User.objects.get(username="user@test2.com") + + self.clt.logout() + self.clt.login(username="admin", password="password") + self.ajax_post(reverse("admin:account_delete", args=[user.pk])) + class ResourceTestCase(ModoTestCase): + fixtures = ["initial_users.json"] def setUp(self): diff --git a/modoboa/lib/permissions.py b/modoboa/lib/permissions.py index 661db46fb..c993c2b04 100644 --- a/modoboa/lib/permissions.py +++ b/modoboa/lib/permissions.py @@ -48,22 +48,15 @@ def grant_access_to_object(user, obj, is_owner=False): :param obj: an admin. object (Domain, Mailbox, ...) :param is_owner: the user is the unique object's owner """ - ct = ContentType.objects.get_for_model(obj) - try: - entry = user.objectaccess_set.get(content_type=ct, object_id=obj.id) - entry.is_owner = is_owner - entry.save() - except ObjectAccess.DoesNotExist: - pass - else: - return - - ObjectAccess.objects.create( - user=user, content_type=ct, object_id=obj.id, is_owner=is_owner - ) - if not is_owner: - return from modoboa.core.models import User + + ct = ContentType.objects.get_for_model(obj) + entry, created = ObjectAccess.objects.get_or_create( + user=user, content_type=ct, object_id=obj.id) + entry.is_owner = is_owner + entry.save() + if not created or not is_owner: + return for su in User.objects.filter(is_superuser=True): if su == user: continue @@ -83,11 +76,8 @@ def grant_access_to_objects(user, objects, ct): :param ct: the content type """ for obj in objects: - try: - ObjectAccess.objects.create( - user=user, content_type=ct, object_id=obj.id) - except IntegrityError: - pass + ObjectAccess.objects.get_or_create( + user=user, content_type=ct, object_id=obj.id) def ungrant_access_to_object(obj, user=None):