diff --git a/modoboa/extensions/stats/management/commands/logparser.py b/modoboa/extensions/stats/management/commands/logparser.py index 2c6907eaa..45d8cd861 100644 --- a/modoboa/extensions/stats/management/commands/logparser.py +++ b/modoboa/extensions/stats/management/commands/logparser.py @@ -30,7 +30,6 @@ from django.core.management.base import BaseCommand from modoboa.core.extensions import exts_pool from modoboa.extensions.admin.models import Domain -from modoboa.extensions.postfix_relay_domains.models import RelayDomain from modoboa.extensions.stats import Stats from modoboa.extensions.stats.grapher import str2Time, Grapher from modoboa.extensions.stats.graph_templates import MailTraffic @@ -98,6 +97,7 @@ class LogParser(object): self.data[str(dom.name)] = {} if not exts_pool.is_extension_enabled("postfix_relay_domains"): return + from modoboa.extensions.postfix_relay_domains.models import RelayDomain for rdom in RelayDomain.objects.all(): self.domains += [str(rdom.name)] self.data[str(rdom.name)] = {} diff --git a/modoboa/extensions/stats/templates/stats/index.html b/modoboa/extensions/stats/templates/stats/index.html index 6df360da5..bbbb3dcc5 100644 --- a/modoboa/extensions/stats/templates/stats/index.html +++ b/modoboa/extensions/stats/templates/stats/index.html @@ -9,7 +9,7 @@ $(document).ready(function() { var stats = new Stats({ graphurl: "{% url 'modoboa.extensions.stats.views.graphs' %}", - domain_list_url: "{% url 'modoboa.extensions.admin.views.domain.domains_list' %}", + domain_list_url: "{% url 'modoboa.extensions.stats.views.get_domain_list' %}", deflocation: "{{ deflocation|safe }}", language: "{{ LANGUAGE_CODE }}" }); diff --git a/modoboa/extensions/stats/urls.py b/modoboa/extensions/stats/urls.py index 971df5904..6a7bfe83e 100644 --- a/modoboa/extensions/stats/urls.py +++ b/modoboa/extensions/stats/urls.py @@ -5,4 +5,5 @@ urlpatterns = patterns( 'modoboa.extensions.stats.views', url(r'^$', 'index', name='fullindex'), url(r'^graphs/$', "graphs"), + url(r'^domains/$', "get_domain_list"), ) diff --git a/modoboa/extensions/stats/views.py b/modoboa/extensions/stats/views.py index fd65bd041..cb5a42b77 100644 --- a/modoboa/extensions/stats/views.py +++ b/modoboa/extensions/stats/views.py @@ -5,6 +5,8 @@ from django.utils.translation import ugettext as _ from django.contrib.auth.decorators import ( login_required, user_passes_test, permission_required ) + +from modoboa.core.extensions import exts_pool from modoboa.lib import events from modoboa.lib.exceptions import BadRequest, PermDeniedException, NotFound from modoboa.lib.webutils import ( @@ -38,6 +40,38 @@ def index(request): }) +def check_domain_access(user, pattern): + """Check if an administrator can access a domain/relay domain. + + If a non super administrator asks for the global view, we give him + a view on the first domain he manage instead. + + :return: a domain name (str) or None. + """ + targets = [Domain] + if exts_pool.is_extension_enabled("postfix_relay_domains"): + from modoboa.extensions.postfix_relay_domains.models import RelayDomain + targets.append(RelayDomain) + + if pattern in [None, "global"]: + if not user.is_superuser: + for target in targets: + if not target.objects.get_for_admin(user).count(): + continue + return target.objects.get_for_admin(user)[0].name + return None + return "global" + + for target in targets: + results = target.objects.filter(name__contains=pattern) + if results.count() != 1: + continue + if not user.can_access(results[0]): + raise PermDeniedException + return results[0].name + return None + + @login_required @user_passes_test(lambda u: u.group != "SimpleUsers") def graphs(request): @@ -48,22 +82,10 @@ def graphs(request): searchq = request.GET.get("searchquery", None) period = request.GET.get("period", "day") tplvars = dict(graphs=[], period=period) - if searchq in [None, "global"]: - if not request.user.is_superuser: - if not Domain.objects.get_for_admin(request.user).count(): - return render_to_json_response({}) - tplvars.update( - domain=Domain.objects.get_for_admin(request.user)[0].name - ) - else: - tplvars.update(domain="global") - else: - domain = Domain.objects.filter(name__contains=searchq) - if domain.count() != 1: - return render_to_json_response({}) - if not request.user.can_access(domain[0]): - raise PermDeniedException - tplvars.update(domain=domain[0].name) + domain = check_domain_access(request.user, searchq) + if domain is None: + return render_to_json_response({}) + tplvars["domain"] = domain if period == "custom": if not "start" in request.GET or not "end" in request.GET: @@ -88,3 +110,17 @@ def graphs(request): return render_to_json_response({ 'content': _render_to_string(request, "stats/graphs.html", tplvars) }) + + +@login_required +@user_passes_test(lambda u: u.group != "SimpleUsers") +def get_domain_list(request): + """Get the list of domains (and relay domains) the user can see.""" + doms = [dom.name for dom in Domain.objects.get_for_admin(request.user)] + if exts_pool.is_extension_enabled("postfix_relay_domains"): + from modoboa.extensions.postfix_relay_domains.models import RelayDomain + doms += [ + rdom.name for rdom in + RelayDomain.objects.get_for_admin(request.user) + ] + return render_to_json_response(doms)