diff --git a/modoboa/extensions/amavis/lib.py b/modoboa/extensions/amavis/lib.py index 266503351..7e3d3edc7 100644 --- a/modoboa/extensions/amavis/lib.py +++ b/modoboa/extensions/amavis/lib.py @@ -87,6 +87,7 @@ class QuarantineNavigationParameters(NavigationParameters): super(QuarantineNavigationParameters, self).__init__( request, 'quarantine_navparams' ) + self.parameters += [('msgtype', None, False)] def back_to_listing(self): """Return the current listing URL. diff --git a/modoboa/extensions/amavis/sql_listing.py b/modoboa/extensions/amavis/sql_listing.py index ae43fd99d..ffa5e3933 100644 --- a/modoboa/extensions/amavis/sql_listing.py +++ b/modoboa/extensions/amavis/sql_listing.py @@ -19,7 +19,7 @@ class Qtable(tables.Table): idkey = "mailid" type = tables.Column( - "type", align="center", width="30px", sort_order="type" + "type", align="center", width="30px", sort_order="type", safe=True ) score = tables.Column("score", label=ugettext_lazy("Score"), limit=6, sort_order="score") @@ -33,6 +33,13 @@ class Qtable(tables.Table): cols_order = [] + def parse_type(self, value): + if value in ['S', 'V']: + color = 'important' + else: + color = 'warning' + return '%s' % (color, value) + def parse_date(self, value): return datetime.fromtimestamp(value) diff --git a/modoboa/extensions/amavis/static/amavis/css/quarantine.css b/modoboa/extensions/amavis/static/amavis/css/quarantine.css index 6302936d9..a343229f4 100644 --- a/modoboa/extensions/amavis/static/amavis/css/quarantine.css +++ b/modoboa/extensions/amavis/static/amavis/css/quarantine.css @@ -27,11 +27,20 @@ color: #0088cc; } +#filters_bar { + /*padding-top: 5px;*/ + padding-left: 15px; +} + thead tr { position: relative; z-index: 1; } +td[name=type] span { + cursor: pointer; +} + td.unseen { font-weight: bold; } diff --git a/modoboa/extensions/amavis/static/amavis/js/quarantine.js b/modoboa/extensions/amavis/static/amavis/js/quarantine.js index 04f7f233f..4d6342774 100644 --- a/modoboa/extensions/amavis/static/amavis/js/quarantine.js +++ b/modoboa/extensions/amavis/static/amavis/js/quarantine.js @@ -17,6 +17,25 @@ Quarantine.prototype = { this.register_navcallbacks(); this.listen(); + this.set_msgtype(); + + $("#searchfield").searchbar({navobj: this.navobj}); + }, + + /* + * Activate the button corresponding to the current message type + * filter. If no message type is found, the 'All' button is + * selected. + */ + set_msgtype: function() { + var msgtype = this.navobj.getparam('msgtype'); + + $("button[name*=msgtype]").removeClass('active'); + if (msgtype != undefined) { + $("button[name=msgtype_" + msgtype + "]").addClass('active'); + } else { + $("button[name=msgtype_all]").addClass('active'); + } }, update_page: function(data) { @@ -47,11 +66,13 @@ Quarantine.prototype = { $(document).on("click", "a[name=release]", $.proxy(this.release, this)); $(document).on("click", "a[name=delete]", $.proxy(this.delete, this)); $(document).on("click", "a[name=headers]", $.proxy(this.headers, this)); + $(document).on("click", "td[name=type] span", $.proxy(this.filter_by_type, this)); + $(document).on("click", "#filters button", $.proxy(this.filter_by_type, this)); }, load_page: function(e) { Listing.prototype.load_page.apply(this, arguments); - this.navobj.delparam("rcpt"); + this.navobj.delparam("rcpt").update(); }, view_requests: function(e) { @@ -81,12 +102,26 @@ Quarantine.prototype = { } $("td[name=type]").each(function() { var $this = $(this); - if ($this.html().trim() == type) { + if ($this.find('span').html().trim() == type) { $("#emails").htmltable("select_row", $this.parent()); } }); }, + /* + * Filter listing by message type (spam, virus, etc.) + */ + filter_by_type: function(evt) { + var msgtype = $(evt.target).html().trim(); + + if (msgtype != 'All') { + this.navobj.setparam('msgtype', msgtype); + } else { + this.navobj.delparam('msgtype'); + } + this.navobj.update(); + }, + _send_selection: function(e, name, message) { var $link = $(e.target); @@ -194,6 +229,8 @@ Quarantine.prototype = { listing_cb: function(data) { this.update_page(data); + this.navobj.delparam("rcpt").update(); + this.set_msgtype(); $("#emails").htmltable(); this.htmltable = $("#emails").data("htmltable"); }, diff --git a/modoboa/extensions/amavis/templates/amavis/index.html b/modoboa/extensions/amavis/templates/amavis/index.html index 904119c73..1e1205a0d 100644 --- a/modoboa/extensions/amavis/templates/amavis/index.html +++ b/modoboa/extensions/amavis/templates/amavis/index.html @@ -1,4 +1,4 @@ -{% extends "fixed.html" %}{% load i18n %} +{% extends "fixed.html" %}{% load i18n amavis_tags %} {% block pagetitle %}{% trans "Quarantine management" %}{% endblock %} {% block html_head %} @@ -19,6 +19,6 @@ $(document).ready(function() { {% endblock %} {% block fixed_content %} - +
{% endblock %} diff --git a/modoboa/extensions/amavis/templates/amavis/main_action_bar.html b/modoboa/extensions/amavis/templates/amavis/main_action_bar.html new file mode 100644 index 000000000..5c419d067 --- /dev/null +++ b/modoboa/extensions/amavis/templates/amavis/main_action_bar.html @@ -0,0 +1,13 @@ +{% extends "common/buttons_list.html" %}{% load i18n %} +{% block extracontent %}{% include "common/email_searchbar.html" with extraopts=extraopts %} + +
+
+ + + + + + +
+{% endblock %} diff --git a/modoboa/extensions/amavis/templatetags/amavis_tags.py b/modoboa/extensions/amavis/templatetags/amavis_tags.py index ab75ef7f1..3c12e2149 100644 --- a/modoboa/extensions/amavis/templatetags/amavis_tags.py +++ b/modoboa/extensions/amavis/templatetags/amavis_tags.py @@ -3,6 +3,7 @@ from django.template.loader import render_to_string from django.utils.translation import ugettext as _ from django.core.urlresolvers import reverse from django.conf import settings +from modoboa.lib.webutils import _render_to_string register = template.Library() @@ -103,11 +104,8 @@ def quar_menu(user): extraopts = [{"name": "to", "label": _("To")}] else: extraopts = [] - extracontent = render_to_string('common/email_searchbar.html', { - "STATIC_URL": settings.STATIC_URL, - "extraopts": extraopts + + return render_to_string('amavis/main_action_bar.html', { + 'entries': entries, 'extraopts': extraopts, + 'STATIC_URL': settings.STATIC_URL, 'extraclasses': 'pull-left' }) - - return render_to_string('common/buttons_list.html', dict( - entries=entries, extracontent=extracontent - )) diff --git a/modoboa/extensions/amavis/views.py b/modoboa/extensions/amavis/views.py index 7b136740c..e201a4fcb 100644 --- a/modoboa/extensions/amavis/views.py +++ b/modoboa/extensions/amavis/views.py @@ -26,8 +26,7 @@ from .models import Msgrcpt def empty_quarantine(request): content = "
%s
" % _("Empty quarantine") - ctx = getctx("ok", level=2, listing=content, paginbar="", - menu=quar_menu(request.user)) + ctx = getctx("ok", level=2, listing=content, paginbar="") return HttpResponse(simplejson.dumps(ctx), mimetype="application/json") @@ -60,6 +59,11 @@ def _listing(request): raise Exception("unsupported search criteria %s" % c) flt = nfilter if flt is None else flt | nfilter + msgtype = navparams.get('msgtype', None) + if msgtype is not None: + nfilter = Q(mail__msgrcpt__content=msgtype) + flt = flt | nfilter if flt is not None else nfilter + msgs = get_wrapper().get_mails(request, rcptfilter) page = navparams.get('page') lst = SQLlisting( @@ -73,8 +77,10 @@ def _listing(request): content = lst.fetch(request, page.id_start, page.id_stop) paginbar = pagination_bar(page) - ctx = getctx("ok", listing=content, paginbar=paginbar, page=page.number, - menu=quar_menu(request.user)) + ctx = getctx("ok", listing=content, paginbar=paginbar, page=page.number) + if request.session.get('location', 'listing') != 'listing': + ctx['menu'] = quar_menu(request.user) + request.session['location'] = 'listing' return HttpResponse(simplejson.dumps(ctx), mimetype="application/json") @@ -147,6 +153,7 @@ def viewmail(request, mail_id): """).render(Context({"url": reverse(getmailcontent, args=[mail_id])})) menu = viewm_menu(request.user, mail_id, rcpt) ctx = getctx("ok", menu=menu, listing=content) + request.session['location'] = 'viewmail' return HttpResponse(simplejson.dumps(ctx), mimetype="application/json") diff --git a/modoboa/extensions/webmail/lib.py b/modoboa/extensions/webmail/lib.py index 05dc1c1d7..dda374d07 100644 --- a/modoboa/extensions/webmail/lib.py +++ b/modoboa/extensions/webmail/lib.py @@ -756,4 +756,4 @@ class WebmailNavigationParameters(NavigationParameters): request, 'webmail_navparams' ) if defmailbox is not None: - self.parameters += [('mbox', defmailbox)] + self.parameters += [('mbox', defmailbox, False)] diff --git a/modoboa/extensions/webmail/templates/webmail/main_action_bar.html b/modoboa/extensions/webmail/templates/webmail/main_action_bar.html new file mode 100644 index 000000000..53bc27df1 --- /dev/null +++ b/modoboa/extensions/webmail/templates/webmail/main_action_bar.html @@ -0,0 +1,3 @@ +{% extends "common/buttons_list.html" %}{% load i18n %} +{% block extracontent %}{% include "common/email_searchbar.html" with extraopts=extraopts %} +{% endblock %} diff --git a/modoboa/extensions/webmail/templatetags/webmail_tags.py b/modoboa/extensions/webmail/templatetags/webmail_tags.py index 93006390b..3ac199460 100644 --- a/modoboa/extensions/webmail/templatetags/webmail_tags.py +++ b/modoboa/extensions/webmail/templatetags/webmail_tags.py @@ -114,13 +114,10 @@ def listmailbox_menu(selection, folder, user): "label": _("Empty folder"), "url": reverse(webmail.views.empty, args=[folder])} ] - searchbar = render_to_string('common/email_searchbar.html', { - "STATIC_URL": settings.STATIC_URL + return render_to_string('webmail/main_action_bar.html', { + 'selection': selection, 'entries': entries, 'user': user, 'css': "nav", + 'STATIC_URL': settings.STATIC_URL }) - return render_to_string('common/buttons_list.html', dict( - selection=selection, entries=entries, extracontent=searchbar, - user=user, css="nav" - )) @register.simple_tag diff --git a/modoboa/lib/webutils.py b/modoboa/lib/webutils.py index 2d9f410a1..23e260da8 100644 --- a/modoboa/lib/webutils.py +++ b/modoboa/lib/webutils.py @@ -172,7 +172,8 @@ class NavigationParameters(object): def __init__(self, request, sessionkey): self.request = request self.sessionkey = sessionkey - self.parameters = [('pattern', ''), ('criteria', 'from_addr')] + self.parameters = [('pattern', '', True), + ('criteria', 'from_addr', False)] def store(self): """Store navigation parameters into session. @@ -182,8 +183,13 @@ class NavigationParameters(object): navparams = self.request.session[self.sessionkey] navparams["order"] = self.request.GET.get("sort_order", "-date") navparams["page"] = int(self.request.GET.get("page", 1)) - for param, defvalue in self.parameters: - navparams[param] = re.escape(self.request.GET.get(param, defvalue)) + for param, defvalue, escape in self.parameters: + value = self.request.GET.get(param, defvalue) + if value is None: + if param in navparams: + del navparams[param] + continue + navparams[param] = re.escape(value) if escape else value def get(self, param, default_value=None): """Retrieve a navigation parameter. diff --git a/modoboa/static/css/custom.css b/modoboa/static/css/custom.css index 6e335a80c..51f53fe4a 100644 --- a/modoboa/static/css/custom.css +++ b/modoboa/static/css/custom.css @@ -116,3 +116,8 @@ body { .table-fixed { table-layout: fixed; } + +.menubar-text { + display: inline; + vertical-align: middle; +} \ No newline at end of file diff --git a/modoboa/static/js/listing.js b/modoboa/static/js/listing.js index c5831f9fb..8edc63e04 100644 --- a/modoboa/static/js/listing.js +++ b/modoboa/static/js/listing.js @@ -30,7 +30,7 @@ Listing.prototype = { e.preventDefault(); }); } - if (data.page != this.navobj.getparam("page")) { + if (data.page && data.page != this.navobj.getparam("page")) { this.navobj.setparam("page", data.page).update(false, true); } var $sortables = $(this.options.sortable_selector); diff --git a/modoboa/templates/common/buttons_list.html b/modoboa/templates/common/buttons_list.html index ea5af9b28..29cf3132e 100644 --- a/modoboa/templates/common/buttons_list.html +++ b/modoboa/templates/common/buttons_list.html @@ -7,5 +7,6 @@ {% endfor %} {% else %}{% render_link entry "btn" %}{% endif %}
-{% endfor %}{{ extracontent }} +{% endfor %}{% block extracontent %}{% endblock %} +