From 893a7fbf536e6b63ec6c39ef39869edddbc17ec8 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Mon, 14 Jan 2013 22:54:47 +0100 Subject: [PATCH] Properly remove alias(es) after a mailbox deletion. see #360 --- modoboa/admin/models.py | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/modoboa/admin/models.py b/modoboa/admin/models.py index 40f16ec12..713dfd6fb 100644 --- a/modoboa/admin/models.py +++ b/modoboa/admin/models.py @@ -1,5 +1,7 @@ # coding: utf-8 from django.db import models, IntegrityError +from django.db.models.signals import pre_delete +from django.dispatch import receiver from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes import generic from django.contrib.auth.models import User as DUser, UserManager, Group @@ -396,7 +398,6 @@ class User(DUser): self.email = row[7].strip() if self.email != "": mailbox, domname = split_mailbox(self.email) - print mailbox, domname try: domain = Domain.objects.get(name=domname) except Domain.DoesNotExist: @@ -807,18 +808,29 @@ class Mailbox(DatesAware): super(Mailbox, self).save() def delete(self, keepdir=False): - from modoboa.lib.permissions import ungrant_access_to_object - - events.raiseEvent("DeleteMailbox", self) - ungrant_access_to_object(self) - for alias in self.alias_set.all(): - alias.mboxes.remove(self) - if len(alias.mboxes.all()) == 0: - alias.delete() super(Mailbox, self).delete() if not keepdir: self.delete_dir() +@receiver(pre_delete, sender=Mailbox) +def mailbox_deleted_handler(sender, **kwargs): + """``Mailbox`` pre_delete signal receiver + + In order to properly handle deletions (ie. we don't want to leave + orphan records into the db), we define this custom receiver. + + It manually removes the mailbox from the aliases it is linked to + and then remove all empty aliases. + """ + from modoboa.lib.permissions import ungrant_access_to_object + + mb = kwargs['instance'] + events.raiseEvent("DeleteMailbox", mb) + ungrant_access_to_object(mb) + for alias in mb.alias_set.all(): + alias.mboxes.remove(mb) + if len(alias.mboxes.all()) == 0: + alias.delete() class Alias(DatesAware): address = models.CharField(