diff options
author | Simo Sorce <simo@redhat.com> | 2014-10-15 00:17:53 -0400 |
---|---|---|
committer | Patrick Uiterwijk <puiterwijk@redhat.com> | 2014-10-27 16:31:23 +0100 |
commit | fb1c34e7aeac67a75c29a132ded87edeb557cdaf (patch) | |
tree | f0e9d2fc9d4fe9a40dd83a1eb821f9764f9dbcf9 /ipsilon/admin/common.py | |
parent | 8e9018c40be3c2810dc7272bfae0f07e5841c32d (diff) | |
download | ipsilon-fb1c34e7aeac67a75c29a132ded87edeb557cdaf.tar.gz ipsilon-fb1c34e7aeac67a75c29a132ded87edeb557cdaf.tar.xz ipsilon-fb1c34e7aeac67a75c29a132ded87edeb557cdaf.zip |
Improve UI for enabling/disabling plugins config
Use the same templates for both info and login plugins
Signed-off-by: Simo Sorce <simo@redhat.com>
Reviewed-by: Patrick Uiterwijk <puiterwijk@redhat.com>
Diffstat (limited to 'ipsilon/admin/common.py')
-rwxr-xr-x | ipsilon/admin/common.py | 157 |
1 files changed, 155 insertions, 2 deletions
diff --git a/ipsilon/admin/common.py b/ipsilon/admin/common.py index 7f723ac..827038e 100755 --- a/ipsilon/admin/common.py +++ b/ipsilon/admin/common.py @@ -20,6 +20,7 @@ import cherrypy from ipsilon.util.page import Page from ipsilon.util.page import admin_protect +from ipsilon.util.plugin import PluginObject class AdminPage(Page): @@ -34,10 +35,10 @@ class AdminPage(Page): self.auth_protect = True -class AdminPluginPage(AdminPage): +class AdminPluginConfig(AdminPage): def __init__(self, po, site, parent): - super(AdminPluginPage, self).__init__(site, form=True) + super(AdminPluginConfig, self).__init__(site, form=True) self._po = po self.title = '%s plugin' % po.name self.url = '%s/%s' % (parent.url, po.name) @@ -114,6 +115,158 @@ class AdminPluginPage(AdminPage): plugin=self._po) +class AdminPluginsOrder(AdminPage): + + def __init__(self, site, parent, facility): + super(AdminPluginsOrder, self).__init__(site, form=True) + self.parent = parent + self.facility = facility + self.url = '%s/order' % parent.url + self.menu = [parent] + + @admin_protect + def GET(self, *args, **kwargs): + return self.parent.root_with_msg() + + @admin_protect + def POST(self, *args, **kwargs): + message = "Nothing was modified." + message_type = "info" + by_name = {p.name: p for p in self._site[self.facility]['enabled']} + + if 'order' in kwargs: + order = kwargs['order'].split(',') + if len(order) != 0: + new_names = [] + new_plugins = [] + try: + for v in order: + val = v.strip() + if val not in by_name: + error = "Invalid plugin name: %s" % val + raise ValueError(error) + new_names.append(val) + new_plugins.append(by_name[val]) + if len(new_names) < len(by_name): + for val in by_name: + if val not in new_names: + new_names.append(val) + new_plugins.append(by_name[val]) + + self.parent.save_enabled_plugins(new_names) + self.parent.reorder_plugins(new_names) + + # When all is saved update also live config. The + # live config is a list of the actual plugin + # objects. + self._site[self.facility]['enabled'] = new_plugins + + message = "New configuration saved." + message_type = "success" + + except ValueError, e: + message = str(e) + message_type = "error" + + except Exception, e: # pylint: disable=broad-except + message = "Failed to save data!" + message_type = "error" + + return self.parent.root_with_msg(message=message, + message_type=message_type) + + +class AdminPlugins(AdminPage): + def __init__(self, name, site, parent, facility, ordered=True): + super(AdminPlugins, self).__init__(site) + self._master = parent + self.name = name + self.title = '%s plugins' % name + self.url = '%s/%s' % (parent.url, name) + self.facility = facility + self.template = 'admin/plugins.html' + self.order = None + parent.add_subtree(name, self) + + for plugin in self._site[facility]['available']: + cherrypy.log.error('Admin info plugin: %s' % plugin) + obj = self._site[facility]['available'][plugin] + page = AdminPluginConfig(obj, self._site, self) + if hasattr(obj, 'admin'): + obj.admin.mount(page) + self.add_subtree(plugin, page) + + if ordered: + self.order = AdminPluginsOrder(self._site, self, facility) + + def save_enabled_plugins(self, names): + po = PluginObject() + po.name = "global" + globalconf = dict() + globalconf['order'] = ','.join(names) + po.set_config(globalconf) + po.save_plugin_config(self.facility) + + def reorder_plugins(self, names): + return + + def root_with_msg(self, message=None, message_type=None): + plugins = self._site[self.facility] + enabled = [] + for p in plugins['enabled']: + enabled.append(p.name) + targs = {'title': self.title, + 'menu': self._master.menu, + 'message': message, + 'message_type': message_type, + 'available': plugins['available'], + 'enabled': enabled, + 'baseurl': self.url} + if self.order: + targs['order_name'] = '%s_order_form' % self.name + targs['order_action'] = self.order.url + + # pylint: disable=star-args + return self._template(self.template, **targs) + + def root(self, *args, **kwargs): + return self.root_with_msg() + + @admin_protect + def enable(self, plugin): + msg = None + plugins = self._site[self.facility] + if plugin not in plugins['available']: + msg = "Unknown plugin %s" % plugin + return self.root_with_msg(msg, "error") + obj = plugins['available'][plugin] + if obj not in plugins['enabled']: + obj.enable(self._site) + if self.order: + enabled = list(x.name for x in plugins['enabled']) + self.save_enabled_plugins(enabled) + msg = "Plugin %s enabled" % obj.name + return self.root_with_msg(msg, "success") + enable.public_function = True + + @admin_protect + def disable(self, plugin): + msg = None + plugins = self._site[self.facility] + if plugin not in plugins['available']: + msg = "Unknown plugin %s" % plugin + return self.root_with_msg(msg, "error") + obj = plugins['available'][plugin] + if obj in plugins['enabled']: + obj.disable(self._site) + if self.order: + enabled = list(x.name for x in plugins['enabled']) + self.save_enabled_plugins(enabled) + msg = "Plugin %s disabled" % obj.name + return self.root_with_msg(msg, "success") + disable.public_function = True + + class Admin(AdminPage): def __init__(self, site, mount): |