This commit is contained in:
Antoine Nguyen
2010-02-09 15:02:15 +01:00
parent 9ef5df3d26
commit 24f40685c7
9 changed files with 186 additions and 68 deletions
+2 -1
View File
@@ -209,8 +209,9 @@ class ImapListing(EmailListing):
tpl = "webmail/index.html"
tbltype = WMtable
def __init__(self, user, password, baseurl=None, **kwargs):
def __init__(self, user, password, baseurl=None, navparams={}, **kwargs):
self.mbc = IMAPconnector(user=user, password=password)
self.navparams = navparams
EmailListing.__init__(self, **kwargs)
if baseurl:
self.paginator.baseurl = baseurl
+16 -7
View File
@@ -56,11 +56,16 @@ def getctx(status, level=1, **kwargs):
def folder(request, name, updatenav=True):
if not name:
name = "INBOX"
order = request.GET.has_key("order") and request.GET["order"] or None
if updatenav:
pageid = request.GET.has_key("page") and int(request.GET["page"]) or 1
if not "navparams" in request.session.keys():
request.session["navparams"] = {}
request.session["folder"] = name
request.session["page"] = pageid
order = request.GET.has_key("order") and request.GET["order"] or None
if order:
request.session["navparams"]["order"] = order
lst = ImapListing(request.user.username, request.session["password"],
name, folder=name, order=order)
page = lst.paginator.getpage(request.session["page"])
@@ -77,8 +82,10 @@ def folder(request, name, updatenav=True):
@login_required
def index(request):
try:
navp = request.session.has_key("navparams") \
and request.session["navparams"] or {}
lst = ImapListing(request.user.username, request.session["password"],
"INBOX", folder="INBOX")
"INBOX", navparams=navp, folder="INBOX")
except Exception as exp:
return _render_error(request, {"error" : exp})
return lst.render(request, empty=True)
@@ -94,8 +101,11 @@ def viewmail(request, folder, mail_id=None):
header = fetchmail(request, folder, mail_id)
if header:
from templatetags.webextras import viewm_menu
pageid = request.session.has_key("page") and request.session["page"] or "1"
menu = viewm_menu("", folder, mail_id, pageid,
try:
pageid = request.session["page"]
except KeyError:
pageid = "1"
menu = viewm_menu("", request.session, mail_id,
request.user.get_all_permissions())
folder, imapid = header["imapid"].split("/")
mailcontent = render_to_string("webmail/viewmail.html", {
@@ -132,8 +142,7 @@ def empty(request, name):
return folder(request, name, False)
def render_compose(request, form, bodyheader=None, body=None):
menu = compose_menu("", request.session["folder"], request.session["page"],
request.user.get_all_permissions())
menu = compose_menu("", request.session, request.user.get_all_permissions())
content = render_to_string("webmail/compose.html", {
"form" : form, "bodyheader" : bodyheader, "body" : body
})
@@ -156,7 +165,7 @@ def compose(request):
s = smtplib.SMTP(parameters.get("webmail", "SMTP_SERVER"))
s.sendmail(msg['From'], [msg['To']], msg.as_string())
s.quit()
return folder(request, request.session["folder"], False)
return folder(request, request.session["navparams"]["folder"], False)
form = ComposeMailForm()
form.fields["from_"].initial = request.user.username
+40 -39
View File
@@ -49,6 +49,15 @@ td {
position: relative;
}
th {
-moz-box-shadow: 0px -15px 10px -10px rgba(0,0,0,0.6) inset;
-webkit-box-shadow: 0px -15px 10px -10px rgba(0,0,0,0.6) inset;
}
th.selected {
background: #EEEEEE;
}
.draggable {
cursor: move;
}
@@ -62,6 +71,12 @@ tr {
}
{% endblock %}
{% block js %}
navparams = new Hash({
{% for k, v in navparams.items %}
{{ k }} : "{{ v }}",
{% endfor %}
});
updatelisting = function(resp, overflow) {
if (!$defined(overflow)) {
overflow = "auto";
@@ -100,7 +115,7 @@ tr {
if (event.target.parentNode.id) {
var url = event.target.parentNode.id + "/";
event.target.parentNode.setStyle("background", "#ffffcc");
location.hash = url;
current_anchor.baseurl(url).update();
}
}
register_callback("viewmail", function(resp) {
@@ -128,7 +143,7 @@ tr {
loadCompose = function(event) {
event.stop();
location.hash = "compose/";
current_anchor.baseurl("compose/").update();
}
register_callback("compose", compose_callback);
@@ -143,22 +158,17 @@ tr {
obj = event.target;
}
event.stop();
location.hash = obj.get("href");
current_anchor.parse_string(obj.get("href"), true).setparams(navparams);
current_anchor.update();
}
register_callback("folder", function(resp) {
updatelisting(resp, "auto");
/*var drag_group = new Drag.Group({
filter: function(item) { return item.hasClass("active"); },
drag: {
onComplete: function(item) {
item.dispose();
delete(item);
},
onEnter: function(item, droppable) {
alert(droppable);
}
}
});*/
if (navparams.has("order")) {
src = navparams.get("order").charAt(0) == "-" ? "down_arrow.png" : "up_arrow.png";
th = $$("th[id=" + navparams.get("order").substring(1) + "]");
th.getElement("img").set("src", "/static/pics/" + src);
th.addClass("selected");
}
$$("td[class*=draggable]").each(function(item) {
item.makeDraggable({
droppables: ".droppable",
@@ -207,36 +217,28 @@ tr {
});
});
$$("tr").addEvent("dblclick", viewmail);
var sortOrder = "";
$$("th[class=sortable]").addEvent("click", function(evt) {
$$("th[class*=sortable]").addEvent("click", function(evt) {
var tmp = "?";
if (sortOrder == "") {
test = /order=([\+\-]\w+$|&)/.exec(location.hash);
if (test) {
sortOrder = test[1];
}
var order = (navparams.has("order")) ? navparams.get("order") : "";
if (order == "") {
order = current_anchor.getparam("order");
}
if (sortOrder.substring(1) == evt.target.id) {
var sign = (sortOrder.charAt(0) == '+') ? '-' : '+';
sortOrder = sign + evt.target.id;
if (order.substring(1) == evt.target.id) {
var sign = (order.charAt(0) == '+') ? '-' : '+';
order = sign + evt.target.id;
} else {
sortOrder = "-" + evt.target.id;
order = "-" + evt.target.id;
}
if (location.hash.indexOf("?") != -1) {
if (location.hash.indexOf("order") != -1) {
location.hash = location.hash.replace(/order=[\+\-]\w+$|&/,
"order=" + sortOrder);
return;
}
tmp = "&";
}
location.hash += tmp + "order=" + sortOrder;
navparams.set("order", order);
current_anchor.setparams(navparams).update();
});
});
navbarcallback = function(event) {
loadFolder(event, event.target.getParent());
event.stop();
current_anchor.setparams(navparams);
current_anchor.parse_string(event.target.getParent().get("href")).update();
}
foldercallback = function(event) {
@@ -244,10 +246,9 @@ tr {
loadFolder(event, event.target);
}
ajaxListener(updatelisting);
ajaxListener("INBOX", updatelisting);
$$("a[name=loadfolder]").addEvent("click", foldercallback);
$("navbar").getChildren("a").addEvent("click", navbarcallback);
$$("a[name=compose]").addEvent("click", loadCompose);
{% endblock %}
{% block middletitle %}{% trans "Webmail" %}{% endblock %}
{% block leftcol %}
+20 -4
View File
@@ -7,11 +7,27 @@ from mailng.extensions.webmail.imap_listing import IMAPheader
register = template.Library()
def backurl(session, **kwargs):
res = session["folder"]
params = ""
for key in ["page"]:
if key in session.keys():
if params != "":
params += "&"
params += "%s=%s" % (key, session[key])
for k, v in kwargs.iteritems():
if params != "":
params += "&"
params += "%s=%s" % (k, v)
if params != "":
res += "?%s" % params
return res
@register.simple_tag
def viewm_menu(selection, folder, mail_id, page_id, perms):
def viewm_menu(selection, session, mail_id, perms):
entries = [
{"name" : "back",
"url" : folder + "?page=%s" % page_id + "&menu=1",
"url" : "%s?page=%s" % (session["folder"], session["page"]),
"img" : "/static/pics/back.png",
"label" : _("Back")},
{"name" : "reply",
@@ -33,10 +49,10 @@ def viewm_menu(selection, folder, mail_id, page_id, perms):
"perms" : perms})
@register.simple_tag
def compose_menu(selection, folder, page_id, perms):
def compose_menu(selection, session, perms):
entries = [
{"name" : "back",
"url" : folder + "?page=%s" % page_id + "&menu=1",
"url" : "%s?page=%s" % (session["folder"], session["page"]),
"img" : "/static/pics/back.png",
"label" : _("Back")},
{"name" : "sendmail",
+1
View File
@@ -116,6 +116,7 @@ class EmailListing:
"navbar" : self.render_navbar(page),
"folders" : self.getfolders(),
"selection" : self.folder,
"navparams" : self.navparams,
"current_page" : pageid
})
+103 -16
View File
@@ -15,24 +15,14 @@ register_callback = function(name, callback) {
current_anchor = null;
check_anchor = function() {
if (current_anchor == document.location.hash) {
if (current_anchor.serialized == document.location.hash) {
return;
}
current_anchor = document.location.hash;
if (!current_anchor) {
query = "INBOX/"; // Default location
current_anchor.from_string(document.location.hash);
if (!current_anchor.serialized) {
query = current_anchor.deflocation;
} else {
var splits = current_anchor.substring(1).split('?');
var section = (splits[0] != "") ? splits[0] : "INBOX";
delete splits[0];
var params = splits.join('&');
if (section[section.length - 1] != '/') {
section += "/";
}
var query = section;
if (params != "") {
query += "?" + params;
}
query = current_anchor.serialized.substring(1);
}
new Request.JSON({url: query, onSuccess: function(resp) {
callback = ($defined(resp.callback)) ? resp.callback : "default";
@@ -40,11 +30,108 @@ check_anchor = function() {
}}).get();
}
ajaxListener = function(defcallback) {
ajaxListener = function(deflocation, defcallback) {
current_anchor = new HashWrapper(deflocation);
register_callback("default", defcallback);
check_anchor.periodical(300);
}
/*
*
*/
function HashWrapper(deflocation) {
this.deflocation = deflocation;
this.params = $H();
this.base = '';
this.serialized = null;
this.reset = function() {
this.base = null;
this.params.empty();
return this;
};
this.parse_string = function(value, reset) {
var splits = (value.charAt(0) == '#')
? value.substring(1).split('?') : value.split('?');
if (splits.length == 0) {
return this;
}
if (!$defined(reset)) {
reset = false;
}
if (reset) {
this.reset();
}
this.base = (splits[0] == "") ? this.deflocation : splits[0];
if (this.base[this.base.length - 1] != '/') {
this.base += '/';
}
if (splits.length > 1) {
params = splits[1].split('&');
for (var i = 0; i < params.length; i++) {
tmp = params[i].split('=');
this.setparam(tmp[0], tmp[1]);
}
}
return this;
};
this.from_string = function(value, reset) {
this.parse_string(value);
this.serialized = value;
return this;
};
this.serialize = function() {
var res = this.base;
if (this.params.getLength() != 0) {
res += "?" + this.params.toQueryString();
}
return res;
};
this.update = function() {
location.hash = this.serialize();
};
this.setparam = function(name, value) {
this.params.set(name, value);
return this;
};
this.setparams = function(params) {
this.params.extend(params);
return this;
};
this.getparam = function(name) {
if (!this.params.has(name)) {
return "";
}
return this.params.get(name);
}
this.baseurl = function(value) {
this.reset();
this.base = value;
if (this.base[this.base.length - 1] != '/') {
this.base += '/';
}
return this;
};
this.delparam = function(name) {
if (!this.params.has(name)) {
return false;
}
this.params.erase(name);
return this;
};
};
parse_menubar = function(id) {
if ($(id)) {
$(id).getElements('li.dropdown').each( function( elem ){
Binary file not shown.

After

Width:  |  Height:  |  Size: 580 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 595 B

+4 -1
View File
@@ -2,7 +2,10 @@
<thead>
<tr>
{% for c in table.columns %}
<th id="{{ c.name }}" class="sortable" width="{{ c.width }}">{{ c|safe }}</th>
<th id="{{ c.name }}" class="sortable" width="{{ c.width }}">
{{ c|safe }}
<span style="float: right"><img src="" /></span>
</th>
{% endfor %}
</tr>
</thead>