From affbfb2fd7d23b529154e22ddabc673659401cee Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Tue, 13 Dec 2011 16:56:43 +0100 Subject: [PATCH] New event callbacks to update the list of available applications when an extension is disabled/enabled. fixed #185 --- admin/__init__.py | 41 ++++++++++++++++++++++++++++------------- admin/views.py | 4 ++-- lib/events.py | 3 +++ lib/parameters.py | 46 +++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 78 insertions(+), 16 deletions(-) diff --git a/admin/__init__.py b/admin/__init__.py index 1003d4e9d..c886038f4 100644 --- a/admin/__init__.py +++ b/admin/__init__.py @@ -24,22 +24,27 @@ parameters.register_admin("PASSWORD_SCHEME", type="list", deflt="crypt", parameters.register_admin("ITEMS_PER_PAGE", type="int", deflt=30, help=_("Number of displayed items per page")) -# -# Quick fix for #184 -# -# Just catch the DatabaseError exception raised when runnning the -# first ``syncdb`` command. -# -try: - enabled_extensions = list(Extension.objects.filter(enabled=True)) -except DatabaseError: - enabled_extensions = [] +def enabled_applications(): + """Return the list of currently enabled extensions + + Quick fix for #184: + + Just catch the DatabaseError exception raised when runnning the + first ``syncdb`` command. + + :return: a list + """ + result = [("admin", "admin"), ("userprefs", "userprefs")] + try: + exts = list(Extension.objects.filter(enabled=True)) + except DatabaseError: + exts = [] + result += map(lambda ext: (ext.name, ext.name), exts) + return sorted(result) parameters.register_admin("DEFAULT_TOP_REDIRECTION", type="list", deflt="admin", app="general", - values=sorted([("admin", "admin"), ("userprefs", "userprefs")] \ - + map(lambda ext: (ext.name, ext.name), - enabled_extensions)), + values=enabled_applications(), help=_("The default redirection used when no application is specified")) def unset_default_topredirection(**kwargs): @@ -51,4 +56,14 @@ def unset_default_topredirection(**kwargs): if topredirection == kwargs["ext"].name: parameters.save_admin("DEFAULT_TOP_REDIRECTION", "userprefs", app="general") +def update_available_applications(**kwargs): + """Simple callback to update the list of available applications + + Must be called each time an extension is disabled/enabled. + """ + parameters.update_admin("DEFAULT_TOP_REDIRECTION", app="general", + values=enabled_applications()) + events.register("ExtDisabled", unset_default_topredirection) +events.register("ExtDisabled", update_available_applications) +events.register("ExtEnabled", update_available_applications) diff --git a/admin/views.py b/admin/views.py index a6f39b6d5..7c7b56472 100644 --- a/admin/views.py +++ b/admin/views.py @@ -596,16 +596,16 @@ def saveextensions(request): parts = k.split("_", 1) dbext = Extension.objects.get(name=parts[1]) if not dbext in actived_exts: - dbext.on() dbext.enabled = True dbext.save() + dbext.on() else: found += [dbext] for ext in actived_exts: if not ext in found: - ext.off() ext.enabled = False ext.save() + ext.off() messages.info(request, _("Modifications applied."), fail_silently=True) return HttpResponseRedirect(reverse(admin.views.viewextensions)) diff --git a/lib/events.py b/lib/events.py index 434dd358a..732ea08bc 100644 --- a/lib/events.py +++ b/lib/events.py @@ -1,6 +1,9 @@ # -*- coding: utf-8 -*- """ +:mod:`events` --- simple events handling +---------------------------------------- + This module provides a simple way of managing events between Modoboa core application and additional components. diff --git a/lib/parameters.py b/lib/parameters.py index 2e01e6d23..59ddc6e25 100644 --- a/lib/parameters.py +++ b/lib/parameters.py @@ -36,7 +36,12 @@ def __is_defined(app, level, name): def __register(app, level, name, **kwargs): """Register a new parameter. - app corresponds to a core component (admin, main) or an extension. + ``app`` corresponds to a core component (admin, main) or to an + extension. + + :param name: the application's name + :param level: the level this parameter is available from + :param name: the parameter's name """ if not app in _params.keys(): _params[app] = {} @@ -53,7 +58,24 @@ def __register(app, level, name, **kwargs): for k, v in kwargs.iteritems(): _params[app][level][name][k] = v +def __update(app, level, name, **kwargs): + """Update a parameter's definition + + :param app: the application's name + :param level: the level this parameter is available from + :param name: the parameter's name + """ + if not app in _params.keys() or not level in _levels.keys() \ + or not _params[app][level].has_key(name): + return + for k, v in kwargs.iteritems(): + _params[app][level][name][k] = v + def __guess_extension(): + """Tries to guess the application's name by inspecting the stack + + :return: a string or None + """ modname = inspect.getmodule(inspect.stack()[2][0]).__name__ m = re.match("(?:modoboa\.)?(?:extensions\.)?([^\.$]+)", modname) if m: @@ -61,6 +83,13 @@ def __guess_extension(): return None def register_admin(name, **kwargs): + """Register a new parameter (admin level) + + Each parameter is associated to one application. If no application + is provided, the function tries to guess the appropriate one. + + :param name: the parameter's name + """ if kwargs.has_key("app"): app = kwargs["app"] del kwargs["app"] @@ -68,6 +97,21 @@ def register_admin(name, **kwargs): app = __guess_extension() return __register(app, 'A', name, **kwargs) +def update_admin(name, **kwargs): + """Update a parameter's definition (admin level) + + Each parameter is associated to one application. If no application + is provided, the function tries to guess the appropriate one. + + :param name: the parameter's name + """ + if kwargs.has_key("app"): + app = kwargs["app"] + del kwargs["app"] + else: + app = __guess_extension() + return __update(app, 'A', name, **kwargs) + def register_user(name, **kwargs): if kwargs.has_key("app"): app = kwargs["app"]