--- a/runtime/NevowServer.py Fri Jun 15 09:48:05 2018 +0200
+++ b/runtime/NevowServer.py Fri Jun 22 12:43:33 2018 +0200
@@ -26,11 +26,17 @@
from __future__ import absolute_import
from __future__ import print_function
-from nevow import appserver, inevow, tags, loaders, athena
+from zope.interface import implements +from nevow import appserver, inevow, tags, loaders, athena, url, rend from nevow.page import renderer
+from formless import annotate +from formless import webform from twisted.internet import reactor
import util.paths as paths
+PAGE_TITLE = 'Beremiz Runtime Web Interface' xhtml_header = '''<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
@@ -49,7 +55,6 @@
def HMIinitialisation(self):
self.HMIinitialised(None)
class DefaultPLCStartedHMI(PLCHMI):
docFactory = loaders.stan(
tags.div(render=tags.directive('liveElement'))[
@@ -119,19 +124,86 @@
for child in self.liveFragmentChildren[:]:
+ 'gateway': '192.168.1.1', + 'mask': '255.255.255.0', +def defaultVal(category): + def _defaultVal(ctx,argument): + return lastKnownConfig[category].get(argument.name, None) +class ISettings(annotate.TypedInterface): + ctx = annotate.Context(), + mode = annotate.Choice(["DHCP", "Static"], + label=_("Configuration type"), + default=defaultVal('net')), + IP = annotate.String(label=_("IP address"),default=defaultVal('net')), + gateway = annotate.String(label=_("Gateway address"), + default=defaultVal('net')), + mask = annotate.String(label=_("Network mask"),default=defaultVal('net')), + DNS = annotate.String(label=_("DNS address"),default=defaultVal('net'))): + networkConfig = annotate.autocallable(networkConfig, label=_("Network settings"), action="Set", ) +class SettingsPage(rend.Page): + # This makes webform_css url answer some default CSS + child_webform_css = webform.defaultCSS + def networkConfig(*args, **kwargs): + lastKnownConfig['net'] = kwargs + docFactory = loaders.stan([tags.html[ + tags.title[_("Beremiz Runtime Settings")], + tags.link(rel='stylesheet', + href=url.here.child("webform_css")) class WebInterface(athena.LivePage):
docFactory = loaders.stan([tags.raw(xhtml_header),
tags.html(xmlns="http://www.w3.org/1999/xhtml")[
- tags.head(render=tags.directive('liveglue')),
+ tags.head(render=tags.directive('liveglue'))[ + tags.title[PAGE_TITLE], + tags.link(rel='stylesheet', + href=url.here.child("webform_css")) - tags.div(render=tags.directive("MainPage"))
+ tags.div(render=tags.directive("MainPage")), + def child_settings(self, context): def __init__(self, plcState=False, *a, **kw):
super(WebInterface, self).__init__(*a, **kw)
self.jsModules.mapping[u'WebInterface'] = paths.AbsNeighbourFile(__file__, 'webinterface.js')
@@ -184,6 +256,7 @@
# print "We will be called back when the client disconnects"
def RegisterWebsite(port):
site = appserver.NevowSite(website)
@@ -192,7 +265,6 @@
print(_('HTTP interface port :'), port)
class statuslistener(object):
def __init__(self, site):
@@ -209,3 +281,7 @@
def website_statuslistener_factory(site):
return statuslistener(site).listen