diff --git a/extensions/amavis_quarantine/main.py b/extensions/amavis_quarantine/main.py index 3644d9a2d..0a8c55ce3 100644 --- a/extensions/amavis_quarantine/main.py +++ b/extensions/amavis_quarantine/main.py @@ -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") diff --git a/extensions/webmail/imap_listing.py b/extensions/webmail/imap_listing.py index 9deba6b0e..43e63cdfd 100644 --- a/extensions/webmail/imap_listing.py +++ b/extensions/webmail/imap_listing.py @@ -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) diff --git a/extensions/webmail/main.py b/extensions/webmail/main.py index 4ad2eb26c..83e7f189b 100644 --- a/extensions/webmail/main.py +++ b/extensions/webmail/main.py @@ -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(""" """).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})) diff --git a/extensions/webmail/templatetags/webextras.py b/extensions/webmail/templatetags/webextras.py index 395109983..3e2660ddc 100644 --- a/extensions/webmail/templatetags/webextras.py +++ b/extensions/webmail/templatetags/webextras.py @@ -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", diff --git a/lib/email_listing.py b/lib/email_listing.py index 37948cf24..8971d73be 100644 --- a/lib/email_listing.py +++ b/lib/email_listing.py @@ -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] +