mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-17 05:41:25 +02:00
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:
@@ -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
|
||||
)))]
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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'),
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -87,4 +87,8 @@ body {
|
||||
|
||||
.tr-selected {
|
||||
background-color: #F5F5F5;
|
||||
}
|
||||
|
||||
.hidden {
|
||||
display: none;
|
||||
}
|
||||
@@ -21,6 +21,7 @@
|
||||
<script type="text/javascript">
|
||||
set_media_url("{{ MEDIA_URL }}");
|
||||
</script>
|
||||
{% extra_head_content %}
|
||||
{% block html_head %}{% endblock %}
|
||||
</head>
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user