wip: Webmail big refactoring and performance improvment

* some issues with drag&drop and mailboxes list were fixed
* the pagination feature was fixed
This commit is contained in:
Antoine Nguyen
2011-11-18 17:46:26 +01:00
parent 0aace4e521
commit 132b3a7637
6 changed files with 69 additions and 35 deletions
+8 -6
View File
@@ -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())
+23 -8
View File
@@ -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)) {
+27 -13
View File
@@ -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)
+1
View File
@@ -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) {
+6 -4
View File
@@ -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);
}
}
+4 -4
View File
@@ -2,18 +2,18 @@
<label>{% trans "Messages" %} {{ page.id_start }} {% trans "to" %} {{ page.id_stop }} {% trans "of" %} {{ page.items }}</label>
{% if page.previous_page %}
<a href="{{ page.baseurl }}?page=1">
<a href="{{ page.baseurl }}page=1">
<img src="{{ MEDIA_URL }}pics/first.png" border="0" title="{% trans "First" %}" />
</a>
<a href="{{ page.baseurl }}?page={{ page.previous_page }}">
<a href="{{ page.baseurl }}page={{ page.previous_page }}">
<img src="{{ MEDIA_URL }}pics/back.png" border="0" title="{% trans "Previous" %}" />
</a>
{% endif %}
{% if page.next_page %}
<a href="{{ page.baseurl }}?page={{ page.next_page }}">
<a href="{{ page.baseurl }}page={{ page.next_page }}">
<img src="{{ MEDIA_URL }}pics/next.png" border="0" title="{% trans "Next" %}" />
</a>
<a href="{{ page.baseurl }}?page={{ page.last_page }}">
<a href="{{ page.baseurl }}page={{ page.last_page }}">
<img src="{{ MEDIA_URL }}pics/last.png" border="0" title="{% trans "Last" %}" />
</a>
{% endif %}