mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-19 05:58:34 +02:00
First work for ticket #26.
This commit is contained in:
@@ -115,3 +115,7 @@ class Alias(models.Model):
|
||||
permissions = (
|
||||
("view_aliases", "View aliases"),
|
||||
)
|
||||
|
||||
class Parameter(models.Model):
|
||||
name = models.CharField(max_length=255)
|
||||
value = models.CharField(max_length=255)
|
||||
|
||||
@@ -46,9 +46,26 @@ def domain_menu(domain_id, selection, perms):
|
||||
"perms" : perms})
|
||||
|
||||
@register.simple_tag
|
||||
def settings_menu(selection):
|
||||
return render_to_string('admin/settings_menu.html',
|
||||
{"selection" : selection})
|
||||
def settings_menu(selection, perms):
|
||||
entries = [
|
||||
{"name" : "permissions",
|
||||
"url" : reverse(admin.views.settings),
|
||||
"label" : _("Permissions"),
|
||||
"img" : "/static/pics/permissions.png"},
|
||||
{"name" : "addperm",
|
||||
"url" : reverse(admin.views.addpermission),
|
||||
"img" : "/static/pics/add.png",
|
||||
"label" : _("Add permission"),
|
||||
"class" : "boxed",
|
||||
"rel" : "{handler:'iframe',size:{x:320,y:210}}"},
|
||||
{"name" : "parameters",
|
||||
"url" : reverse(admin.views.viewparameters),
|
||||
"img" : "/static/pics/domains.png",
|
||||
"label" : _("Parameters")},
|
||||
]
|
||||
return render_to_string('main/menu.html',
|
||||
{"selection" : selection, "entries" : entries,
|
||||
"perms" : perms})
|
||||
|
||||
@register.simple_tag
|
||||
def loadadminextmenu(perms):
|
||||
|
||||
+3
-1
@@ -18,5 +18,7 @@ urlpatterns = patterns('mailng.admin.views',
|
||||
(r'^domains/(?P<dom_id>\d+)/delalias/(?P<alias_id>\d+)/$', 'delalias'),
|
||||
(r'^settings/$', 'settings'),
|
||||
(r'^settings/addperm/$', 'addpermission'),
|
||||
(r'^settings/delperm/(?P<mbox_id>\d+)/(?P<group>\w+)/$', 'deletepermission')
|
||||
(r'^settings/delperm/(?P<mbox_id>\d+)/(?P<group>\w+)/$', 'deletepermission'),
|
||||
(r'^settings/parameters/$', 'viewparameters'),
|
||||
(r'^settings/parameters/save/$', 'saveparameters'),
|
||||
)
|
||||
|
||||
+27
-2
@@ -11,11 +11,11 @@ from django.contrib.auth.decorators \
|
||||
import login_required, permission_required, user_passes_test
|
||||
from django.contrib.auth.models import User, Group
|
||||
from mailng import admin, main
|
||||
from mailng.admin.models import Domain, Mailbox, Alias
|
||||
from mailng.admin.models import Domain, Mailbox, Alias, Parameter
|
||||
from forms import MailboxForm, DomainForm, AliasForm, PermissionForm
|
||||
from mailng.lib.authbackends import crypt_password
|
||||
from mailng.lib import _render, _ctx_ok, _ctx_ko
|
||||
from mailng.lib import events
|
||||
from mailng.lib import events, parameters
|
||||
import string
|
||||
import copy
|
||||
|
||||
@@ -404,3 +404,28 @@ def deletepermission(request, mbox_id, group):
|
||||
mbox.user.groups.remove(grp)
|
||||
mbox.user.save()
|
||||
return HttpResponseRedirect(reverse(admin.views.settings))
|
||||
|
||||
@login_required
|
||||
@user_passes_test(lambda u: u.is_superuser)
|
||||
def viewparameters(request):
|
||||
params = {}
|
||||
for app, app_params in parameters._params.iteritems():
|
||||
params[app] = {}
|
||||
for pname, pdef in app_params.iteritems():
|
||||
params[app][pname] = pdef
|
||||
params[app][pname]["value"] = parameters.get(app, pname)
|
||||
|
||||
return _render(request, 'admin/parameters.html', {
|
||||
"params" : params
|
||||
})
|
||||
|
||||
@login_required
|
||||
@user_passes_test(lambda u: u.is_superuser)
|
||||
def saveparameters(request):
|
||||
for pname, v in request.POST.iteritems():
|
||||
if pname == "update":
|
||||
continue
|
||||
app, name = pname.split('.')
|
||||
parameters.save(app, name, v)
|
||||
request.user.message_set.create(message=_("Configuration saved."))
|
||||
return HttpResponseRedirect(reverse(admin.views.viewparameters))
|
||||
|
||||
@@ -13,7 +13,7 @@ from django.core.urlresolvers import reverse
|
||||
from django.core.paginator import Paginator
|
||||
from django.contrib.auth.decorators \
|
||||
import login_required
|
||||
from mailng.lib import events
|
||||
from mailng.lib import events, parameters
|
||||
from mailng.lib import _render, _ctx_ok, _ctx_ko, decode
|
||||
from mailng.lib import db
|
||||
from mailng.admin.models import Mailbox
|
||||
@@ -37,6 +37,8 @@ def map_cid(url):
|
||||
|
||||
def init():
|
||||
events.register("UserMenuDisplay", menu)
|
||||
parameters.register("amavis_quarantine", "MAX_MESSAGES_AGE", "int", 14,
|
||||
help=_("Quarantine messages maximum age (in days) before deletion"))
|
||||
|
||||
def urls():
|
||||
return (r'^mailng/quarantine/',
|
||||
|
||||
@@ -10,7 +10,7 @@ from postfix log : sent, received, bounced, rejected
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.conf.urls.defaults import *
|
||||
from mailng.lib import events, _render
|
||||
from mailng.lib import events, parameters, _render
|
||||
from mailng.admin.views import good_domain
|
||||
from mailng.admin.models import Domain, Mailbox
|
||||
from django.contrib.auth.decorators \
|
||||
@@ -20,6 +20,12 @@ graph_types = ['AVERAGE', 'MAX']
|
||||
|
||||
def init():
|
||||
events.register("AdminMenuDisplay", menu)
|
||||
parameters.register("stats", "LOGFILE", "string", "/var/log/mail.log",
|
||||
help=_("Path to log file used to collect statistics"))
|
||||
parameters.register("stats", "RRD_ROOTDIR", "string", "/tmp/mailng",
|
||||
help=_("Path to directory where RRD files are stored"))
|
||||
parameters.register("stats", "IMG_ROOTDIR", "string", "/tmp/mailng",
|
||||
help=_("Path to directory where PNG files are stored"))
|
||||
|
||||
def urls():
|
||||
return (r'^mailng/stats/',
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
import string
|
||||
from mailng.admin.models import Parameter
|
||||
|
||||
"""
|
||||
This interface provides a simple way to declare and store parameters
|
||||
in MailNG's database.
|
||||
|
||||
Core components or extensions can register their own parameters, which
|
||||
will be available and modifiable directly from the web interface.
|
||||
|
||||
Only super users will be able to acces this part of the web interface.
|
||||
"""
|
||||
|
||||
_params = {}
|
||||
|
||||
class NotDefined(Exception):
|
||||
def __init__(self, app, name):
|
||||
self.app = app
|
||||
self.name = name
|
||||
|
||||
def __str__(self):
|
||||
return "Application '%s' and/or parameter '%s' not defined" % (self.app,
|
||||
self.name)
|
||||
|
||||
def register(app, name, type="string", default=None, help=None):
|
||||
"""Register a new parameter.
|
||||
|
||||
app corresponds to a core component (admin, main) or an extension.
|
||||
"""
|
||||
if not app in _params.keys():
|
||||
_params[app] = {}
|
||||
_params[app][name] = {"type" : type, "default" : default, "help" : help}
|
||||
|
||||
def save(app, name, value):
|
||||
if not app in _params.keys() or not name in _params[app].keys():
|
||||
raise NotDefined(app, name)
|
||||
fullname = "%s.%s" % (app, name)
|
||||
try:
|
||||
p = Parameter.objects.get(name=fullname)
|
||||
except Parameter.DoesNotExist:
|
||||
p = Parameter()
|
||||
p.name = fullname
|
||||
if p.value != value:
|
||||
p.value = value
|
||||
p.save()
|
||||
return True
|
||||
|
||||
def get(app, name):
|
||||
if not app in _params.keys() or not name in _params[app].keys():
|
||||
raise NotDefined(app, name)
|
||||
try:
|
||||
p = Parameter.objects.get(name="%s.%s" % (app, name))
|
||||
except Parameter.DoesNotExist:
|
||||
return _params[app][name]["defaut"]
|
||||
return p.value
|
||||
@@ -470,7 +470,7 @@ msgstr "Domaines"
|
||||
|
||||
#: templates/layout.html:86 templates/admin/settings_header.html:6
|
||||
msgid "Settings"
|
||||
msgstr "Paramètres"
|
||||
msgstr "Configuration"
|
||||
|
||||
#: templates/admin/addpermission.html:24 templates/admin/settings_menu.html:15
|
||||
msgid "Add permission"
|
||||
|
||||
@@ -9,4 +9,6 @@ window.addEvent('domready', function() {
|
||||
if (!confirm(gettext("Remove this permission?")))
|
||||
event.stop();
|
||||
});
|
||||
|
||||
var tip = new Tips($$(".Tips"));
|
||||
});
|
||||
@@ -31,6 +31,14 @@ input:hover {
|
||||
background-color: #ffffcc;
|
||||
}
|
||||
|
||||
td.odd {
|
||||
background: #F7F9Fb;
|
||||
}
|
||||
|
||||
td.even {
|
||||
|
||||
}
|
||||
|
||||
.title {
|
||||
float: left;
|
||||
width: 100%;
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
{% extends "admin/settings_header.html" %}
|
||||
{% block html_head %}
|
||||
<script src="/static/js/settings.js" type="text/javascript"></script>
|
||||
<link rel="stylesheet" type="text/css" href="/static/stylesheets/box.css" />
|
||||
{% endblock %}
|
||||
{% block menu %}
|
||||
{% load admin_extras %}
|
||||
{% settings_menu "parameters" perms %}
|
||||
{% endblock %}
|
||||
{% block setcontent %}
|
||||
{% load i18n %}
|
||||
{% url admin.views.saveparameters as action %}
|
||||
<form method="POST" action="{{ action }}">
|
||||
<table>
|
||||
<tr>
|
||||
<th width="50%">{% trans "Name" %}</th>
|
||||
<th>{% trans "Value" %}</th>
|
||||
</tr>
|
||||
{% for app, ps in params.items %}
|
||||
{% for name, def in ps.items %}
|
||||
<tr>
|
||||
<td class="odd">{{ app }}::{{ name }}</td>
|
||||
<td class="even">
|
||||
{% if def.value %}
|
||||
<input type="text" name="{{ app }}.{{ name }}" id="{{ app }}.{{ name }}" value="{{ def.value }}" />
|
||||
{% else %}
|
||||
<input type="text" name="{{ app }}.{{ name}}" id="{{ app }}.{{ name }}" value="{{ def.default }}" />
|
||||
{% endif %}
|
||||
{% if def.help %}
|
||||
<a href="{{ def.help }}" onclick="return false;" class="Tips" title="{% trans 'Help' %}">
|
||||
<img src="/static/pics/info.png" border="0" />
|
||||
</a>
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
</table>
|
||||
|
||||
<p><input type="submit" name="update" value="{% trans 'Save' %}" /></p>
|
||||
</form>
|
||||
{% endblock %}
|
||||
@@ -1,7 +1,7 @@
|
||||
{% extends "admin/settings_header.html" %}
|
||||
{% block menu %}
|
||||
{% load admin_extras %}
|
||||
{% settings_menu "permissions" %}
|
||||
{% settings_menu "permissions" perms %}
|
||||
{% endblock %}
|
||||
{% block setcontent %}
|
||||
{% load i18n %}
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
{% load i18n %}
|
||||
<ul>
|
||||
{% url admin.views.permissions as perm_url %}
|
||||
<li {% ifequal selection "permissions" %}class="selected"{% endifequal %}>
|
||||
<a href="{{ perm_url }}">
|
||||
<img src="/static/pics/permissions.png" border="0" />
|
||||
{% trans "Permissions" %}
|
||||
</a>
|
||||
</li>
|
||||
{% url admin.views.addpermission as addperm_url %}
|
||||
<li>
|
||||
<a href="{{ addperm_url }}" class="boxed"
|
||||
rel="{handler:'iframe',size:{x:320,y:210}}">
|
||||
<img src="/static/pics/add.png" border="0" />
|
||||
{% trans "Add permission" %}
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
@@ -33,6 +33,6 @@ if menus != ():
|
||||
if settings.DEBUG:
|
||||
urlpatterns += patterns(
|
||||
'',
|
||||
(r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': '/home/tonio/projets/mailng/static'})
|
||||
(r'^static/(?P<path>.*)$', 'django.views.static.serve', {'document_root': '/home/tonio/projets/devel/mailng/static'})
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user