diff --git a/modoboa/admin/forms/domain.py b/modoboa/admin/forms/domain.py index c10f3e86b..c74b45c3d 100644 --- a/modoboa/admin/forms/domain.py +++ b/modoboa/admin/forms/domain.py @@ -256,8 +256,6 @@ class DomainForm(TabForms): """Domain edition form.""" - template_name = "admin/editdomainform.html" - def __init__(self, request, *args, **kwargs): self.user = request.user self.forms = [] diff --git a/modoboa/admin/signals.py b/modoboa/admin/signals.py index 6878843c4..db0f98c35 100644 --- a/modoboa/admin/signals.py +++ b/modoboa/admin/signals.py @@ -2,6 +2,8 @@ import django.dispatch -use_external_recipients = django.dispatch.Signal(providing_args=['recipients']) +use_external_recipients = django.dispatch.Signal(providing_args=["recipients"]) extra_domain_actions = django.dispatch.Signal( providing_args=["user", "domain"]) +extra_domain_dashboard_widgets = django.dispatch.Signal( + providing_args=["user", "domain"]) diff --git a/modoboa/admin/templates/admin/domain_detail.html b/modoboa/admin/templates/admin/domain_detail.html new file mode 100644 index 000000000..adfc9eef4 --- /dev/null +++ b/modoboa/admin/templates/admin/domain_detail.html @@ -0,0 +1,63 @@ +{% extends "admin/header.html" %} + +{% load i18n %} +{% load admin_tags %} + +{% block leftcol %} + + +{% get_extra_admin_content user "leftcol" selection %} +{% endblock %} + +{% block apparea %} +

{{ object }} {% trans "Overview" %}

+
+ +
+
+

{% trans "Information" %}

+
+
{% trans "Creation date" %}{{ domain.creation }}
+
{% trans "Last modification date" %}{{ domain.last_modification }}
+
{% trans "Domain aliases" %}{{ domain.domainalias_count }}
+
{% trans "Mailboxes" %}{{ domain.mailbox_count }}
+
{% trans "Mailbox aliases" %}{{ domain.mbalias_count }}
+
+
+ + {% for template in templates.left %} +
+
+ {% include template %} +
+
+ {% endfor %} +
+ +
+
+

{% trans "Administrators" %}

+
+ + + {% for da in domain.admins %} + + + + + + {% empty %} + + {% endfor %} +
{% trans "Username" %}{% trans "Name" %}
{{ da.username }}{{ da.fullname }}{% if perms.admin.change_domain %}{% domadmin_actions da.id domain.id %}{% endif %}
{% trans "No domain administrator defined yet." %}
+
+
+ + {% for template in templates.right %} + {% include template %} + {% endfor %} +
+ +{% endblock %} diff --git a/modoboa/admin/templates/admin/domains_table.html b/modoboa/admin/templates/admin/domains_table.html index c79777a8b..b579c4070 100644 --- a/modoboa/admin/templates/admin/domains_table.html +++ b/modoboa/admin/templates/admin/domains_table.html @@ -1,7 +1,8 @@ {% load i18n admin_tags lib_tags %} + {% for domain in domains %} - {% domain_modify_link domain %}{% if not domain.enabled %} ({% trans "disabled" %}){% endif %} + {{ domain }}{% if not domain.enabled %} ({% trans "disabled" %}){% endif %} {% domain_aliases domain %} {% render_tags domain.tags %} {% domain_actions user domain %} diff --git a/modoboa/admin/templates/admin/editdomainform.html b/modoboa/admin/templates/admin/editdomainform.html deleted file mode 100644 index 09d19065f..000000000 --- a/modoboa/admin/templates/admin/editdomainform.html +++ /dev/null @@ -1,28 +0,0 @@ -{% extends "common/tabforms.html" %}{% load i18n lib_tags admin_tags %} -{% block extratabs %} -
  • - {% trans "Administrators" %} -
  • -
  • - {% trans "Miscellaneous" %} -
  • -{% endblock %} -{% block extratabs_content %} -
    {% if domadmins %} - - - {% for da in domadmins %} - - - - {% endfor %} -
    {% trans "Username" %}{% trans "Name" %}
    {{ da.username }}{{ da.fullname }}{% if perms.admin.change_domain %}{% domadmin_actions da.id domain.id %}{% endif %}
    {% else %}
    {% trans "No domain administrator defined" %}
    {% endif %} -
    -
    -
    {% trans "Creation date" %}{{ domain.creation }}
    -
    {% trans "Last modification date" %}{{ domain.last_modification }}
    -
    {% trans "Domain aliases" %}{{ domain.domainalias_count }}
    -
    {% trans "Mailboxes" %}{{ domain.mailbox_count }}
    -
    {% trans "Mailbox aliases" %}{{ domain.mbalias_count }}
    -
    -{% endblock %} diff --git a/modoboa/admin/templatetags/admin_tags.py b/modoboa/admin/templatetags/admin_tags.py index 6a202fb6d..dc9fdbb67 100644 --- a/modoboa/admin/templatetags/admin_tags.py +++ b/modoboa/admin/templatetags/admin_tags.py @@ -153,6 +153,15 @@ def domain_actions(user, domain): "title": _("View the domain's identities"), "img": "fa fa-user"} ] + if user.has_perm("admin.change_domain"): + actions.append({ + "name": "editdomain", + "title": _("Edit {}").format(domain), + "url": reverse("admin:domain_change", args=[domain.pk]), + "modal": True, + "modalcb": "admin.domainform_cb", + "img": "fa fa-edit" + }) if user.has_perm("admin.delete_domain"): actions.append({ "name": "deldomain", diff --git a/modoboa/admin/urls.py b/modoboa/admin/urls.py index 3119542df..cffbc927b 100644 --- a/modoboa/admin/urls.py +++ b/modoboa/admin/urls.py @@ -1,11 +1,17 @@ +"""Admin urls.""" + from django.conf.urls import patterns, url +from . import views + urlpatterns = patterns( 'modoboa.admin.views.domain', url(r'^$', 'index', name="index"), url(r'^domains/$', 'domains', name="domain_list"), + url(r'^domains/(?P\d+)/$', views.DomainDetailView.as_view(), + name="domain_detail"), url(r'^domains/list/$', '_domains', name="_domain_list"), url(r'^domains/flatlist/$', 'domains_list', name="domain_flat_list"), url(r'^domains/stats/$', 'domain_statistics', name="domain_statistics"), diff --git a/modoboa/admin/views/__init__.py b/modoboa/admin/views/__init__.py index e69de29bb..dacf92012 100644 --- a/modoboa/admin/views/__init__.py +++ b/modoboa/admin/views/__init__.py @@ -0,0 +1,8 @@ +"""Shortcuts.""" + +from .domain import DomainDetailView + + +__all__ = [ + "DomainDetailView", +] diff --git a/modoboa/admin/views/domain.py b/modoboa/admin/views/domain.py index 569599118..622d529b5 100644 --- a/modoboa/admin/views/domain.py +++ b/modoboa/admin/views/domain.py @@ -1,10 +1,13 @@ """Domain related views.""" -from django.http import HttpResponseRedirect -from django.utils.translation import ugettext as _, ungettext from django.core.urlresolvers import reverse +from django.http import HttpResponseRedirect from django.shortcuts import render +from django.utils.translation import ugettext as _, ungettext +from django.views import generic from django.views.decorators.csrf import ensure_csrf_cookie + +from django.contrib.auth import mixins as auth_mixins from django.contrib.auth.decorators import ( login_required, permission_required, user_passes_test ) @@ -27,6 +30,7 @@ from ..lib import get_domains from ..models import ( Domain, DomainAlias, Mailbox, Alias ) +from .. import signals @login_required @@ -43,8 +47,8 @@ def _domains(request): sort_order, sort_dir = get_sort_order(request.GET, "name") filters = dict( (flt, request.GET.get(flt, None)) - for flt in ['domfilter', 'searchquery'] - + events.raiseQueryEvent('ExtraDomainFilters') + for flt in ['domfilter', 'searchquery'] + + events.raiseQueryEvent('ExtraDomainFilters') ) request.session['domains_filters'] = filters domainlist = get_domains(request.user, **filters) @@ -151,3 +155,25 @@ def domain_statistics(request): }) context.update({"domains": Domain.objects.get_for_admin(request.user)}) return render(request, "admin/domain_statistics.html", context) + + +class DomainDetailView( + auth_mixins.PermissionRequiredMixin, generic.DetailView): + """DetailView for Domain.""" + + model = Domain + permission_required = "admin.view_domain" + + def get_context_data(self, **kwargs): + """Include extra widgets.""" + context = super(DomainDetailView, self).get_context_data(**kwargs) + result = signals.extra_domain_dashboard_widgets.send( + self.__class__, user=self.request.user, domain=self.object) + context["templates"] = {"left": [], "right": []} + for receiver, widgets in result: + for widget in widgets: + context["templates"][widget["column"]].append( + widget["template"]) + context.update(widget["context"]) + + return context diff --git a/modoboa/limits/handlers.py b/modoboa/limits/handlers.py index fc847dc28..7dd31e998 100644 --- a/modoboa/limits/handlers.py +++ b/modoboa/limits/handlers.py @@ -6,6 +6,7 @@ from django.dispatch import receiver from django.contrib.contenttypes.models import ContentType from modoboa.admin import models as admin_models +from modoboa.admin import signals as admin_signals from modoboa.core import models as core_models from modoboa.core import signals as core_signals from modoboa.lib import signals as lib_signals @@ -66,3 +67,15 @@ def create_domain_limits(sender, instance, **kwargs): parameters.get_admin("DEFLT_DOMAIN_{}_LIMIT".format(name.upper()))) models.DomainObjectLimit.objects.create( domain=instance, name=name, max_value=max_value) + + +@receiver(admin_signals.extra_domain_dashboard_widgets) +def display_domain_limits(sender, user, domain, **kwargs): + """Display resources usage for domain.""" + return [{ + "column": "right", + "template": "limits/domain_resources_widget.html", + "context": { + "limits": domain.domainobjectlimit_set.all() + } + }] diff --git a/modoboa/limits/templates/limits/domain_resources_widget.html b/modoboa/limits/templates/limits/domain_resources_widget.html new file mode 100644 index 000000000..fdf194297 --- /dev/null +++ b/modoboa/limits/templates/limits/domain_resources_widget.html @@ -0,0 +1,15 @@ +{% load i18n lib_tags %} + +
    +
    +

    {% trans "Resources usage" %}

    +
    +
    + {% for l in limits %} + {{ l.label }} ({{ l }}) +
    +
    +
    + {% endfor %} +
    +
    diff --git a/modoboa/limits/templates/limits/poolusage.html b/modoboa/limits/templates/limits/poolusage.html index 1665b6d31..6cd6edaf4 100644 --- a/modoboa/limits/templates/limits/poolusage.html +++ b/modoboa/limits/templates/limits/poolusage.html @@ -4,7 +4,7 @@ {% for l in limits %}
  • {{ l.label }} ({{ l }}) -
    +
  • diff --git a/modoboa/templates/nlayout.html b/modoboa/templates/nlayout.html index 2ca442bea..b41645622 100644 --- a/modoboa/templates/nlayout.html +++ b/modoboa/templates/nlayout.html @@ -63,7 +63,7 @@ {% if LANGUAGE_CODE != "en" %}{% endif %} {% if TEMPLATE_DEBUG %} - + {% endif %}