diff --git a/extensions/webmail/lib.py b/extensions/webmail/lib.py index 85cfcc753..526187ce0 100644 --- a/extensions/webmail/lib.py +++ b/extensions/webmail/lib.py @@ -18,6 +18,19 @@ from modoboa.lib import decode, tables, imap_utf7, Singleton from modoboa.lib.email_listing import MBconnector, EmailListing, Email from modoboa.lib import tables, imap_utf7, parameters, static_url, u2u_decode +class WebmailError(Exception): + errorexpr = re.compile("\[([^\]]+)\]\s*([^\.]+)") + + def __init__(self, reason, ajax=False): + m = WebmailError.errorexpr.match(reason) + if m is None: + self.reason = reason + else: + self.reason = "%s: %s" % (_("Server response"), m.group(2)) + self.ajax = ajax + + def __str__(self): + return self.reason class WMtable(tables.Table): tableid = "emails" @@ -315,20 +328,20 @@ class IMAPconnector(object): name = "%s.%s" % (parent, name) typ, data = self.m.create(self._encodefolder(name)) if typ == "NO": - return False + raise WebmailError(data[0]) return True def rename_folder(self, oldname, newname): typ, data = self.m.rename(self._encodefolder(oldname), self._encodefolder(newname)) if typ == "NO": - return False + raise WebmailError(data[0], ajax=True) return True def delete_folder(self, name): typ, data = self.m.delete(self._encodefolder(name)) if typ == "NO": - return False + raise WebmailError(data[0]) return True def getquota(self, folder): diff --git a/extensions/webmail/middleware.py b/extensions/webmail/middleware.py new file mode 100644 index 000000000..106771aca --- /dev/null +++ b/extensions/webmail/middleware.py @@ -0,0 +1,11 @@ +# coding: utf-8 + +from modoboa.lib import ajax_response +from modoboa.extensions.webmail.lib import WebmailError + +class WebmailErrorMiddleware(object): + def process_exception(self, request, exception): + if not isinstance(exception, WebmailError): + return None + return ajax_response(request, status="ko", + error=str(exception), norefresh=True) diff --git a/extensions/webmail/static/js/webmail.js b/extensions/webmail/static/js/webmail.js index 9df19f5a4..69c1f4486 100644 --- a/extensions/webmail/static/js/webmail.js +++ b/extensions/webmail/static/js/webmail.js @@ -59,14 +59,8 @@ function viewmail_cb(resp) { $$("a[name=forward]").addEvent("click", forward_loader); $$("a[name=delete]").addEvent("click", function(event) { var lnk = event.target; - event.stop(); - new Request.JSON({ - url: lnk.get("href"), onSuccess: function(resp) { - current_anchor.parse_string(resp.next).update(); - select_folder($$("a[href=" + current_anchor.getbaseurl() + "]")); - } - }).get(); + simple_request(lnk.get("href")); }); $$("a[name=activate_links]").addEvent("click", function(evt) { evt.stop(); @@ -219,9 +213,22 @@ function simple_request(url, params) { new Request.JSON({ url : url, onSuccess : function(response) { - get_callback("folder")(response); - infobox.info(gettext("Done")); - infobox.hide(1); + if (response.status == "ok") { + if (!$defined(response.next)) { + get_callback("folder")(response); + } + infobox.info(gettext("Done")); + if ($defined(response.next)) { + (function(response) { + current_anchor.parse_string(response.next).update(); + select_folder($$("a[href=" + current_anchor.getbaseurl() + "]")); + }).delay(500, this, response); + } else { + infobox.hide(1); + } + } else { + infobox.error(response.error); + } } }).get(params); } \ No newline at end of file diff --git a/extensions/webmail/templates/webmail/folder.html b/extensions/webmail/templates/webmail/folder.html index 912fc79a1..70f4de066 100644 --- a/extensions/webmail/templates/webmail/folder.html +++ b/extensions/webmail/templates/webmail/folder.html @@ -29,6 +29,7 @@ {% endblock %} {% block content %}