runtime/NevowServer.py
changeset 2670 fd348d79a1f3
parent 2654 7575050a80c5
child 2672 4bc60e426dd6
--- a/runtime/NevowServer.py	Fri Jun 12 10:30:23 2020 +0200
+++ b/runtime/NevowServer.py	Fri Jun 12 14:39:32 2020 +0200
@@ -26,6 +26,7 @@
 from __future__ import absolute_import
 from __future__ import print_function
 import os
+import collections
 import platform as platform_module
 from zope.interface import implements
 from nevow import appserver, inevow, tags, loaders, athena, url, rend
@@ -165,8 +166,7 @@
         setattr(self, 'bind_' + name, _bind)
         self.bindingsNames.append(name)
 
-    def addSettings(self, name, desc, fields, btnlabel, callback, 
-                    addAfterName = None):
+    def addSettings(self, name, desc, fields, btnlabel, callback):
         def _bind(ctx):
             return annotate.MethodBinding(
                 'action_' + name,
@@ -180,32 +180,20 @@
 
         setattr(self, 'action_' + name, callback)
 
-        if addAfterName not in self.bindingsNames:
-            # Just append new setting if not yet present
-            if name not in self.bindingsNames:
-                self.bindingsNames.append(name)
-        else:
-            # We need to insert new setting 
-            # imediately _after_ addAfterName
+        self.bindingsNames.append(name)
             
-            # First remove new setting if already present
-            # to make sure it goes into correct place
-            if name in self.bindingsNames:
-                self.bindingsNames.remove(name)
-            # Now add new setting in correct place
-            self.bindingsNames.insert(
-                self.bindingsNames.index(addAfterName)+1,
-                name)
-            
-
-
-    def delSettings(self, name):
-        if name in self.bindingsNames:
-            self.bindingsNames.remove(name)
-
 
 ConfigurableSettings = ConfigurableBindings()
 
+def newExtensionSetting(ext_name):
+    global extensions_settings_od
+    settings = ConfigurableBindings()
+    extensions_settings_od[ext_name] = settings
+    return settings
+
+def removeExtensionSetting(ext_name):
+    global extensions_settings_od
+    extensions_settings_od.pop(ext_name)
 
 class ISettings(annotate.TypedInterface):
     platform = annotate.String(label=_("Platform"),
@@ -233,6 +221,7 @@
 customSettingsURLs = {
 }
 
+extensions_settings_od = collections.OrderedDict()
 
 class SettingsPage(rend.Page):
     # We deserve a slash
@@ -243,6 +232,25 @@
     child_webinterface_css = File(paths.AbsNeighbourFile(__file__, 'webinterface.css'), 'text/css')
 
     implements(ISettings)
+   
+    def __getattr__(self, name):
+        global extensions_settings_od
+        if name.startswith('configurable_'):
+            ext_name = name[13:]
+            def configurable_something(ctx):
+                return extensions_settings_od[ext_name]
+            return configurable_something
+        raise AttributeError
+    
+    def extensions_settings(self, context, data):
+        """ Project extensions settings
+        Extensions added to Configuration Tree in IDE have their setting rendered here
+        """
+        global extensions_settings_od
+        res = []
+        for ext_name in extensions_settings_od:
+            res += [tags.h2[ext_name], webform.renderForms(ext_name)] 
+        return res
 
     docFactory = loaders.stan([tags.html[
         tags.head[
@@ -260,12 +268,16 @@
             webform.renderForms('staticSettings'),
             tags.h1["Extensions settings:"],
             webform.renderForms('dynamicSettings'),
+            extensions_settings
         ]]])
 
     def configurable_staticSettings(self, ctx):
         return configurable.TypedInterfaceConfigurable(self)
 
     def configurable_dynamicSettings(self, ctx):
+        """ Runtime Extensions settings
+        Extensions loaded through Beremiz_service -e or optional runtime features render setting forms here
+        """
         return ConfigurableSettings
 
     def sendLogMessage(self, level, message, **kwargs):