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 %}

{{ title }}

+
{{ error }}
{% include "common/genericform.html" %} diff --git a/extensions/webmail/views.py b/extensions/webmail/views.py index e7634e559..3ecdb270c 100644 --- a/extensions/webmail/views.py +++ b/extensions/webmail/views.py @@ -105,7 +105,8 @@ def folder(request, name, updatenav=True): optparams["criteria"] = request.session["criteria"] else: optparams["reset"] = True - optparams["elems_per_page"] = int(parameters.get_user(request.user, "MESSAGES_PER_PAGE")) + optparams["elems_per_page"] = \ + int(parameters.get_user(request.user, "MESSAGES_PER_PAGE")) lst = ImapListing(request.user, request.session["password"], baseurl=name, folder=name, order=order, **optparams) @@ -457,9 +458,9 @@ def newfolder(request, tplname="webmail/folder.html"): if form.is_valid(): pf = request.POST.has_key("parent_folder") \ and request.POST["parent_folder"] or None - if mbc.create_folder(form.cleaned_data["name"], pf): - return ajax_response(request, ajaxnav=True) - + mbc.create_folder(form.cleaned_data["name"], pf) + return ajax_response(request, ajaxnav=True) + ctx["form"] = form ctx["selected"] = None return ajax_response(request, status="ko", template=tplname, **ctx) @@ -492,8 +493,7 @@ def editfolder(request, tplname="webmail/folder.html"): or (pf is not None and pf != oldparent): newname = form.cleaned_data["name"] if pf is None \ else "%s.%s" % (pf, form.cleaned_data["name"]) - if not mbc.rename_folder(request.POST["oldname"], newname): - raise Exception + mbc.rename_folder(request.POST["oldname"], newname) extra["url"] = newname return ajax_response(request, ajaxnav=True, **extra) except Exception: @@ -518,6 +518,5 @@ def delfolder(request): return mbc = IMAPconnector(user=request.user.username, password=request.session["password"]) - if mbc.delete_folder(request.GET["name"]): - return ajax_response(request) + mbc.delete_folder(request.GET["name"]) return ajax_response(request, status="ko") diff --git a/lib/__init__.py b/lib/__init__.py index 352cdb9ba..51170f8fd 100644 --- a/lib/__init__.py +++ b/lib/__init__.py @@ -74,7 +74,9 @@ def getctx(status, level=1, callback=None, **kwargs): ctx[kw] = v return ctx -def ajax_response(request, status="ok", url="", ajaxnav=False, template=None, **kwargs): +def ajax_response(request, status="ok", error=None, + url="", ajaxnav=False, norefresh=False, + template=None, **kwargs): """Ajax response shortcut Simple shortcut that sends an JSON response. If a template is @@ -95,10 +97,13 @@ def ajax_response(request, status="ok", url="", ajaxnav=False, template=None, ** else: content = "" jsonctx = {"status" : status, "content" : content} + if error is not None: + jsonctx["error"] = error if ajaxnav: jsonctx["ajaxnav"] = True if url != "": jsonctx["url"] = url + jsonctx["norefresh"] = norefresh return HttpResponse(simplejson.dumps(jsonctx), mimetype="application/json") def decode(s, encodings=('utf8', 'latin1', 'windows-1252', 'ascii'), charset=None): diff --git a/static/js/form.js b/static/js/form.js index a3936b17d..005e63e3f 100644 --- a/static/js/form.js +++ b/static/js/form.js @@ -49,15 +49,19 @@ function ajax_submit(event) { new Request({ method: form.get("method"), data: data, - onSuccess: function(responseText) { + onSuccess: function(responseText){ var response = JSON.decode(responseText); if (response.status == "ko") { - $(document.body).set("html", response.content); - $(document.body).addEvent("submit", ajax_submit); - if ($defined(error_callbacks[myid])) { - error_callbacks[myid](); - } + if ($defined(response.norefresh) && response.norefresh == true) { + $("error").set("html", response.error); + } else { + $(document.body).set("html", response.content); + $(document.body).addEvent("submit", ajax_submit); + if ($defined(error_callbacks[myid])) { + error_callbacks[myid](); + } + } } else { if ($defined(response.ajaxnav)) { if ($defined(response.url)) {