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.
This commit is contained in:
tonio
2010-04-19 14:31:36 +02:00
parent 5ff96dfa8d
commit ffbb054089
9 changed files with 84 additions and 104 deletions
+37 -73
View File
@@ -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("""
<iframe width="100%" frameBorder="0" src="{{ url }}" id="mailcontent"></iframe>
""").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")
+6 -5
View File
@@ -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="<input type='checkbox' name='toggleselect' id='toggleselect' />")
_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)
@@ -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();
@@ -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",
-1
View File
@@ -8,6 +8,5 @@ urlpatterns = patterns('mailng.extensions.amavis_quarantine.main',
(r'^process/$', 'process'),
(r'^delete/(?P<mail_id>[\w\-\+]+)/$', 'delete'),
(r'^release/(?P<mail_id>[\w\-\+]+)/$', 'release'),
(r'^search/', 'search'),
(r'^(?P<mail_id>[\w\-\+]+)/$', 'viewmail'),
)
+4
View File
@@ -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
+3 -6
View File
@@ -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);
+3 -5
View File
@@ -2,11 +2,9 @@
{% for row in table.rows %}
<tr id="{{ row.id }}" class="{% cycle 'odd' 'even' %}">
{% for cell in row.cols %}
{% if cell.safe %}
<td width="{{ cell.width }}">{{ cell.value|safe }}</td>
{% else %}
<td width="{{ cell.width }}" class="{{ cell.class }}">{{ cell.value }}</td>
{% endif %}
<td width="{{ cell.width }}" align="{{ cell.align }}" class="{{ cell.class }}">
{% if cell.safe %}{{ cell.value|safe }}{% else %}{{ cell.value }}{% endif %}
</td>
{% endfor %}
</tr>
{% endfor %}
+1 -1
View File
@@ -2,7 +2,7 @@
<tr>
{% for c in table.columns %}
{% if c.sortable %}
<th id="{{ c.name }}" class="sortable" width="{{ c.width }}">
<th id="{{ c.name }}" class="sortable" width="{{ c.width }}" align="{{ c.align }}">
{% else %}
<th id="{{ c.name }}" width="{{ c.width }}">
{% endif %}