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 %}
+
- | {% 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 %}
-
- | {% trans "Username" %} | {% trans "Name" %} | |
- {% for da in domadmins %}
- | {{ da.username }} |
- {{ da.fullname }} |
- {% if perms.admin.change_domain %}{% domadmin_actions da.id domain.id %}{% endif %} |
-
{% endfor %}
-
{% 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 %}