From 560f8557de3519bc4dc4639a26c53c067e2c1115 Mon Sep 17 00:00:00 2001 From: tonio Date: Tue, 27 Apr 2010 17:19:19 +0200 Subject: [PATCH] Ticket #49. Folders list is now updated on each folder changement. --- extensions/webmail/imap_listing.py | 23 +++++++++++++++----- extensions/webmail/main.py | 5 ++++- extensions/webmail/templates/folders.html | 6 +++++ extensions/webmail/templates/index.html | 16 ++++++-------- extensions/webmail/templatetags/webextras.py | 9 ++++++-- lib/email_listing.py | 4 ---- 6 files changed, 41 insertions(+), 22 deletions(-) create mode 100644 extensions/webmail/templates/folders.html diff --git a/extensions/webmail/imap_listing.py b/extensions/webmail/imap_listing.py index cc1cea565..1c63ef6c0 100644 --- a/extensions/webmail/imap_listing.py +++ b/extensions/webmail/imap_listing.py @@ -1,10 +1,9 @@ - # -*- coding: utf-8 -*- import re import time import imaplib -#import ssl +import ssl from datetime import datetime, timedelta from email.header import decode_header import email.utils @@ -142,13 +141,11 @@ class IMAPconnector(object): self.m = imaplib.IMAP4_SSL(self.address, self.port) else: self.m = imaplib.IMAP4(self.address, self.port) -# except (imaplib.IMAP4.error, ssl.SSLError), error: - except Exception, error: + except (imaplib.IMAP4.error, ssl.SSLError), error: return False, _("Connection to IMAP server failed, check your configuration") try: self.m.login(user, passwd) -# except (imaplib.IMAP4.error, ssl.SSLError), error: - except Exception, error: + except (imaplib.IMAP4.error, ssl.SSLError), error: return False, _("Authentication failed, check your configuration") return True, None @@ -183,6 +180,14 @@ class IMAPconnector(object): self.messages = data[0].split() return len(self.messages) + def unseen_messages(self, folder): + """Return the number of unseen messages for folder""" + self.m.select(self._encodefolder(folder)) + status, data = self.m.search("UTF-8", "(NOT DELETED UNSEEN)") + if status != "OK": + return + return len(data[0].split()) + def _parse_folder_name(self, dict, prefix, delimiter, parts): if not len(parts): return @@ -305,6 +310,12 @@ class ImapListing(EmailListing): {"name" : 'Trash', "icon" : "trash.png"}] 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): diff --git a/extensions/webmail/main.py b/extensions/webmail/main.py index 1da4e8db6..c48d6b8ca 100644 --- a/extensions/webmail/main.py +++ b/extensions/webmail/main.py @@ -91,7 +91,10 @@ def folder(request, name, updatenav=True): else: content = "Empty folder" navbar = "" - ctx = getctx("ok", listing=content, navbar=navbar, + folders = render_to_string("webmail/folders.html", { + "folders" : lst.getfolders() + }) + ctx = getctx("ok", folders=folders, listing=content, navbar=navbar, menu=listing_menu("", name, request.user.get_all_permissions())) return HttpResponse(simplejson.dumps(ctx), mimetype="application/json") diff --git a/extensions/webmail/templates/folders.html b/extensions/webmail/templates/folders.html new file mode 100644 index 000000000..844bb8299 --- /dev/null +++ b/extensions/webmail/templates/folders.html @@ -0,0 +1,6 @@ +{% load i18n %} +{% load webextras %} +

{% trans "Folders" %}

+ diff --git a/extensions/webmail/templates/index.html b/extensions/webmail/templates/index.html index cdfd6e920..a3bcd3993 100644 --- a/extensions/webmail/templates/index.html +++ b/extensions/webmail/templates/index.html @@ -16,7 +16,7 @@ html > body #listing { bottom: 35px; } -#leftcol { +#folders { float: left; width: 150px; } @@ -70,7 +70,7 @@ table#emails > tbody { .box a:link, .box a:visited { background: transparent; color: black; - font-weight: bold; + /*font-weight: bold;*/ text-decoration: none; } @@ -126,7 +126,10 @@ ul.visible { {% block js %} wm_updatelisting = function(resp) { updatelisting(resp); - + if ($defined(resp.folders)) { + $("folders").set("html", resp.folders); + } + $$("a[name=loadfolder]").addEvent("click", foldercallback); $$("a[name=compose]").addEvent("click", loadCompose); $$("a[name=empty]").addEvent("click", empty); } @@ -375,14 +378,9 @@ ul.visible { select(event.target); loadFolder(event, event.target); } - $$("a[name=loadfolder]").addEvent("click", foldercallback); {% endblock %} {% block middletitle %}{% trans "Webmail" %}{% endblock %} {% block leftcol %} -
-

{% trans "Folders" %}

- +
{% endblock %} diff --git a/extensions/webmail/templatetags/webextras.py b/extensions/webmail/templatetags/webextras.py index 2193cb17f..6afec6c47 100644 --- a/extensions/webmail/templatetags/webextras.py +++ b/extensions/webmail/templatetags/webextras.py @@ -95,8 +95,13 @@ def print_folders(folders): else: icon = "folder.png" result += "
  • \n" - result += "%s\n" \ - % (fd.has_key("path") and fd["path"] or fd["name"], fd["name"]) + label = fd["name"] + cssclass = "" + if fd.has_key("unseen"): + label += " (%d)" % fd["unseen"] + cssclass = "unseen" + result += "%s\n" \ + % (fd.has_key("path") and fd["path"] or fd["name"], cssclass, label) if fd.has_key("sub"): result += "\n" \ % (fd["path"], icon) diff --git a/lib/email_listing.py b/lib/email_listing.py index 8971d73be..fc8755b3a 100644 --- a/lib/email_listing.py +++ b/lib/email_listing.py @@ -105,9 +105,6 @@ class EmailListing: "page" : page }) - def getfolders(self): - return None - def fetch(self, request, id_start, id_stop): table = self.tbltype(self.mbc.fetch(start=id_start, stop=id_stop, folder=self.folder)) @@ -131,7 +128,6 @@ class EmailListing: "listing" : listing, "elapsed" : elapsed, "navbar" : self.render_navbar(page), - "folders" : self.getfolders(), "selection" : self.folder, "navparams" : self.navparams, "deflocation" : self.deflocation, "defcallback" : self.defcallback