From 8e9d8aef3bec9b132fccf20da209388d59db73a9 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Sat, 7 Apr 2012 17:44:09 +0200 Subject: [PATCH] New simple poller that checks every 2s. if there are new pending release requests. If that's the case, the top notification box is updated. fixes #227 --- extensions/amavis_quarantine/__init__.py | 55 ++++++++++++++++-------- extensions/amavis_quarantine/lib.py | 15 +++++++ extensions/amavis_quarantine/urls.py | 1 + extensions/amavis_quarantine/views.py | 10 ++++- extensions/postfix_autoreply/__init__.py | 4 +- lib/templatetags/libextras.py | 9 ++++ static/css/custom.css | 4 ++ templates/nlayout.html | 1 + templates/userprefs/preferences.html | 1 - 9 files changed, 75 insertions(+), 25 deletions(-) diff --git a/extensions/amavis_quarantine/__init__.py b/extensions/amavis_quarantine/__init__.py index 86bfd4560..29a71dba1 100644 --- a/extensions/amavis_quarantine/__init__.py +++ b/extensions/amavis_quarantine/__init__.py @@ -6,6 +6,7 @@ Amavis quarantine manager (SQL based) """ from django.utils.translation import ugettext_noop as _, ugettext from django.core.urlresolvers import reverse +from django.template import Template, Context from modoboa.lib import events, parameters baseurl = "quarantine" @@ -95,29 +96,45 @@ def remove_user_record(mailbox): Users.objects.get(email=mailbox.full_address).delete() +@events.observe("GetStaticContent") +def extra_static_content(): + tpl = Template("""""") + url = reverse("modoboa.extensions.amavis_quarantine.views.nbrequests") + return [tpl.render(Context(dict(url=url)))] + @events.observe("TopNotifications") def display_requests(user): - from models import Msgrcpt - from django.db.models import Q - from django.template import Template, Context + from lib import get_nb_requests if parameters.get_admin("USER_CAN_RELEASE") == "yes" \ or user.group == "SimpleUsers": return [] + nbrequests = get_nb_requests(user) - rq = Q(rs='p') - if not user.is_superuser: - doms = user.get_domains() - regexp = "(%s)" % '|'.join(map(lambda dom: dom.name, doms)) - doms_q = Q(rid__email__regex=regexp) - rp &= doms_q - - nbrequests = len(Msgrcpt.objects.filter(rq)) - if nbrequests > 0: - url = reverse("modoboa.extensions.amavis_quarantine.views.index") - url += "#listing/?viewrequests=1" - tpl = Template('
{{ label }}
') - return [tpl.render(Context(dict( - label=_("%d pending requests" % nbrequests), url=url - )))] - return [] + url = reverse("modoboa.extensions.amavis_quarantine.views.index") + url += "#listing/?viewrequests=1" + tpl = Template('
{{ label }}
') + css = "hidden" if nbrequests == 0 else "" + return [tpl.render(Context(dict( + label=_("%d pending requests" % nbrequests), url=url, css=css + )))] diff --git a/extensions/amavis_quarantine/lib.py b/extensions/amavis_quarantine/lib.py index 211ca0f24..20ec94177 100644 --- a/extensions/amavis_quarantine/lib.py +++ b/extensions/amavis_quarantine/lib.py @@ -5,7 +5,9 @@ import struct import string from functools import wraps from django.core.urlresolvers import reverse +from django.db.models import Q from modoboa.lib import parameters +from models import Msgrcpt def selfservice(ssfunc=None): """Decorator used to expose views to the 'self-service' feature @@ -30,6 +32,19 @@ def selfservice(ssfunc=None): return wrapped_f return decorator +def get_nb_requests(user): + """Return the number of current pending requests + + :param user: a ``User`` instance + """ + rq = Q(rs='p') + if not user.is_superuser: + doms = user.get_domains() + regexp = "(%s)" % '|'.join(map(lambda dom: dom.name, doms)) + doms_q = Q(rid__email__regex=regexp) + rp &= doms_q + return len(Msgrcpt.objects.filter(rq)) + class AMrelease(object): def __init__(self): mode = parameters.get_admin("AM_PDP_MODE") diff --git a/extensions/amavis_quarantine/urls.py b/extensions/amavis_quarantine/urls.py index 80ef0138c..ad9bd0a7a 100644 --- a/extensions/amavis_quarantine/urls.py +++ b/extensions/amavis_quarantine/urls.py @@ -6,6 +6,7 @@ urlpatterns = patterns( (r'^listing/$', '_listing'), (r'^getmailcontent/(?P[\w\-\+]+)/$', 'getmailcontent'), (r'^process/$', 'process'), + (r'^nbrequests/$', 'nbrequests'), (r'^delete/(?P[\w\-\+]+)/$', 'delete'), (r'^release/(?P[\w\-\+]+)/$', 'release'), (r'^(?P[\w\-\+]+)/$', 'viewmail'), diff --git a/extensions/amavis_quarantine/views.py b/extensions/amavis_quarantine/views.py index db4f63315..cfd378cc9 100644 --- a/extensions/amavis_quarantine/views.py +++ b/extensions/amavis_quarantine/views.py @@ -6,13 +6,13 @@ from django.utils import simplejson from django.utils.translation import ugettext as _, ungettext from django.core.urlresolvers import reverse from django.contrib.auth.decorators \ - import login_required + import login_required, user_passes_test from django.db.models import Q from modoboa.lib import parameters from modoboa.lib.exceptions import ModoboaException from modoboa.lib.webutils import _render, getctx, ajax_response, ajax_simple_response from modoboa.admin.models import Mailbox -from lib import AMrelease, selfservice +from lib import * from templatetags.amextras import * from modoboa.lib.email_listing import parse_search_parameters from sql_listing import * @@ -306,3 +306,9 @@ def process(request): if request.POST["action"] == "delete": return delete(request, ids) + +@login_required +@user_passes_test(lambda u: u.group != 'SimpleUsers') +def nbrequests(request): + nbrequests = get_nb_requests(request.user) + return ajax_simple_response(dict(requests=nbrequests)) diff --git a/extensions/postfix_autoreply/__init__.py b/extensions/postfix_autoreply/__init__.py index 677baed6f..9bdddcb63 100644 --- a/extensions/postfix_autoreply/__init__.py +++ b/extensions/postfix_autoreply/__init__.py @@ -115,9 +115,7 @@ def onModifyMailbox(mailbox, oldmailbox): alias.save() @events.observe("GetStaticContent") -def get_static_content(target): - if target != "userprefs": - return [] +def get_static_content(): return """ """ % (level, text, timeout) +@register.simple_tag +def extra_head_content(): + tpl = Template("{% for sc in static_content %}{{ sc|safe }}{% endfor %}") + return tpl.render( + Context( + dict(static_content=events.raiseQueryEvent("GetStaticContent")) + ) + ) + @register.simple_tag def load_optionalmenu(user): menu = events.raiseQueryEvent("UserMenuDisplay", "top_menu_middle", user) diff --git a/static/css/custom.css b/static/css/custom.css index 5ac3f905c..64e95e1a0 100644 --- a/static/css/custom.css +++ b/static/css/custom.css @@ -87,4 +87,8 @@ body { .tr-selected { background-color: #F5F5F5; +} + +.hidden { + display: none; } \ No newline at end of file diff --git a/templates/nlayout.html b/templates/nlayout.html index d33c34197..f3186de77 100644 --- a/templates/nlayout.html +++ b/templates/nlayout.html @@ -21,6 +21,7 @@ + {% extra_head_content %} {% block html_head %}{% endblock %} diff --git a/templates/userprefs/preferences.html b/templates/userprefs/preferences.html index 530f84112..1cc3c7ee0 100644 --- a/templates/userprefs/preferences.html +++ b/templates/userprefs/preferences.html @@ -1,7 +1,6 @@ {% extends "twocols.html" %} {% load i18n uprefs_extras libextras %} {% block html_head %} -{% extra_head_content %}