fix: #67, folders disappear on page refresh.

This commit is contained in:
tonio
2010-07-23 15:43:54 +02:00
parent 499d8e9d16
commit 76870a2a8e
7 changed files with 73 additions and 62 deletions
+44 -49
View File
@@ -197,11 +197,6 @@ class IMAPconnector(object):
del self.m
self.m = None
def _encodefolder(self, folder):
if not folder:
return "INBOX"
return folder.encode("imap4-utf-7")
def messages_count(self, **kwargs):
"""An enhanced version of messages_count
@@ -236,34 +231,64 @@ class IMAPconnector(object):
return
return len(data[0].split())
def _parse_folder_name(self, dict, prefix, delimiter, parts):
if not len(parts):
return
path = "%s%s%s" % (prefix, delimiter, parts[0])
dict[parts[0]] = {"path" : path, "sub" : {}}
self._parse_folder_name(dict[parts[0]]["sub"], path, delimiter, parts[1:])
def _encodefolder(self, folder):
if not folder:
return "INBOX"
return folder.encode("imap4-utf-7")
def listfolders(self, topfolder='INBOX', md_folders=[]):
def _parse_folder_name(self, descr, prefix, delimiter, parts):
if not len(parts):
return False
path = "%s%s%s" % (prefix, delimiter, parts[0])
sdescr = {"name" : parts[0], "path" : path, "sub" : []}
if self._parse_folder_name(sdescr["sub"], path, delimiter, parts[1:]):
sdescr["class"] = "subfolders"
descr += [sdescr]
return True
def _listfolders(self, topfolder='INBOX', md_folders=[]):
list_response_pattern = re.compile(r'\((?P<flags>.*?)\) "(?P<delimiter>.*)" (?P<name>.*)')
(status, data) = self.m.list()
result = {}
result = []
for mb in data:
flags, delimiter, name = list_response_pattern.match(mb).groups()
name = name.strip('"').decode("imap4-utf-7")
if re.search("\%s" % delimiter, name):
parts = name.split(".")
dict = {"path" : parts[0], "sub" : {}}
self._parse_folder_name(dict["sub"], parts[0], delimiter, parts[1:])
result[parts[0]] = dict
descr["path"] = parts[0]
descr["sub"] = []
if self._parse_folder_name(descr["sub"], parts[0], delimiter,
parts[1:]):
descr["class"] = "subfolders"
continue
present = False
descr = {"name" : name}
for mdf in md_folders:
if mdf["name"] == name:
present = True
break
if not present:
result[name] = None
return result
result += [descr]
from operator import itemgetter
return sorted(result, key=itemgetter("name"))
def getfolders(self, user):
md_folders = [{"name" : "INBOX", "class" : "inbox"},
{"name" : 'Drafts'},
{"name" : 'Junk'},
{"name" : parameters.get_user(user, "webmail",
"SENT_FOLDER")},
{"name" : parameters.get_user(user, "webmail",
"TRASH_FOLDER"),
"class" : "trash"}]
md_folders += self._listfolders(md_folders=md_folders)
for fd in md_folders:
key = fd.has_key("path") and "path" or "name"
count = self.unseen_messages(fd[key])
if count == 0:
continue
fd["unseen"] = count
return md_folders
def _add_flag(self, folder, mail_id, flag):
self.m.select(self._encodefolder(folder))
@@ -367,37 +392,6 @@ class ImapListing(EmailListing):
self.extravars["refreshrate"] = \
int(parameters.get_user(user, "webmail", "REFRESH_INTERVAL")) * 1000
def __parse_folders(self, folders):
result = []
for fd in sorted(folders.keys()):
descr = {"name" : fd}
if folders[fd] is not None:
descr["path"] = folders[fd]["path"]
if folders[fd]["sub"] != {}:
descr["class"] = "subfolders"
descr["sub"] = self.__parse_folders(folders[fd]["sub"])
result += [descr]
return result
def getfolders(self):
md_folders = [{"name" : "INBOX", "class" : "inbox"},
{"name" : 'Drafts'},
{"name" : 'Junk'},
{"name" : parameters.get_user(self.user, "webmail",
"SENT_FOLDER")},
{"name" : parameters.get_user(self.user, "webmail",
"TRASH_FOLDER"),
"class" : "trash"}]
folders = self.mbc.listfolders(md_folders=md_folders)
md_folders += self.__parse_folders(folders)
for fd in md_folders:
key = fd.has_key("path") and "path" or "name"
count = self.mbc.unseen_messages(fd[key])
if count == 0:
continue
fd["unseen"] = count
return md_folders
def parse_search_parameters(self, criterion, pattern):
def or_criterion(old, c):
if old == "":
@@ -424,6 +418,7 @@ class ImapListing(EmailListing):
except AttributeError:
return -1
class ImapEmail(Email):
def __init__(self, msg, addrfull=False, *args, **kwargs):
Email.__init__(self, msg, *args, **kwargs)
+2 -1
View File
@@ -5,7 +5,8 @@
{% include "common/genericform.html" %}
</div>
{% if body %}
<textarea id="id_body" name="id_body">{% if bodyheader %}{{ bodyheader }}{% endif %}{{ body }}
<textarea id="id_body" name="id_body">{% if bodyheader %}{{ bodyheader }}{% endif %}
{{ body }}
</textarea>
{% else %}
<textarea id="id_body" name="id_body"></textarea>
+1 -1
View File
@@ -2,5 +2,5 @@
{% load webextras %}
<h3>{% trans "Folders" %}</h3>
<ul>
{% print_folders folders %}
{% print_folders folders selected %}
</ul>
+4 -1
View File
@@ -116,7 +116,10 @@
refreshFolder = function() {
var query = current_anchor.serialized.substring(1);
$clear(rtimer);
infobox.show('{% trans "Refreshing..." %}', "gray");
infobox.show('{% trans "Refreshing..." %}', {
profile : "gray",
spinner : true
});
new Request.JSON({url: query, noCache : true, onSuccess: function(resp) {
callback = ($defined(resp.callback)) ? resp.callback : "default";
callbacks[callback](resp);
+6 -3
View File
@@ -100,7 +100,7 @@ def listing_menu(selection, folder, user):
return menu + searchbar
@register.simple_tag
def print_folders(folders):
def print_folders(folders, selected=None):
result = ""
for fd in folders:
if fd.has_key("class"):
@@ -111,8 +111,11 @@ def print_folders(folders):
if fd.has_key("sub"):
cssclass += " clickable"
name = fd["path"]
result += "<li name='%s' class='droppable %s'>\n" % (name, cssclass)
label = fd["name"]
if selected == label:
cssclass += " selected"
result += "<li name='%s' class='droppable %s'>\n" % (name, cssclass)
cssclass = ""
if fd.has_key("unseen"):
label += " (%d)" % fd["unseen"]
@@ -120,6 +123,6 @@ def print_folders(folders):
result += "<a href='%s' class='%s' name='loadfolder'>%s</a>\n" \
% (fd.has_key("path") and fd["path"] or fd["name"], cssclass, label)
if fd.has_key("sub"):
result += "<ul name='%s' class='hidden'>" % (fd["path"]) + print_folders(fd["sub"]) + "</ul>\n"
result += "<ul name='%s' class='hidden'>" % (fd["path"]) + print_folders(fd["sub"], selected) + "</ul>\n"
result += "</li>\n"
return result
+16 -6
View File
@@ -22,6 +22,12 @@ def __get_current_url(request):
res += "&%s=%s" % (p, request.session[p])
return res
def __render_folders(mbc, request):
return render_to_string("webmail/folders.html", {
"selected" : request.session["folder"],
"folders" : mbc.getfolders(request.user)
})
@login_required
@is_not_localadmin()
def folder(request, name, updatenav=True):
@@ -51,10 +57,8 @@ def folder(request, name, updatenav=True):
baseurl=name, folder=name, order=order, **optparams)
page = lst.paginator.getpage(request.session["page"])
folders = render_to_string("webmail/folders.html", {
"folders" : lst.getfolders()
})
dico = {"folders" : folders, "menu" : listing_menu("", name, request.user)}
dico = {"folders" : __render_folders(lst.mbc, request),
"menu" : listing_menu("", name, request.user)}
if page:
dico["listing"] = lst.fetch(request, page.id_start, page.id_stop)
dico["navbar"] = lst.render_navbar(page)
@@ -99,7 +103,10 @@ def viewmail(request, folder, mail_id=None):
""").render(Context({"url" : reverse(getmailcontent, args=[folder, mail_id])}))
menu = viewm_menu("", __get_current_url(request), folder, mail_id,
request.user.get_all_permissions())
ctx = getctx("ok", menu=menu, listing=content)
mbc = IMAPconnector(user=request.user.username,
password=request.session["password"])
ctx = getctx("ok", menu=menu, listing=content,
folders=__render_folders(mbc, request))
return HttpResponse(simplejson.dumps(ctx), mimetype="application/json")
@login_required
@@ -215,7 +222,10 @@ def render_compose(request, form, posturl, bodyheader=None, body=None,
"form" : form, "bodyheader" : bodyheader, "body" : body,
"posturl" : posturl
})
ctx = getctx("ok", level=2, menu=menu, listing=content)
mbc = IMAPconnector(user=request.user.username,
password=request.session["password"])
ctx = getctx("ok", level=2, menu=menu, listing=content,
folders=__render_folders(mbc, request))
return HttpResponse(simplejson.dumps(ctx), mimetype="application/json")
def send_mail(request, withctx=False, origmsg=None, posturl=None):
-1
View File
@@ -14,7 +14,6 @@ urlpatterns = patterns('',
)
if settings.DEBUG:
print "debug"
urlpatterns += patterns(
'',
(r'^static/(?P<path>.*)$', 'django.views.static.serve',