From 132b3a7637e259d8a5cd5de34c5ff25bf4eed50f Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Fri, 18 Nov 2011 17:46:26 +0100 Subject: [PATCH] wip: Webmail big refactoring and performance improvment * some issues with drag&drop and mailboxes list were fixed * the pagination feature was fixed --- extensions/webmail/imaputils.py | 14 +++++---- extensions/webmail/static/js/webmail.js | 31 ++++++++++++++----- extensions/webmail/views.py | 40 +++++++++++++++++-------- static/js/anchor_nav.js | 1 + static/js/email_listing.js | 10 ++++--- templates/common/navbar.html | 8 ++--- 6 files changed, 69 insertions(+), 35 deletions(-) diff --git a/extensions/webmail/imaputils.py b/extensions/webmail/imaputils.py index dd6ba51c0..282e3c652 100644 --- a/extensions/webmail/imaputils.py +++ b/extensions/webmail/imaputils.py @@ -67,7 +67,7 @@ class IMAPconnector(object): :param name: the command's name :return: the command's result """ - if name in ['FETCH', 'SORT', 'STORE']: + if name in ['FETCH', 'SORT', 'STORE', 'COPY']: try: typ, data = self.m.uid(name, *args) except imaplib.IMAP4.error, e: @@ -292,11 +292,13 @@ class IMAPconnector(object): def msg_answered(self, folder, imapid): self._add_flag(folder, imapid, r'(\Answered)') - def move(self, msgset, oldfolder, newfolder): - self.m.select(self._encodefolder(oldfolder)) - status, data = self.m.copy(msgset, self._encodefolder(newfolder)) - if status == 'OK': - self.m.store(msgset, "+FLAGS", r'(\Deleted)') + def move(self, msgset, oldmailbox, newmailbox): + """Move messages between mailboxes + + """ + self.select_mailbox(oldmailbox, False) + self._cmd("COPY", msgset, newmailbox.encode("imap4-utf-7")) + self._cmd("STORE", msgset, "+FLAGS", r'(\Deleted)') def push_mail(self, folder, msg): now = imaplib.Time2Internaldate(time.time()) diff --git a/extensions/webmail/static/js/webmail.js b/extensions/webmail/static/js/webmail.js index 80e100e22..f882fc796 100644 --- a/extensions/webmail/static/js/webmail.js +++ b/extensions/webmail/static/js/webmail.js @@ -147,6 +147,7 @@ var Webmail = new Class({ link.addEvent("click", this.listmailbox_loader.bind(this)); img.addEvent("click", this.toggle_folder_buttons.bind(this)); } + this.init_draggables(); this.toggle_mbox_state(parent.getFirst("div"), ul); }, @@ -272,11 +273,29 @@ var Webmail = new Class({ init_sortable_columns(); update_sortable_column(); - this.dragobjs = new Array(); + this.init_draggables(); + + $$("tbody>tr").addEvent("dblclick", viewmail); + }, + + /* + * Drag & Drop feature + */ + init_draggables: function(pattern) { + if (this.dragobjs == undefined) { + this.dragobjs = new Array(); + } else { + this.dragobjs.each(function(item) { + item.detach(); + delete(item); + }); + this.dragobjs = new Array(); + } + $$("td[class*=draggable]").each(function(item) { var pid = item.getParent().get("id"); - this.dragobjs[pid] = new Drag.Move(item, { + this.dragobjs[pid] = item.makeDraggable({ droppables: ".droppable" }).addEvents({ beforeStart: this.bstart_dragging.bind(this), @@ -287,13 +306,8 @@ var Webmail = new Class({ cancel: this.cancel_dragging.bind(this) }); }.bind(this)); - - $$("tbody>tr").addEvent("dblclick", viewmail); }, - /* - * Drag & Drop feature - */ /* * 'before start' event callback @@ -574,12 +588,13 @@ var Webmail = new Class({ profile: "gray", spinner: true }); + params["json"] = "1"; new Request.JSON({ url : url, onSuccess : function(response) { if (response.status == "ok") { if (!$defined(response.next)) { - current_anchor.get_callback("folder")(response); + current_anchor.get_callback("listmailbox")(response); } infobox.info(gettext("Done")); if ($defined(response.next)) { diff --git a/extensions/webmail/views.py b/extensions/webmail/views.py index 4db1e21ec..888d314f7 100644 --- a/extensions/webmail/views.py +++ b/extensions/webmail/views.py @@ -211,11 +211,12 @@ def getattachment(request, folder, mail_id): def move(request): for arg in ["msgset", "to"]: if not request.GET.has_key(arg): - return - mbc = IMAPconnector(user=request.user.username, - password=request.session["password"]) - mbc.move(request.GET["msgset"], request.session["folder"], request.GET["to"]) - return folder(request, request.session["folder"], False) + raise WebmailError(_("Invalid request")) + mbc = get_imapconnector(request) + mbc.move(request.GET["msgset"], request.session["mbox"], request.GET["to"]) + resp = listmailbox(request, request.session["mbox"]) + resp.update(status="ok") + return ajax_simple_response(resp) @login_required @is_not_localadmin() @@ -502,21 +503,33 @@ def delattachment(request): # NEW CODE STARTS HERE # def render_mboxes_list(request, imapc): + curmbox = request.session.get("mbox", "INBOX") return _render_to_string(request, "webmail/folders.html", { "titlebar" : True, - "selected" : request.session["mbox"], + "selected" : curmbox, "folders" : imapc.getfolders(request.user), "withmenu" : True, "withunseen" : True }) -def listmailbox(request): - mbox = request.GET.get("name", "INBOX") - request.session["mbox"] = mbox - lst = ImapListing(request.user, request.session["password"], - baseurl=mbox, folder=mbox, order="-date") +def set_nav_params(request): + if not request.session.has_key("navparams"): + request.session["navparams"] = {} + + request.session["pageid"] = \ + int(request.GET.get("page", 1)) - return lst.render(request) +def listmailbox(request, defmailbox="INBOX"): + mbox = request.GET.get("name", defmailbox) + request.session["mbox"] = mbox + + set_nav_params(request) + + lst = ImapListing(request.user, request.session["password"], + baseurl="?action=listmailbox&name=%s&" % mbox, + folder=mbox, order="-date") + + return lst.render(request, request.session["pageid"]) @login_required @is_not_localadmin() @@ -559,6 +572,7 @@ def newindex(request): defcallback="wm_updatelisting") if not json: + curmbox = request.session.get("mbox", "INBOX") imapc = get_imapconnector(request) response["refreshrate"] = \ int(parameters.get_user(request.user, "REFRESH_INTERVAL")) * 1000 @@ -567,7 +581,7 @@ def newindex(request): menufunc = globals()["%s_menu" % action] except KeyError: menufunc = globals()["listmailbox_menu"] - response["menu"] = menufunc("", request.session["mbox"], request.user) + response["menu"] = menufunc("", curmbox, request.user) return _render(request, "webmail/index.html", response) response.update(status="ok", callback=action) diff --git a/static/js/anchor_nav.js b/static/js/anchor_nav.js index 56531f1a3..f17619c38 100644 --- a/static/js/anchor_nav.js +++ b/static/js/anchor_nav.js @@ -112,6 +112,7 @@ var AnchorNavigation = new Class({ for (var i = 0; i < elems.length; i++) { this.setparamfromstring(elems[i]); } + return this; }, setparamfromstring: function(str) { diff --git a/static/js/email_listing.js b/static/js/email_listing.js index 97f561ecf..89b170616 100644 --- a/static/js/email_listing.js +++ b/static/js/email_listing.js @@ -4,9 +4,11 @@ */ function navbarcallback(event) { - event.stop(); - current_anchor.setparams(navparams); - current_anchor.parse_string($(event.target).getParent().get("href")).update(); + event.stop(); + current_anchor.reset() + .setparams(navparams) + .updateparams(this.get("href")) + .update(); } function updatelisting(resp) { @@ -23,7 +25,7 @@ function updatelisting(resp) { } if ($defined(resp.navbar)) { $("navbar").set("html", resp.navbar); - $("navbar").getChildren("a").addEvent("click", navbarcallback); + $$("#navbar a").addEvent("click", navbarcallback); } } diff --git a/templates/common/navbar.html b/templates/common/navbar.html index 0d5ac4277..182fb4e86 100644 --- a/templates/common/navbar.html +++ b/templates/common/navbar.html @@ -2,18 +2,18 @@ {% if page.previous_page %} - + - + {% endif %} {% if page.next_page %} - + - + {% endif %}