mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-18 05:51:26 +02:00
@@ -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):
|
||||
|
||||
@@ -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")
|
||||
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
{% load i18n %}
|
||||
{% load webextras %}
|
||||
<h3>{% trans "Folders" %}</h3>
|
||||
<ul>
|
||||
{% print_folders folders %}
|
||||
</ul>
|
||||
@@ -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 %}
|
||||
<div id="leftcol" class="box">
|
||||
<h3>{% trans "Folders" %}</h3>
|
||||
<ul>
|
||||
{% print_folders folders %}
|
||||
</ul>
|
||||
<div id="folders" class="box">
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
@@ -95,8 +95,13 @@ def print_folders(folders):
|
||||
else:
|
||||
icon = "folder.png"
|
||||
result += "<li class='droppable'>\n"
|
||||
result += "<a href='%s' name='loadfolder'>%s</a>\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 += "<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 += "<img name='%s' class='clickable' src='/static/pics/%s' />\n" \
|
||||
% (fd["path"], icon)
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user