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
This commit is contained in:
Antoine Nguyen
2012-04-07 17:44:09 +02:00
parent 2ad7b0a039
commit 8e9d8aef3b
9 changed files with 75 additions and 25 deletions
+36 -19
View File
@@ -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("""<script type="text/javascript">
function check_nb_requests() {
$.ajax({
url: "{{ url }}",
dataType: 'json',
success: function(data) {
var $link = $("#nbrequests");
if (data.requests > 0) {
$link.html(data.requests + " " + gettext("pending requests"));
$link.parent().removeClass('hidden');
} else {
$link.parent().addClass('hidden');
}
}
});
}
$(document).ready(function() {
setInterval(check_nb_requests, 2000);
});
</script>""")
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('<div class="btn-group"><a href="{{ url }}" class="btn btn-danger">{{ label }}</a></div>')
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('<div class="btn-group {{ css }}"><a id="nbrequests" href="{{ url }}" class="btn btn-danger">{{ label }}</a></div>')
css = "hidden" if nbrequests == 0 else ""
return [tpl.render(Context(dict(
label=_("%d pending requests" % nbrequests), url=url, css=css
)))]
+15
View File
@@ -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")
+1
View File
@@ -6,6 +6,7 @@ urlpatterns = patterns(
(r'^listing/$', '_listing'),
(r'^getmailcontent/(?P<mail_id>[\w\-\+]+)/$', 'getmailcontent'),
(r'^process/$', 'process'),
(r'^nbrequests/$', 'nbrequests'),
(r'^delete/(?P<mail_id>[\w\-\+]+)/$', 'delete'),
(r'^release/(?P<mail_id>[\w\-\+]+)/$', 'release'),
(r'^(?P<mail_id>[\w\-\+]+)/$', 'viewmail'),
+8 -2
View File
@@ -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))
+1 -3
View File
@@ -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 """<script type="text/javascript">
function arform_cb() {
$('#id_untildate').datepicker();
+9
View File
@@ -60,6 +60,15 @@ def display_messages(msgs):
</script>
""" % (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)
+4
View File
@@ -87,4 +87,8 @@ body {
.tr-selected {
background-color: #F5F5F5;
}
.hidden {
display: none;
}
+1
View File
@@ -21,6 +21,7 @@
<script type="text/javascript">
set_media_url("{{ MEDIA_URL }}");
</script>
{% extra_head_content %}
{% block html_head %}{% endblock %}
</head>
-1
View File
@@ -1,7 +1,6 @@
{% extends "twocols.html" %}
{% load i18n uprefs_extras libextras %}
{% block html_head %}
{% extra_head_content %}
<script type="text/javascript">
$(document).ready(function() {
$("#update").click(function(evt) {