mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-18 05:51:26 +02:00
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:
@@ -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")
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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'),
|
||||
)
|
||||
|
||||
@@ -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
@@ -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);
|
||||
|
||||
@@ -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 %}
|
||||
|
||||
@@ -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 %}
|
||||
|
||||
Reference in New Issue
Block a user