Add AdminPage abstraction on top of util.Page
[cascardo/ipsilon.git] / ipsilon / admin / login.py
index 62522fc..62e0a0e 100755 (executable)
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 import cherrypy
-from ipsilon.util.page import Page
-from ipsilon.util.page import admin_protect
+from ipsilon.util.page import admin_protect, auth_protect
 from ipsilon.util.plugin import PluginObject
 from ipsilon.admin.common import AdminPluginPage
+from ipsilon.admin.common import AdminPage
 from ipsilon.login.common import FACILITY
 
 
-class LoginPluginsOrder(Page):
+def save_enabled_plugins(names):
+    po = PluginObject()
+    po.name = "global"
+    globalconf = dict()
+    globalconf['order'] = ','.join(names)
+    po.set_config(globalconf)
+    po.save_plugin_config(FACILITY)
+
+
+class LoginPluginsOrder(AdminPage):
 
     def __init__(self, site, parent):
         super(LoginPluginsOrder, self).__init__(site, form=True)
         self.url = '%s/order' % parent.url
         self.menu = [parent]
 
+    def _reorder_plugins(self, order):
+        plugins = self._site[FACILITY]['available']
+        root = self._site[FACILITY]['root']
+        prev_obj = None
+        for name in order:
+            if prev_obj is None:
+                root.first_login = plugins[name]
+            else:
+                prev_obj.next_login = plugins[name]
+            prev_obj = plugins[name]
+        prev_obj.next_login = None
+
     @admin_protect
     def GET(self, *args, **kwargs):
         opts = [p.name for p in self._site[FACILITY]['enabled']]
@@ -66,12 +87,8 @@ class LoginPluginsOrder(Page):
                                 new_names.append(val)
                                 new_plugins.append(plugins_by_name[val])
 
-                    po = PluginObject()
-                    po.name = "global"
-                    globalconf = dict()
-                    globalconf['order'] = ','.join(new_names)
-                    po.set_config(globalconf)
-                    po.save_plugin_config(FACILITY)
+                    save_enabled_plugins(new_names)
+                    self._reorder_plugins(new_names)
 
                     # When all is saved update also live config. The
                     # live config is a list of the actual plugin
@@ -99,7 +116,7 @@ class LoginPluginsOrder(Page):
                               options=opts)
 
 
-class LoginPlugins(Page):
+class LoginPlugins(AdminPage):
     def __init__(self, site, parent):
         super(LoginPlugins, self).__init__(site)
         self._master = parent
@@ -127,9 +144,11 @@ class LoginPlugins(Page):
                               enabled=ordered,
                               menu=self._master.menu)
 
+    @auth_protect
     def root(self, *args, **kwargs):
         return self.root_with_msg()
 
+    @admin_protect
     def enable(self, plugin):
         msg = None
         plugins = self._site[FACILITY]
@@ -139,10 +158,12 @@ class LoginPlugins(Page):
         obj = plugins['available'][plugin]
         if obj not in plugins['enabled']:
             obj.enable(self._site)
+            save_enabled_plugins(list(x.name for x in plugins['enabled']))
             msg = "Plugin %s enabled" % obj.name
         return self.root_with_msg(msg, "success")
-    enable.exposed = True
+    enable.public_function = True
 
+    @admin_protect
     def disable(self, plugin):
         msg = None
         plugins = self._site[FACILITY]
@@ -152,6 +173,7 @@ class LoginPlugins(Page):
         obj = plugins['available'][plugin]
         if obj in plugins['enabled']:
             obj.disable(self._site)
+            save_enabled_plugins(list(x.name for x in plugins['enabled']))
             msg = "Plugin %s disabled" % obj.name
         return self.root_with_msg(msg, "success")
-    disable.exposed = True
+    disable.public_function = True