mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-18 05:51:26 +02:00
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:
@@ -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())
|
||||
|
||||
@@ -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
@@ -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)
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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 %}
|
||||
|
||||
Reference in New Issue
Block a user