mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-18 05:51:26 +02:00
fix: #67, folders disappear on page refresh.
This commit is contained in:
+44
-49
@@ -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)
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -2,5 +2,5 @@
|
||||
{% load webextras %}
|
||||
<h3>{% trans "Folders" %}</h3>
|
||||
<ul>
|
||||
{% print_folders folders %}
|
||||
{% print_folders folders selected %}
|
||||
</ul>
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user