runtime/NevowServer.py
branchsvghmi
changeset 2982 1627d552f181
parent 2672 4bc60e426dd6
child 2700 144b149cded4
--- a/runtime/NevowServer.py	Thu Jun 18 10:42:08 2020 +0200
+++ b/runtime/NevowServer.py	Thu Jun 18 11:00:26 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
@@ -180,10 +181,19 @@
         setattr(self, 'action_' + name, callback)
 
         self.bindingsNames.append(name)
-
+            
 
 ConfigurableSettings = ConfigurableBindings()
 
+def newExtensionSetting(display, token):
+    global extensions_settings_od
+    settings = ConfigurableBindings()
+    extensions_settings_od[token] = (settings, display)
+    return settings
+
+def removeExtensionSetting(token):
+    global extensions_settings_od
+    extensions_settings_od.pop(token)
 
 class ISettings(annotate.TypedInterface):
     platform = annotate.String(label=_("Platform"),
@@ -211,6 +221,7 @@
 customSettingsURLs = {
 }
 
+extensions_settings_od = collections.OrderedDict()
 
 class SettingsPage(rend.Page):
     # We deserve a slash
@@ -221,6 +232,27 @@
     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_'):
+            token = name[13:]
+            def configurable_something(ctx):
+                settings, _display = extensions_settings_od[token]
+                return settings
+            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 token in extensions_settings_od:
+            _settings, display = extensions_settings_od[token]
+            res += [tags.h2[display], webform.renderForms(token)] 
+        return res
 
     docFactory = loaders.stan([tags.html[
         tags.head[
@@ -238,12 +270,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):