From 6df0a93e30fccf0a15cfda11ac64ba1a6e3df98f Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Thu, 22 Oct 2020 17:46:40 +0200 Subject: [PATCH] Make sure to disable/enable self alias according to forward settings. see #1356 --- modoboa/admin/tests/test_user.py | 13 ++++++++++++ modoboa/admin/views/user.py | 36 +++++++++++++++++++++++--------- 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/modoboa/admin/tests/test_user.py b/modoboa/admin/tests/test_user.py index 312a6c804..346300cce 100644 --- a/modoboa/admin/tests/test_user.py +++ b/modoboa/admin/tests/test_user.py @@ -34,9 +34,22 @@ class ForwardTestCase(ModoTestCase): domadmin = User.objects.get(username="admin@test.com") self.assertTrue(domadmin.can_access(forward)) + selfalias = Alias.objects.get(address="user@test.com", internal=True) + self.assertTrue(selfalias.enabled) + + # Deactivate local copies + self.ajax_post( + url, + {"dest": "user@extdomain.com", "keepcopies": False} + ) + selfalias.refresh_from_db() + self.assertFalse(selfalias.enabled) + # Now, empty forward self.ajax_post(url, {"dest": "", "keepcopies": False}) response = self.client.get(url) self.assertEqual(response.status_code, 200) content = response.json() self.assertNotIn("user@extdomain.com", content["content"]) + selfalias.refresh_from_db() + self.assertTrue(selfalias.enabled) diff --git a/modoboa/admin/views/user.py b/modoboa/admin/views/user.py index 308cdf268..8edc6fa09 100644 --- a/modoboa/admin/views/user.py +++ b/modoboa/admin/views/user.py @@ -21,18 +21,34 @@ def forward(request, tplname="admin/forward.html"): if request.method == "POST": form = ForwardForm(request.POST) if form.is_valid(): - if al is None: - al = Alias.objects.create( - address=mb.full_address, domain=mb.domain, - enabled=mb.user.is_active) recipients = form.cleaned_data["dest"] - if form.cleaned_data["keepcopies"]: - recipients.append(mb.full_address) - al.set_recipients(recipients) - if len(recipients) == 0: - al.delete() + if not recipients: + Alias.objects.filter( + address=mb.full_address, internal=False).delete() + # Make sure internal self-alias is enabled + Alias.objects.filter( + address=mb.full_address, internal=True + ).update(enabled=True) else: - al.post_create(request.user) + if al is None: + al = Alias.objects.create( + address=mb.full_address, + domain=mb.domain, + enabled=mb.user.is_active + ) + al.post_create(request.user) + if form.cleaned_data["keepcopies"]: + # Make sure internal self-alias is enabled + Alias.objects.filter( + address=mb.full_address, internal=True + ).update(enabled=True) + else: + # Deactivate internal self-alias to avoid storing + # local copies... + Alias.objects.filter( + address=mb.full_address, internal=True + ).update(enabled=False) + al.set_recipients(recipients) return render_to_json_response(_("Forward updated")) return render_to_json_response(