First work for ticket #26.

This commit is contained in:
tonio
2009-11-06 18:47:01 +01:00
parent 6e69bab730
commit 34cc4a81ac
14 changed files with 176 additions and 29 deletions
+4
View File
@@ -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)
+20 -3
View File
@@ -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
View File
@@ -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
View File
@@ -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))
+3 -1
View File
@@ -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/',
+7 -1
View File
@@ -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/',
+57
View File
@@ -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
+1 -1
View File
@@ -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"
+2
View File
@@ -9,4 +9,6 @@ window.addEvent('domready', function() {
if (!confirm(gettext("Remove this permission?")))
event.stop();
});
var tip = new Tips($$(".Tips"));
});
+8
View File
@@ -31,6 +31,14 @@ input:hover {
background-color: #ffffcc;
}
td.odd {
background: #F7F9Fb;
}
td.even {
}
.title {
float: left;
width: 100%;
+42
View File
@@ -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 -1
View File
@@ -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 %}
-18
View File
@@ -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>
+1 -1
View File
@@ -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'})
)