mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-17 05:41:25 +02:00
WIP
This commit is contained in:
@@ -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 = []
|
||||
|
||||
@@ -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"])
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
{% extends "admin/header.html" %}
|
||||
|
||||
{% load i18n %}
|
||||
{% load admin_tags %}
|
||||
|
||||
{% block leftcol %}
|
||||
<ul class="nav nav-sidebar">
|
||||
{% domains_menu "domains" user False %}
|
||||
</ul>
|
||||
|
||||
{% get_extra_admin_content user "leftcol" selection %}
|
||||
{% endblock %}
|
||||
|
||||
{% block apparea %}
|
||||
<h2>{{ object }} <small>{% trans "Overview" %}</small></h2>
|
||||
<hr>
|
||||
|
||||
<div class="col-xs-12 col-sm-6">
|
||||
<div class="panel panel-info">
|
||||
<div class="panel-heading"><h3 class="panel-title">{% trans "Information" %}</h3></div>
|
||||
<div class="panel-body">
|
||||
<div class="row"><span class="title">{% trans "Creation date" %}</span><span>{{ domain.creation }}</span></div>
|
||||
<div class="row"><span class="title">{% trans "Last modification date" %}</span><span>{{ domain.last_modification }}</span></div>
|
||||
<div class="row"><span class="title">{% trans "Domain aliases" %}</span><span>{{ domain.domainalias_count }}</span></div>
|
||||
<div class="row"><span class="title"><a href="{% url 'admin:identity_list' %}#list/?searchquery=@{{ object.name }}">{% trans "Mailboxes" %}</a></span><span>{{ domain.mailbox_count }}</span></div>
|
||||
<div class="row"><span class="title"><a href="{% url 'admin:identity_list' %}#list/?searchquery=@{{ object.name }}">{% trans "Mailbox aliases" %}</a></span><span>{{ domain.mbalias_count }}</span></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% for template in templates.left %}
|
||||
<div class="panel panel-info">
|
||||
<div class="panel-body">
|
||||
{% include template %}
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<div class="col-xs-12 col-sm-6">
|
||||
<div class="panel panel-info">
|
||||
<div class="panel-heading"><h3 class="panel-title">{% trans "Administrators" %}</h3></div>
|
||||
<div class="panel-body">
|
||||
<table id="domadmins" class="table table-condensed">
|
||||
<tr><th>{% trans "Username" %}</th><th>{% trans "Name" %}</th><th></th></tr>
|
||||
{% for da in domain.admins %}
|
||||
<tr>
|
||||
<td>{{ da.username }}</td>
|
||||
<td>{{ da.fullname }}</td>
|
||||
<td name="actions">{% if perms.admin.change_domain %}{% domadmin_actions da.id domain.id %}{% endif %}</td>
|
||||
</tr>
|
||||
{% empty %}
|
||||
<tr><td colspan="3">{% trans "No domain administrator defined yet." %}</td></tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% for template in templates.right %}
|
||||
{% include template %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
@@ -1,7 +1,8 @@
|
||||
{% load i18n admin_tags lib_tags %}
|
||||
|
||||
{% for domain in domains %}
|
||||
<tr id="{{ domain.id }}" class="{% if not domain.enabled %}text-muted{% endif %}" name="{{ forloop.counter }}">
|
||||
<td name="name">{% domain_modify_link domain %}{% if not domain.enabled %} ({% trans "disabled" %}){% endif %}</td>
|
||||
<td name="name"><a href="{% url 'admin:domain_detail' domain.id %}">{{ domain }}</a>{% if not domain.enabled %} ({% trans "disabled" %}){% endif %}</td>
|
||||
<td name="aliases">{% domain_aliases domain %} </td>
|
||||
<td name="tags">{% render_tags domain.tags %}</td>
|
||||
<td name="actions">{% domain_actions user domain %}</td>
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
{% extends "common/tabforms.html" %}{% load i18n lib_tags admin_tags %}
|
||||
{% block extratabs %}
|
||||
<li class="{% if tabs.active_id == 'admins' %}active{% endif %}">
|
||||
<a href="#admins" data-toggle="tab">{% trans "Administrators" %}</a>
|
||||
</li>
|
||||
<li class="{% if tabs.active_id == 'misc' %}active{% endif %}">
|
||||
<a href="#misc" data-toggle="tab">{% trans "Miscellaneous" %}</a>
|
||||
</li>
|
||||
{% endblock %}
|
||||
{% block extratabs_content %}
|
||||
<div class="tab-pane{% if tabs.active_id == 'admins' %} active{% endif %}" id="admins">{% if domadmins %}
|
||||
<table id="domadmins" class="table table-condensed">
|
||||
<tr><th>{% trans "Username" %}</th><th>{% trans "Name" %}</th><th></th></tr>
|
||||
{% for da in domadmins %}<tr>
|
||||
<td>{{ da.username }}</td>
|
||||
<td>{{ da.fullname }}</td>
|
||||
<td name="actions">{% if perms.admin.change_domain %}{% domadmin_actions da.id domain.id %}{% endif %}</td>
|
||||
</tr>{% endfor %}
|
||||
</table>{% else %}<div class="alert alert-info">{% trans "No domain administrator defined" %}</div>{% endif %}
|
||||
</div>
|
||||
<div class="tab-pane{% if tabs.active_id == 'misc' %} active{% endif %}" id="misc">
|
||||
<div class="row"><span class="title">{% trans "Creation date" %}</span><span>{{ domain.creation }}</span></div>
|
||||
<div class="row"><span class="title">{% trans "Last modification date" %}</span><span>{{ domain.last_modification }}</span></div>
|
||||
<div class="row"><span class="title">{% trans "Domain aliases" %}</span><span>{{ domain.domainalias_count }}</span></div>
|
||||
<div class="row"><span class="title">{% trans "Mailboxes" %}</span><span>{{ domain.mailbox_count }}</span></div>
|
||||
<div class="row"><span class="title">{% trans "Mailbox aliases" %}</span><span>{{ domain.mbalias_count }}</span></div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
@@ -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",
|
||||
|
||||
@@ -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<pk>\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"),
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
"""Shortcuts."""
|
||||
|
||||
from .domain import DomainDetailView
|
||||
|
||||
|
||||
__all__ = [
|
||||
"DomainDetailView",
|
||||
]
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
}]
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
{% load i18n lib_tags %}
|
||||
|
||||
<div class="panel panel-info">
|
||||
<div class="panel-heading">
|
||||
<h3 class="panel-title">{% trans "Resources usage" %}</h3>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
{% for l in limits %}
|
||||
{{ l.label }} ({{ l }})
|
||||
<div rel="tooltip" title="{{ l.current_value }}/{{ l.max_value }}" class="progress">
|
||||
<div class="{% progress_color l.usage %}" style="width: {{ l }}" aria-valuemin="0" aria-valuemax="100"></div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
@@ -4,7 +4,7 @@
|
||||
{% for l in limits %}
|
||||
<li class="resource">
|
||||
{{ l.label }} ({{ l }})
|
||||
<div rel="tooltip" title="{{ l.curvalue }}/{{ l.maxvalue }}" class="progress">
|
||||
<div rel="tooltip" title="{{ l.current_value }}/{{ l.max_value }}" class="progress">
|
||||
<div class="{% progress_color l.usage %}" style="width: {{ l }}" aria-valuemin="0" aria-valuemax="100"></div>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
<script src="{% static 'bootstrap-select/dist/js/bootstrap-select.min.js' %}" type="text/javascript"></script>
|
||||
{% if LANGUAGE_CODE != "en" %}<script src="{{ STATIC_URL }}moment/locale/{{ LANGUAGE_CODE }}.js" type="text/javascript"></script>{% endif %}
|
||||
{% if TEMPLATE_DEBUG %}
|
||||
<script src="//maxcdn.bootstrapcdn.com/bootlint/0.4.0/bootlint.min.js"></script>
|
||||
<script src="//maxcdn.bootstrapcdn.com/bootlint/0.4.0/bootlint.min.js"></script>
|
||||
{% endif %}
|
||||
<script src="{% static 'js/global.js' %}" type="text/javascript"></script>
|
||||
<script src="{% static 'js/csrf.js' %}" type="text/javascript"></script>
|
||||
|
||||
Reference in New Issue
Block a user