diff --git a/extensions/webmail/lib.py b/extensions/webmail/lib.py index 9bc27f8fd..41ffe0387 100644 --- a/extensions/webmail/lib.py +++ b/extensions/webmail/lib.py @@ -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.*?)\) "(?P.*)" (?P.*)') (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) diff --git a/extensions/webmail/templates/compose.html b/extensions/webmail/templates/compose.html index ae597574f..76cb4dbc9 100644 --- a/extensions/webmail/templates/compose.html +++ b/extensions/webmail/templates/compose.html @@ -5,7 +5,8 @@ {% include "common/genericform.html" %} {% if body %} - {% else %} diff --git a/extensions/webmail/templates/folders.html b/extensions/webmail/templates/folders.html index 844bb8299..ce21f6cf7 100644 --- a/extensions/webmail/templates/folders.html +++ b/extensions/webmail/templates/folders.html @@ -2,5 +2,5 @@ {% load webextras %}

{% trans "Folders" %}

    - {% print_folders folders %} + {% print_folders folders selected %}
diff --git a/extensions/webmail/templates/index.html b/extensions/webmail/templates/index.html index 3ac3ee0ac..0330143a8 100644 --- a/extensions/webmail/templates/index.html +++ b/extensions/webmail/templates/index.html @@ -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); diff --git a/extensions/webmail/templatetags/webextras.py b/extensions/webmail/templatetags/webextras.py index 53a5718d4..c52d3dea2 100644 --- a/extensions/webmail/templatetags/webextras.py +++ b/extensions/webmail/templatetags/webextras.py @@ -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 += "
  • \n" % (name, cssclass) label = fd["name"] + if selected == label: + cssclass += " selected" + result += "
  • \n" % (name, cssclass) + cssclass = "" if fd.has_key("unseen"): label += " (%d)" % fd["unseen"] @@ -120,6 +123,6 @@ def print_folders(folders): result += "%s\n" \ % (fd.has_key("path") and fd["path"] or fd["name"], cssclass, label) if fd.has_key("sub"): - result += "\n" + result += "\n" result += "
  • \n" return result diff --git a/extensions/webmail/views.py b/extensions/webmail/views.py index 60895dcaf..7df80982e 100644 --- a/extensions/webmail/views.py +++ b/extensions/webmail/views.py @@ -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): diff --git a/urls.py b/urls.py index 677c58c37..132e591ce 100644 --- a/urls.py +++ b/urls.py @@ -14,7 +14,6 @@ urlpatterns = patterns('', ) if settings.DEBUG: - print "debug" urlpatterns += patterns( '', (r'^static/(?P.*)$', 'django.views.static.serve',