From 1c3fddb84993c6cef0ab5877863aa27ac879aa98 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Wed, 1 Feb 2012 10:56:15 +0100 Subject: [PATCH] Don't display preferences of extensions that require a mailbox. see #198 --- extensions/sievefilters/__init__.py | 2 + extensions/webmail/__init__.py | 3 +- lib/parameters.py | 77 ++++++++++++++++++++++++----- userprefs/views.py | 4 ++ 4 files changed, 72 insertions(+), 14 deletions(-) diff --git a/extensions/sievefilters/__init__.py b/extensions/sievefilters/__init__.py index 9905c097b..ed6043711 100644 --- a/extensions/sievefilters/__init__.py +++ b/extensions/sievefilters/__init__.py @@ -8,6 +8,8 @@ from sievelib.managesieve import SUPPORTED_AUTH_MECHS baseurl = "sfilters" def load(): + parameters.register_app(uparams_opts=dict(needs_mailbox=True)) + parameters.register_admin("SERVER", type="string", deflt="127.0.0.1", help=_("Address of your MANAGESIEVE server")) diff --git a/extensions/webmail/__init__.py b/extensions/webmail/__init__.py index a3f2e3bc1..65582503e 100644 --- a/extensions/webmail/__init__.py +++ b/extensions/webmail/__init__.py @@ -5,6 +5,8 @@ from modoboa.lib import events, parameters from modoboa.lib.webutils import static_url def load(): + parameters.register_app(uparams_opts=dict(needs_mailbox=True)) + parameters.register_admin("IMAP_SERVER", type="string", deflt="127.0.0.1", help=_("Address of your IMAP server")) @@ -30,7 +32,6 @@ def load(): parameters.register_admin("MAX_ATTACHMENT_SIZE", type="int", deflt=2048, help=_("Maximum attachment size in bytes (or KB, MB, GB if specified)")) - parameters.register_user("MESSAGES_PER_PAGE", type="int", deflt=40, label=_("Number of displayed emails per page"), help=_("Sets the maximum number of messages displayed in a page")) diff --git a/lib/parameters.py b/lib/parameters.py index 59ddc6e25..dfe27217a 100644 --- a/lib/parameters.py +++ b/lib/parameters.py @@ -27,6 +27,49 @@ class NotDefined(Exception): return "Application '%s' and/or parameter '%s' not defined" \ % (self.app, self.name) +def register_app(app=None, aparams_opts=None, uparams_opts=None): + """Manually register an application + + You don't need to call this function unless you want to provide + specific options for your application parameters. + + For example, you can indicate that user-level parameters are only + accessible for users that own a mailbox. + + :param app: the application's name + :param aparams_opts: a dict containing options applicable to admin-level params + :param uparams_opts: a dict containing options applicable to user-level params + """ + if app is None: + app = __guess_extension() + + if _params.has_key(app): + return + _params[app] = {} + _params[app]['options'] = {} + _params_order[app] = {} + for lvl in _levels.keys(): + _params[app][lvl] = {} + _params_order[app][lvl] = [] + + if aparams_opts: + _params[app]['options']['A'] = aparams_opts + if uparams_opts: + _params[app]['options']['U'] = uparams_opts + +def unregister_app(app): + """Unregister an application + + All parameters associated to this application will also be + removed. + + :param app: the application's name (string) + """ + if not _params.has_key(app): + return False + del _params[app] + return True + def __is_defined(app, level, name): if not level in _levels.keys() \ or not app in _params.keys() \ @@ -44,11 +87,8 @@ def __register(app, level, name, **kwargs): :param name: the parameter's name """ if not app in _params.keys(): - _params[app] = {} - _params_order[app] = {} - for lvl in _levels.keys(): - _params[app][lvl] = {} - _params_order[app][lvl] = [] + register_app(app) + if not level in _levels.keys(): return if _params[app][level].has_key(name): @@ -113,6 +153,10 @@ def update_admin(name, **kwargs): return __update(app, 'A', name, **kwargs) def register_user(name, **kwargs): + """Register a new user-level parameter + + :param name: the parameter's name + """ if kwargs.has_key("app"): app = kwargs["app"] del kwargs["app"] @@ -120,12 +164,6 @@ def register_user(name, **kwargs): app = __guess_extension() return __register(app, 'U', name, **kwargs) -def unregister_app(app): - if not _params.has_key(app): - return False - del _params[app] - return True - def save_admin(name, value, app=None): from models import Parameter @@ -157,7 +195,7 @@ def save_user(user, name, value, app=None): p.user = user p.name = fullname if p.value != value: - p.value = str(value).encode("string_escape").strip() + p.value = value.encode("unicode_escape").strip() p.save() return True @@ -183,4 +221,17 @@ def get_user(user, name, app=None): p = UserParameter.objects.get(user=user, name="%s.%s" % (app, name)) except UserParameter.DoesNotExist: return _params[app]["U"][name]["deflt"] - return p.value.decode("string_escape") + try: + dvalue = p.value.decode("string_escape") + except ValueError: + dvalue = p.value + return dvalue + +def get_app_option(lvl, name, dflt, app=None): + if app is None: + app = __guess_extension() + if not lvl in _params[app]['options']: + return dflt + if not _params[app]['options'][lvl].has_key(name): + return dflt + return _params[app]['options'][lvl][name] diff --git a/userprefs/views.py b/userprefs/views.py index 0f996a8d6..287995afc 100644 --- a/userprefs/views.py +++ b/userprefs/views.py @@ -95,6 +95,10 @@ def preferences(request): for app in apps: if not len(parameters._params[app]['U']): continue + if parameters.get_app_option('U', 'needs_mailbox', False, app=app) \ + and not request.user.has_mailbox: + continue + tmp = {"name" : app, "params" : []} for p in parameters._params_order[app]['U']: param_def = parameters._params[app]['U'][p]