diff --git a/doc/extending/events.rst b/doc/extending/events.rst index 48b0570a7..76bcf0493 100644 --- a/doc/extending/events.rst +++ b/doc/extending/events.rst @@ -65,9 +65,10 @@ Raised when an existing account is deleted. *Callback prototype*:: - def callback(account): pass + def callback(account, byuser, **options): pass -* ``oldaccount`` is the account that is going to be deleted +* ``account`` is the account that is going to be deleted +* ``byuser`` is the adminstrator deleting ``account`` AccountModified =============== diff --git a/modoboa/core/models.py b/modoboa/core/models.py index 2c90a4604..035a09b63 100644 --- a/modoboa/core/models.py +++ b/modoboa/core/models.py @@ -59,7 +59,7 @@ class User(AbstractBaseUser, PermissionsMixin): password_expr = re.compile(r'(\{(\w+)\}|(\$1\$))(.+)') - def delete(self, fromuser, keep_mb_dir, *args, **kwargs): + def delete(self, fromuser, *args, **kwargs): """Custom delete method To check permissions properly, we need to make a distinction @@ -79,18 +79,12 @@ class User(AbstractBaseUser, PermissionsMixin): if not fromuser.can_access(self): raise PermDeniedException - # if self.has_mailbox: - # mb = self.mailbox_set.all()[0] - # if not fromuser.can_access(mb): - # raise PermDeniedException - # mb.delete(keepdir=keep_mb_dir) - owner = get_object_owner(self) 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) - events.raiseEvent("AccountDeleted", self) + events.raiseEvent("AccountDeleted", self, fromuser, **kwargs) ungrant_access_to_object(self) super(User, self).delete(*args, **kwargs) diff --git a/modoboa/core/views/auth.py b/modoboa/core/views/auth.py index cb84e6c36..c56b81a69 100644 --- a/modoboa/core/views/auth.py +++ b/modoboa/core/views/auth.py @@ -23,9 +23,6 @@ def dologin(request): login(request, user) if not form.cleaned_data["rememberme"]: request.session.set_expiry(0) - events.raiseEvent("UserLoggedIn", request, form) - # if request.user.has_mailbox: - # request.session["password"] = encrypt(form.cleaned_data["password"]) request.session["django_language"] = \ parameters.get_user(request.user, "LANG") diff --git a/modoboa/extensions/admin/__init__.py b/modoboa/extensions/admin/__init__.py index 793ea13ae..4677515d9 100644 --- a/modoboa/extensions/admin/__init__.py +++ b/modoboa/extensions/admin/__init__.py @@ -154,3 +154,22 @@ def import_account_mailbox(user, account, row): except Domain.DoesNotExist: continue dom.add_admin(account) + + +@events.observe("UserLogin") +def user_logged_in(request, username, password): + from modoboa.lib.cryptutils import encrypt + + if request.user.mailbox_set.count(): + request.session["password"] = encrypt(password) + + +@events.observe("AccountDeleted") +def account_deleted(account, byuser, **kwargs): + if not account.mailbox_set.count(): + return + mb = account.mailbox_set.all()[0] + if not byuser.can_access(mb): + raise PermDeniedException + keep_mb_dir = kwargs.get("keep_mb_dir", True) + mb.delete(keepdir=keep_mb_dir) diff --git a/modoboa/extensions/admin/views/identity.py b/modoboa/extensions/admin/views/identity.py index 6ca1410f9..3ca9a9a8a 100644 --- a/modoboa/extensions/admin/views/identity.py +++ b/modoboa/extensions/admin/views/identity.py @@ -225,7 +225,7 @@ def editaccount(request, accountid, tplname="common/tabforms.html"): def delaccount(request, accountid): keepdir = True if request.POST.get("keepdir", "false") == "true" else False - User.objects.get(pk=accountid).delete(request.user, keepdir) + User.objects.get(pk=accountid).delete(request.user, keep_mb_dir=keepdir) msg = ungettext("Account deleted", "Accounts deleted", 1) return ajax_simple_response({"status": "ok", "respmsg": msg}) diff --git a/modoboa/extensions/limits/controls.py b/modoboa/extensions/limits/controls.py index 27c624401..f8174e666 100644 --- a/modoboa/extensions/limits/controls.py +++ b/modoboa/extensions/limits/controls.py @@ -181,8 +181,7 @@ def on_account_modified(old, new): @events.observe("AccountDeleted") -def on_account_deleted(account): - print "del" +def on_account_deleted(account, byuser, **kwargs): owner = get_object_owner(account) if not owner.group in ["SuperAdmins", "Resellers"]: return