Automatically build configuration page menu
[cascardo/ipsilon.git] / ipsilon / admin / common.py
index 7620d3f..18b71ab 100755 (executable)
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
+import cherrypy
 from ipsilon.util.data import Store
 from ipsilon.util.page import Page
-from ipsilon.util.user import UserSession
-import cherrypy
-from ipsilon.login.common import FACILITY as LOGIN_FACILITY
-
-
-def admin_protect(fn):
-
-    def check(*args, **kwargs):
-        if UserSession().get_user().is_admin:
-            return fn(*args, **kwargs)
-
-        raise cherrypy.HTTPError(403)
+from ipsilon.util.page import admin_protect
 
-    return check
 
+class AdminPluginPage(Page):
 
-class LoginPluginPage(Page):
-
-    def __init__(self, obj, site, baseurl):
-        super(LoginPluginPage, self).__init__(site)
+    def __init__(self, obj, site, parent):
+        super(AdminPluginPage, self).__init__(site)
         self._obj = obj
-        self.url = '%s/%s' % (baseurl, obj.name)
+        self.title = '%s plugin' % obj.name
+        self.url = '%s/%s' % (parent.url, obj.name)
+        self.facility = parent.facility
+        self.menu = [parent]
 
         # Get the defaults
         self.plugin_config = obj.get_config_desc()
@@ -53,16 +44,17 @@ class LoginPluginPage(Page):
 
     @admin_protect
     def GET(self, *args, **kwargs):
-        return self._template('admin/login_plugin.html',
-                              title='%s plugin' % self._obj.name,
-                              name='admin_login_%s_form' % self._obj.name,
-                              action=self.url,
+        return self._template('admin/plugin_config.html', title=self.title,
+                              name='admin_%s_%s_form' % (self.facility,
+                                                         self._obj.name),
+                              menu=self.menu, action=self.url,
                               options=self.plugin_config)
 
     @admin_protect
     def POST(self, *args, **kwargs):
 
         message = "Nothing was modified."
+        message_type = "info"
         new_values = dict()
 
         for key, value in kwargs.iteritems():
@@ -76,22 +68,25 @@ class LoginPluginPage(Page):
             # First we try to save in the database
             try:
                 store = Store()
-                store.save_plugin_config(LOGIN_FACILITY,
+                store.save_plugin_config(self.facility,
                                          self._obj.name, new_values)
                 message = "New configuration saved."
+                message_type = "success"
             except Exception:  # pylint: disable=broad-except
                 message = "Failed to save data!"
+                message_type = "error"
 
             # And only if it succeeds we change the live object
             for name, value in new_values.items():
                 self._obj.set_config_value(name, value)
                 self.plugin_config[name][2] = value
 
-        return self._template('admin/login_plugin.html',
+        return self._template('admin/plugin_config.html', title=self.title,
                               message=message,
-                              title='%s plugin' % self._obj.name,
-                              name='admin_login_%s_form' % self._obj.name,
-                              action=self.url,
+                              message_type=message_type,
+                              name='admin_%s_%s_form' % (self.facility,
+                                                         self._obj.name),
+                              menu=self.menu, action=self.url,
                               options=self.plugin_config)
 
     def root(self, *args, **kwargs):
@@ -101,26 +96,22 @@ class LoginPluginPage(Page):
             return op(*args, **kwargs)
 
 
-class LoginPlugins(Page):
-    def __init__(self, site, baseurl):
-        super(LoginPlugins, self).__init__(site)
-        self.url = '%s/login' % baseurl
-
-        for plugin in self._site[LOGIN_FACILITY]['available']:
-            cherrypy.log.error('Admin login plugin: %s' % plugin)
-            obj = self._site[LOGIN_FACILITY]['available'][plugin]
-            self.__dict__[plugin] = LoginPluginPage(obj, self._site, self.url)
-
-
 class Admin(Page):
 
-    def __init__(self, *args, **kwargs):
-        super(Admin, self).__init__(*args, **kwargs)
-        self.url = '%s/admin' % self.basepath
-        self.login = LoginPlugins(self._site, self.url)
+    def __init__(self, site, mount):
+        super(Admin, self).__init__(site)
+        self.url = '%s/%s' % (self.basepath, mount)
+        self.menu = []
 
     def root(self, *args, **kwargs):
-        login_plugins = self._site[LOGIN_FACILITY]
-        return self._template('admin/index.html', title='Administration',
-                              available=login_plugins['available'],
-                              enabled=login_plugins['enabled'])
+        return self._template('admin/index.html',
+                              title='Configuration',
+                              menu=self.menu)
+
+    def add_subtree(self, name, page):
+        self.__dict__[name] = page
+        self.menu.append(page)
+
+    def del_subtree(self, name):
+        self.menu.remove(self.__dict__[name])
+        del self.__dict__[name]