From ffbb054089ba39f8f511df178a5e21d6d33ad657 Mon Sep 17 00:00:00 2001 From: tonio Date: Mon, 19 Apr 2010 14:31:36 +0200 Subject: [PATCH] Quarantine plugin update: All functions are back. Big refactoring of this module, the last thing that remains is the need of DB optimization for big tables. --- extensions/amavis_quarantine/main.py | 110 ++++++------------ extensions/amavis_quarantine/sql_listing.py | 11 +- .../amavis_quarantine/templates/index.html | 39 +++++-- .../templatetags/amextras.py | 4 +- extensions/amavis_quarantine/urls.py | 1 - lib/tables.py | 4 + static/js/common.js | 9 +- templates/common/table_body.html | 8 +- templates/common/table_head.html | 2 +- 9 files changed, 84 insertions(+), 104 deletions(-) diff --git a/extensions/amavis_quarantine/main.py b/extensions/amavis_quarantine/main.py index f2ba4d2d4..c50d88085 100644 --- a/extensions/amavis_quarantine/main.py +++ b/extensions/amavis_quarantine/main.py @@ -41,6 +41,13 @@ def menu(**kwargs): ] return [] +def __get_current_url(request): + res = "?page=%s" % request.session["page"] + for p in ["criteria", "pattern"]: + if p in request.session.keys(): + res += "&%s=%s" % (p, request.session[p]) + return res + @login_required def _listing(request, internal=False, filter=None): #start = time.time() @@ -50,6 +57,30 @@ def _listing(request, internal=False, filter=None): filter = ["&maddr.email='%s'" % mb.full_address] 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] + + if request.session.has_key("pattern"): + tmp = "" + for c in request.session["criteria"].split(','): + if tmp != "": + tmp += " OR " + tmp += "msgs.%s LIKE '%%%s%%'" % (c, request.session["pattern"]) + tmp = "&(%s)" % tmp + if filter is None: + filter = [tmp] + else: + filter += [tmp] + pageid = request.GET.has_key("page") and int(request.GET["page"]) or 1 request.session["page"] = pageid # ?? nécessaire lst = SQLlisting(filter, baseurl="listing/", empty=internal) @@ -70,44 +101,6 @@ def _listing(request, internal=False, filter=None): def index(request, message=None): return _listing(request, True) -# @login_required -# def getmailcontent(request, mail_id): -# from mailng.lib.email_listing import Email - -# conn = db.getconnection("amavis_quarantine") -# status, cursor = db.execute(conn, """ -# SELECT mail_text -# FROM quarantine -# WHERE quarantine.mail_id='%s' -# """ % mail_id) -# content = "" -# for part in cursor.fetchall(): -# content += part[0] -# msg = email.message_from_string(content) -# links = request.GET.has_key("links") and request.GET["links"] or "0" -# mode = request.GET.has_key("mode") and request.GET["mode"] or "plain" -# mail = Email(msg, mode, links) -# return mail.render(request) - -# @login_required -# def viewmail(request, mail_id): -# conn = db.getconnection("amavis_quarantine") -# status, cursor = db.execute(conn, """ -# SELECT mail_text -# FROM quarantine -# WHERE quarantine.mail_id='%s' -# """ % mail_id) -# content = "" -# for part in cursor.fetchall(): -# content += part[0] -# msg = email.message_from_string(content) -# ctx = getctx("ok", ) -# return _render(request, 'amavis_quarantine/viewmail.html', { -# "headers" : msg, "alert" : msg.get("X-Amavis-Alert"), -# "mail_id" : mail_id, "page_id" : request.session["page"], -# "params" : request.GET -# }) - @login_required def getmailcontent(request, mail_id): from mailng.lib.email_listing import Email @@ -141,7 +134,8 @@ def viewmail(request, mail_id): content = Template(""" """).render(Context({"url" : reverse(getmailcontent, args=[mail_id]) + args})) - menu = viewm_menu("", request.session, mail_id, request.user.get_all_permissions()) + menu = viewm_menu("", __get_current_url(request), mail_id, + request.user.get_all_permissions()) ctx = getctx("ok", menu=menu, listing=content) return HttpResponse(simplejson.dumps(ctx), mimetype="application/json") @@ -181,7 +175,7 @@ def delete(request, mail_id, count=1): count) % {"count" : count} else: message = error - ctx = getctx("ok", url="?page=%s" % request.session["page"], message=message) + ctx = getctx("ok", url=__get_current_url(request), message=message) return HttpResponse(simplejson.dumps(ctx), mimetype="application/json") @@ -217,53 +211,23 @@ WHERE msgrcpt.mail_id=msgs.mail_id AND msgrcpt.rid=maddr.id AND msgs.mail_id IN count) % {"count" : count} else: message = error - ctx = getctx("ok", url="?page=%s" % request.session["page"], message=message) + ctx = getctx("ok", url=__get_current_url(request), message=message) return HttpResponse(simplejson.dumps(ctx), mimetype="application/json") @login_required def process(request): ids = "" - count = len(request.POST.getlist("selection")) - for id in request.POST.getlist("selection"): + count = len(request.POST["selection"].split(",")) + for id in request.POST["selection"].split(","): if ids != "": ids += "," ids += "'%s'" % id if ids == "": return HttpResponseRedirect(reverse(index)) - print "Ok c pas vide" if request.POST["action"] == "release": return release(request, ids, count) if request.POST["action"] == "delete": return delete(request, ids, count) - -@login_required -def search(request): - if not request.GET.has_key("pattern"): - return - if request.GET.has_key("criteria"): - criteria = request.GET["criteria"].split(',') - else: - criteria = ["from_addr"] - filter = "" - pattern = re.escape(request.GET["pattern"]) - for c in criteria: - if filter != "": - filter += " OR " - filter += "msgs.%s LIKE '%%%s%%'" % (c, pattern) - filter = "&(%s)" % filter - return _listing(request, filter=filter) - -# lst = SQLlisting([filter]) - -# page = lst.paginator.getpage(1) -# if page: -# content = lst.fetch(page.id_start, page.id_stop).render(request) -# navbar = lst.render_navbar(page) -# else: -# content = "Empty quarantine" -# navbar = "" -# ctx = {"status" : "ok", "listing" : content, "navbar" : navbar} -# return HttpResponse(simplejson.dumps(ctx), mimetype="application/json") diff --git a/extensions/amavis_quarantine/sql_listing.py b/extensions/amavis_quarantine/sql_listing.py index d7f83f1d0..456d8c413 100644 --- a/extensions/amavis_quarantine/sql_listing.py +++ b/extensions/amavis_quarantine/sql_listing.py @@ -8,11 +8,12 @@ from mailng.lib.email_listing import MBconnector, EmailListing class Qtable(tables.Table): tableid = "emails" idkey = "mailid" - selection = tables.SelectionColumn("selection", first=True) - type = tables.Column("type", label=_("Type")) - from_ = tables.Column("from", label=_("From")) - subject = tables.Column("subject", label=_("Subject")) - time = tables.Column("date", label=_("Date")) + #selection = tables.SelectionColumn("selection", first=True) + _1_type = tables.Column("type", align="center", width="30px", + label="") + _2_from_ = tables.Column("from", label=_("From")) + _3_subject = tables.Column("subject", label=_("Subject")) + _4_time = tables.Column("date", label=_("Date")) def parse_date(self, value): return datetime.fromtimestamp(value) diff --git a/extensions/amavis_quarantine/templates/index.html b/extensions/amavis_quarantine/templates/index.html index bd95702b6..ed01a00c6 100644 --- a/extensions/amavis_quarantine/templates/index.html +++ b/extensions/amavis_quarantine/templates/index.html @@ -28,10 +28,21 @@ thead tr { position: relative; z-index: 1; } + +tr.table-tr-selected { + background: #ffffcc; +} {% endblock %} {% block js %} mysubmit = function(event, name) { event.stop(); + var selection = new Array(); + $$("tr[class*=table-tr-selected]").each(function(item) { + selection.push(item.get("id")); + }); + new Element("input", { + "type" : "hidden", "name" : "selection", "value" : selection + }).inject($("listingform"), "top"); new Element('input', { 'type' : 'hidden', 'name' : "action", style: "display:none", 'value' : name }).inject($("listingform"), "top"); @@ -65,21 +76,34 @@ thead tr { register_callback("_listing", function(resp) { updatelisting(resp); + + tbl = new HtmlTable($("emails"), { + selectable: true + }); + if ($("toggleselect")) { + $("toggleselect").addEvent("click", function(evt) { + if ($$("tr[class*=table-tr-selected]").length) { + tbl.selectNone(); + } else { + tbl.selectAll(); + } + }); + } $$("a[name=release]").addEvent("click", function(event) { - if (!checkSelection("selection", "{% trans "Release this selection?" %}")) { + if (!checkTableSelection("{% trans "Release this selection?" %}")) { event.stop(); return; } mysubmit(event, "release"); }); $$("a[name=delete]").addEvent("click", function(event) { - if (!checkSelection("selection", "{% trans "Delete this selection?" %}")) { + if (!checkTableSelection("{% trans "Delete this selection?" %}")) { event.stop(); return; } mysubmit(event, "delete"); }); - + var myFx = new Fx.Slide($("searchparams")); myFx.hide(); $("searchopts").addEvent("click", function(event) { @@ -95,18 +119,11 @@ thead tr { $$("input[name=scriteria]:checked").each(function(obj) { criteria = obj.value; }); - var url = "search" + var url = "listing" + "?pattern=" + $("searchfield").value + "&criteria=" + criteria; current_anchor.parse_string(url, true).setparams(navparams); current_anchor.update(); - - /*new Request.JSON({url: "{{ s_url }}", onSuccess: function(resp) { - $("listing").set("html", resp.listing); - $("navbar").set("html", resp.navbar); - {% url extensions.amavis_quarantine.main.viewmail as view_url %} - bindRows("{{ view_url }}", "{{ current_page }}"); - }}).get({"pattern" : $("searchfield").value, "criteria" : criteria});*/ }); $("searchfield").addEvent("click", function(event) { $("searchfield").select(); diff --git a/extensions/amavis_quarantine/templatetags/amextras.py b/extensions/amavis_quarantine/templatetags/amextras.py index 62cf4b7e1..b71b3e908 100644 --- a/extensions/amavis_quarantine/templatetags/amextras.py +++ b/extensions/amavis_quarantine/templatetags/amextras.py @@ -7,7 +7,7 @@ from mailng.extensions import amavis_quarantine register = template.Library() @register.simple_tag -def viewm_menu(selection, session, mail_id, perms): +def viewm_menu(selection, backurl, mail_id, perms): options_menu = [ {"name" : "viewmode", "label" : _("View as plain text"), @@ -22,7 +22,7 @@ def viewm_menu(selection, session, mail_id, perms): entries = [ {"name" : "back", - "url" : "?page=%s" % session["page"], + "url" : backurl, "img" : "/static/pics/back.png", "label" : _("Back to list")}, {"name" : "headers", diff --git a/extensions/amavis_quarantine/urls.py b/extensions/amavis_quarantine/urls.py index 303885bda..22dc36b70 100644 --- a/extensions/amavis_quarantine/urls.py +++ b/extensions/amavis_quarantine/urls.py @@ -8,6 +8,5 @@ urlpatterns = patterns('mailng.extensions.amavis_quarantine.main', (r'^process/$', 'process'), (r'^delete/(?P[\w\-\+]+)/$', 'delete'), (r'^release/(?P[\w\-\+]+)/$', 'release'), - (r'^search/', 'search'), (r'^(?P[\w\-\+]+)/$', 'viewmail'), ) diff --git a/lib/tables.py b/lib/tables.py index 6d64b8bb2..3a14cdc15 100644 --- a/lib/tables.py +++ b/lib/tables.py @@ -60,6 +60,10 @@ class Table(object): newcol["width"] = getattr(c, "width") except AttributeError: pass + try: + newcol["align"] = getattr(c, "align") + except: + pass if isinstance(c, SelectionColumn): newcol["value"] = c.render(row[self.idkey]) newcol["safe"] = True diff --git a/static/js/common.js b/static/js/common.js index 4f9be35e5..bbfde31a8 100644 --- a/static/js/common.js +++ b/static/js/common.js @@ -39,7 +39,7 @@ check_anchor = function() { new Request.JSON({url: query, onSuccess: function(resp) { callback = ($defined(resp.callback)) ? resp.callback : "default"; callbacks[callback](resp); - infobox.notice("Done"); + infobox.notice("Done"); infobox.hide(1); }}).get(); } @@ -268,11 +268,8 @@ toggleSelection = function(id, value) { }); } -checkSelection = function(id, text) { - var getout = $$("input[name=" + id + "]").every(function(item, index) { - return item.checked == false; - }); - if (getout) { +checkTableSelection = function(text) { + if (!$$("tr[class*=table-tr-selected]").length) { return false; } return confirm(text); diff --git a/templates/common/table_body.html b/templates/common/table_body.html index 425f5d962..f46156ebd 100644 --- a/templates/common/table_body.html +++ b/templates/common/table_body.html @@ -2,11 +2,9 @@ {% for row in table.rows %} {% for cell in row.cols %} - {% if cell.safe %} - {{ cell.value|safe }} - {% else %} - {{ cell.value }} - {% endif %} + + {% if cell.safe %}{{ cell.value|safe }}{% else %}{{ cell.value }}{% endif %} + {% endfor %} {% endfor %} diff --git a/templates/common/table_head.html b/templates/common/table_head.html index 9c70f8c89..7599d54cf 100644 --- a/templates/common/table_head.html +++ b/templates/common/table_head.html @@ -2,7 +2,7 @@ {% for c in table.columns %} {% if c.sortable %} - + {% else %} {% endif %}