From 34cc4a81acd1d9f69d38d12f7a617aa1b17cf756 Mon Sep 17 00:00:00 2001 From: tonio Date: Fri, 6 Nov 2009 18:47:01 +0100 Subject: [PATCH] First work for ticket #26. --- admin/models.py | 4 ++ admin/templatetags/admin_extras.py | 23 +++++++++-- admin/urls.py | 4 +- admin/views.py | 29 +++++++++++++- extensions/amavis_quarantine/main.py | 4 +- extensions/stats/main.py | 8 +++- lib/parameters.py | 57 ++++++++++++++++++++++++++++ locale/fr/LC_MESSAGES/django.po | 2 +- static/js/settings.js | 2 + static/stylesheets/box.css | 8 ++++ templates/admin/parameters.html | 42 ++++++++++++++++++++ templates/admin/permissions.html | 2 +- templates/admin/settings_menu.html | 18 --------- urls.py | 2 +- 14 files changed, 176 insertions(+), 29 deletions(-) create mode 100644 lib/parameters.py create mode 100644 templates/admin/parameters.html delete mode 100644 templates/admin/settings_menu.html diff --git a/admin/models.py b/admin/models.py index 732ec50a8..cb9e65a8f 100644 --- a/admin/models.py +++ b/admin/models.py @@ -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) diff --git a/admin/templatetags/admin_extras.py b/admin/templatetags/admin_extras.py index 4e5cbf15c..b377b3a2c 100644 --- a/admin/templatetags/admin_extras.py +++ b/admin/templatetags/admin_extras.py @@ -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): diff --git a/admin/urls.py b/admin/urls.py index 770268375..cb296bf2f 100644 --- a/admin/urls.py +++ b/admin/urls.py @@ -18,5 +18,7 @@ urlpatterns = patterns('mailng.admin.views', (r'^domains/(?P\d+)/delalias/(?P\d+)/$', 'delalias'), (r'^settings/$', 'settings'), (r'^settings/addperm/$', 'addpermission'), - (r'^settings/delperm/(?P\d+)/(?P\w+)/$', 'deletepermission') + (r'^settings/delperm/(?P\d+)/(?P\w+)/$', 'deletepermission'), + (r'^settings/parameters/$', 'viewparameters'), + (r'^settings/parameters/save/$', 'saveparameters'), ) diff --git a/admin/views.py b/admin/views.py index 5c1cfa794..7b917765f 100644 --- a/admin/views.py +++ b/admin/views.py @@ -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)) diff --git a/extensions/amavis_quarantine/main.py b/extensions/amavis_quarantine/main.py index a3fd1fb50..3ffd5b9e6 100644 --- a/extensions/amavis_quarantine/main.py +++ b/extensions/amavis_quarantine/main.py @@ -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/', diff --git a/extensions/stats/main.py b/extensions/stats/main.py index a7d1f65a9..a87ccb30f 100644 --- a/extensions/stats/main.py +++ b/extensions/stats/main.py @@ -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/', diff --git a/lib/parameters.py b/lib/parameters.py new file mode 100644 index 000000000..dfaf50f27 --- /dev/null +++ b/lib/parameters.py @@ -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 diff --git a/locale/fr/LC_MESSAGES/django.po b/locale/fr/LC_MESSAGES/django.po index b27fc70c8..a8a990bcc 100644 --- a/locale/fr/LC_MESSAGES/django.po +++ b/locale/fr/LC_MESSAGES/django.po @@ -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" diff --git a/static/js/settings.js b/static/js/settings.js index 014a8b98f..8e0721e6b 100644 --- a/static/js/settings.js +++ b/static/js/settings.js @@ -9,4 +9,6 @@ window.addEvent('domready', function() { if (!confirm(gettext("Remove this permission?"))) event.stop(); }); + + var tip = new Tips($$(".Tips")); }); \ No newline at end of file diff --git a/static/stylesheets/box.css b/static/stylesheets/box.css index 3368b9ac5..6b1331ce6 100644 --- a/static/stylesheets/box.css +++ b/static/stylesheets/box.css @@ -31,6 +31,14 @@ input:hover { background-color: #ffffcc; } +td.odd { + background: #F7F9Fb; +} + +td.even { + +} + .title { float: left; width: 100%; diff --git a/templates/admin/parameters.html b/templates/admin/parameters.html new file mode 100644 index 000000000..9a9c3711b --- /dev/null +++ b/templates/admin/parameters.html @@ -0,0 +1,42 @@ +{% extends "admin/settings_header.html" %} +{% block html_head %} + + +{% endblock %} +{% block menu %} +{% load admin_extras %} +{% settings_menu "parameters" perms %} +{% endblock %} +{% block setcontent %} +{% load i18n %} +{% url admin.views.saveparameters as action %} +
+ + + + + + {% for app, ps in params.items %} + {% for name, def in ps.items %} + + + + + {% endfor %} + {% endfor %} +
{% trans "Name" %}{% trans "Value" %}
{{ app }}::{{ name }} + {% if def.value %} + + {% else %} + + {% endif %} + {% if def.help %} + + + + {% endif %} +
+ +

+
+{% endblock %} diff --git a/templates/admin/permissions.html b/templates/admin/permissions.html index 1ecd1dee8..6295edf95 100644 --- a/templates/admin/permissions.html +++ b/templates/admin/permissions.html @@ -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 %} diff --git a/templates/admin/settings_menu.html b/templates/admin/settings_menu.html deleted file mode 100644 index 5463b8fd3..000000000 --- a/templates/admin/settings_menu.html +++ /dev/null @@ -1,18 +0,0 @@ -{% load i18n %} - diff --git a/urls.py b/urls.py index 9d999ca52..db5e81700 100644 --- a/urls.py +++ b/urls.py @@ -33,6 +33,6 @@ if menus != (): if settings.DEBUG: urlpatterns += patterns( '', - (r'^static/(?P.*)$', 'django.views.static.serve', {'document_root': '/home/tonio/projets/mailng/static'}) + (r'^static/(?P.*)$', 'django.views.static.serve', {'document_root': '/home/tonio/projets/devel/mailng/static'}) )