+ return self.root_with_msg(message=message,
+ message_type=message_type)
+
+
+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):
+
+ if self._site[self.facility].is_readonly:
+ return self.parent.root_with_msg(
+ message="Configuration is marked Read-Only",
+ message_type=ADMIN_STATUS_WARN)
+
+ message = "Nothing was modified."
+ message_type = "info"
+ changed = None
+ cur_enabled = self._site[self.facility].enabled
+
+ if 'order' in kwargs:
+ order = kwargs['order'].split(',')
+ if len(order) != 0:
+ new_order = []
+ try:
+ for v in order:
+ val = v.strip()
+ if val not in cur_enabled:
+ error = "Invalid plugin name: %s" % val
+ raise ValueError(error)
+ new_order.append(val)
+ if len(new_order) < len(cur_enabled):
+ for val in cur_enabled:
+ if val not in new_order:
+ new_order.append(val)
+
+ self.parent.save_enabled_plugins(new_order)
+
+ # When all is saved update also live config. The
+ # live config is the ordered list of plugin names.
+ self._site[self.facility].refresh_enabled()
+
+ message = "New configuration saved."
+ message_type = ADMIN_STATUS_OK
+
+ changed = dict()
+ self.debug('%s -> %s' % (cur_enabled, new_order))
+ for i in range(0, len(cur_enabled)):
+ if cur_enabled[i] != new_order[i]:
+ changed[cur_enabled[i]] = 'reordered'
+
+ except ValueError, e:
+ message = str(e)
+ message_type = ADMIN_STATUS_ERROR
+
+ except Exception as e: # pylint: disable=broad-except
+ self.error('Failed to save data: %s' % e)
+ message = "Failed to save data!"
+ message_type = ADMIN_STATUS_ERROR
+
+ return self.parent.root_with_msg(message=message,
+ message_type=message_type,
+ changed=changed)
+
+
+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)
+
+ if self._site[facility] is None:
+ return
+
+ for plugin in self._site[facility].available:
+ cherrypy.log.error('Admin info plugin: %s' % plugin,
+ severity=logging.DEBUG)
+ 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):
+ self._site[self.facility].save_enabled(names)
+
+ def root_with_msg(self, message=None, message_type=None, changed=None):
+ plugins = self._site[self.facility]
+
+ if changed is None:
+ changed = dict()
+
+ targs = {'title': self.title,
+ 'menu': self._master.menu,
+ 'message': message,
+ 'message_type': message_type,
+ 'available': plugins.available,
+ 'enabled': plugins.enabled,
+ 'changed': changed,
+ 'baseurl': self.url,
+ 'newurl': 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()
+
+ def _get_plugin_obj(self, plugin):
+ plugins = self._site[self.facility]
+ if plugins.is_readonly:
+ msg = "Configuration is marked Read-Only"
+ raise AdminError(msg)
+ if plugin not in plugins.available:
+ msg = "Unknown plugin %s" % plugin
+ raise AdminError(msg)
+ obj = plugins.available[plugin]
+ if obj.is_readonly:
+ msg = "Plugin Configuration is marked Read-Only"
+ raise AdminError(msg)
+ return obj
+
+ @admin_protect
+ def enable(self, plugin):
+ msg = None
+ try:
+ obj = self._get_plugin_obj(plugin)
+ except AdminError, e:
+ return self.root_with_msg(str(e), ADMIN_STATUS_WARN)
+ if not obj.is_enabled:
+ try:
+ obj.enable()
+ except Exception as e: # pylint: disable=broad-except
+ return self.root_with_msg(str(e), ADMIN_STATUS_WARN)
+ obj.save_enabled_state()
+ msg = "Plugin %s enabled" % obj.name
+ return self.root_with_msg(msg, ADMIN_STATUS_OK,
+ changed={obj.name: 'enabled'})
+ enable.public_function = True
+
+ @admin_protect
+ def disable(self, plugin):
+ msg = None
+ try:
+ obj = self._get_plugin_obj(plugin)
+ except AdminError, e:
+ return self.root_with_msg(str(e), ADMIN_STATUS_WARN)
+ if obj.is_enabled:
+ try:
+ obj.disable()
+ except Exception as e: # pylint: disable=broad-except
+ return self.root_with_msg(str(e), ADMIN_STATUS_WARN)
+ obj.save_enabled_state()
+ msg = "Plugin %s disabled" % obj.name
+ return self.root_with_msg(msg, ADMIN_STATUS_OK,
+ changed={obj.name: 'disabled'})
+ disable.public_function = True