This commit is contained in:
tonio
2010-04-23 18:17:07 +02:00
parent 4624eef6eb
commit b91b78847b
5 changed files with 65 additions and 33 deletions
+2 -18
View File
@@ -21,6 +21,7 @@ from mailng.lib import db
from mailng.admin.models import Mailbox
from lib import AMrelease
from templatetags.amextras import *
from mailng.lib.email_listing import parse_search_parameters
from sql_listing import *
def init():
@@ -68,17 +69,7 @@ def _listing(request, internal=False, filter=None):
else:
filter += ["&maddr.email='%s'" % mb.full_address]
if request.GET.has_key("pattern"):
request.session["pattern"] = re.escape(request.GET["pattern"])
if request.GET.has_key("criteria"):
request.session["criteria"] = request.GET["criteria"]
else:
request.session["criteria"] = ["from_addr"]
else:
for p in ["pattern", "criteria"]:
if p in request.session.keys():
del request.session[p]
parse_search_parameters(request)
if request.session.has_key("pattern"):
tmp = ""
for c in request.session["criteria"].split(','):
@@ -165,13 +156,6 @@ WHERE quarantine.mail_id='%s'
"headers" : msg.items()
})
def _redirect_to_index(request, message, count):
request.user.message_set.create(message=message)
if count > 1:
return
page = request.GET.has_key("page") and request.GET["page"] or "1"
return HttpResponseRedirect(reverse(index) + "?page=%s" % page)
@login_required
def delete(request, mail_id, count=1):
conn = db.getconnection("amavis_quarantine")
+25 -3
View File
@@ -122,6 +122,7 @@ class IMAPconnector(object):
__metaclass__ = Singleton
def __init__(self, request=None, user=None, password=None):
self.criterions = []
self.address = parameters.get("webmail", "IMAP_SERVER")
self.port = int(parameters.get("webmail", "IMAP_PORT"))
if request:
@@ -172,11 +173,10 @@ class IMAPconnector(object):
criterion = "REVERSE %s" % criterion
else:
criterion = "REVERSE DATE"
print criterion
folder = kwargs.has_key("folder") and kwargs["folder"] or None
(status, data) = self.m.select(self._encodefolder(folder))
(status, data) = self.m.sort("(%s)" % criterion, "UTF-8", "(NOT DELETED)")
(status, data) = self.m.sort("(%s)" % criterion, "UTF-8", "(NOT DELETED)",
*self.criterions)
self.messages = data[0].split()
return len(self.messages)
@@ -257,6 +257,11 @@ class ImapListing(EmailListing):
def __init__(self, user, password, **kwargs):
self.mbc = IMAPconnector(user=user, password=password)
if kwargs.has_key("pattern"):
self.parse_search_parameters(kwargs["criteria"],
kwargs["pattern"])
if kwargs.has_key("reset"):
self.mbc.criterions = []
EmailListing.__init__(self, **kwargs)
def getfolders(self):
@@ -270,6 +275,23 @@ class ImapListing(EmailListing):
md_folders += [{"name" : fd}]
return md_folders
def parse_search_parameters(self, criterion, pattern):
def or_criterion(old, c):
if old == "":
return c
return "OR (%s) (%s)" % (old, c)
criterions = ""
for c in criterion.split(','):
if c == "from_addr":
key = "FROM"
elif c == "subject":
key = "SUBJECT"
else:
continue
criterions = or_criterion(criterions, '%s "%s"' % (key, pattern))
self.mbc.criterions = ["(%s)" % criterions]
class ImapEmail(Email):
def __init__(self, msg, addrfull=False, **kwargs):
Email.__init__(self, msg, **kwargs)
+21 -7
View File
@@ -14,7 +14,7 @@ from mailng.lib import events, parameters, _render, _render_error, getctx
from imap_listing import *
from forms import *
from templatetags.webextras import *
from imap_listing import ImapEmail
from lib.email_listing import parse_search_parameters
def init():
events.register("UserMenuDisplay", menu)
@@ -34,7 +34,6 @@ def init():
parameters.register("webmail", "SMTP_SECURED", "list_yesno", "no",
help=_("Use a secured connection to access SMTP server"))
def urls():
return (r'^mailng/webmail/',
include('mailng.extensions.webmail.urls'))
@@ -48,6 +47,13 @@ def menu(**kwargs):
"img" : "/static/pics/webmail.png"}
]
def __get_current_url(request):
res = "%s?page=%s" % (request.session["folder"], request.session["page"])
for p in ["criteria", "pattern", "order"]:
if p in request.session.keys():
res += "&%s=%s" % (p, request.session[p])
return res
def userlogin(**kwargs):
kwargs["request"].session["password"] = kwargs["password"]
@@ -64,12 +70,20 @@ def folder(request, name, updatenav=True):
request.session["page"] = pageid
if order:
request.session["navparams"]["order"] = order
parse_search_parameters(request)
else:
# Internal usage
order = request.session["navparams"]["order"]
optparams = {}
if request.session.has_key("pattern"):
optparams["pattern"] = request.session["pattern"]
optparams["criteria"] = request.session["criteria"]
else:
optparams["reset"] = True
lst = ImapListing(request.user.username, request.session["password"],
baseurl=name, folder=name, order=order)
baseurl=name, folder=name, order=order, **optparams)
page = lst.paginator.getpage(request.session["page"])
if page:
content = lst.fetch(request, page.id_start, page.id_stop)
@@ -106,7 +120,7 @@ def viewmail(request, folder, mail_id=None):
content = Template("""
<iframe width="100%" frameBorder="0" src="{{ url }}" id="mailcontent"></iframe>
""").render(Context({"url" : reverse(getmailcontent, args=[folder, mail_id])}))
menu = viewm_menu("", request.session, mail_id,
menu = viewm_menu("", __get_current_url(request), folder, mail_id,
request.user.get_all_permissions())
ctx = getctx("ok", menu=menu, listing=content)
return HttpResponse(simplejson.dumps(ctx), mimetype="application/json")
@@ -175,7 +189,8 @@ def empty(request, name):
return folder(request, name, False)
def render_compose(request, form, posturl, bodyheader=None, body=None):
menu = compose_menu("", request.session, request.user.get_all_permissions())
menu = compose_menu("", __get_current_url(request),
request.user.get_all_permissions())
content = render_to_string("webmail/compose.html", {
"form" : form, "bodyheader" : bodyheader, "body" : body,
"posturl" : posturl
@@ -210,8 +225,7 @@ def send_mail(request, withctx=False):
s.login(request.user.username, request.session["password"])
s.sendmail(msg['From'], rcpts, msg.as_string())
s.quit()
ctx = getctx("ok", url="%s?page=%s" % (request.session["folder"],
request.session["page"]))
ctx = getctx("ok", url=__get_current_url(request))
else:
ctx = getctx("ko", level=2, listing=render_to_string("webmail/compose.html",
{"form" : form}))
+5 -5
View File
@@ -24,10 +24,10 @@ def backurl(session, **kwargs):
return res
@register.simple_tag
def viewm_menu(selection, session, mail_id, perms):
def viewm_menu(selection, backurl, folder, mail_id, perms):
entries = [
{"name" : "back",
"url" : "%s?page=%s" % (session["folder"], session["page"]),
"url" : backurl,
"img" : "/static/pics/back.png",
"label" : _("Back")},
{"name" : "reply",
@@ -44,7 +44,7 @@ def viewm_menu(selection, session, mail_id, perms):
"label" : _("Forward")},
{"name" : "delete",
"img" : "/static/pics/remove.png",
"url" : reverse(webmail.main.delete, args=[session["folder"], mail_id]),
"url" : reverse(webmail.main.delete, args=[folder, mail_id]),
"label" : _("Delete")},
]
@@ -53,10 +53,10 @@ def viewm_menu(selection, session, mail_id, perms):
"perms" : perms})
@register.simple_tag
def compose_menu(selection, session, perms):
def compose_menu(selection, backurl, perms):
entries = [
{"name" : "back",
"url" : "%s?page=%s" % (session["folder"], session["page"]),
"url" : backurl,
"img" : "/static/pics/back.png",
"label" : _("Back")},
{"name" : "sendmail",
+12
View File
@@ -227,3 +227,15 @@ class Email(object):
body = Template(decode(body)).render({})
return (False, body)
def parse_search_parameters(request):
if request.GET.has_key("pattern"):
request.session["pattern"] = re.escape(request.GET["pattern"])
if request.GET.has_key("criteria"):
request.session["criteria"] = request.GET["criteria"]
else:
request.session["criteria"] = ["from_addr"]
else:
for p in ["pattern", "criteria"]:
if p in request.session.keys():
del request.session[p]