runtime/NevowServer.py
author Edouard Tisserant
Wed, 29 Nov 2023 11:54:56 +0100
changeset 3861 7e17f7e02a2b
parent 3858 dcc83e03d065
child 3881 0b3ac94f494c
permissions -rw-r--r--
Runtime: add GetVersions() call to PLCObject, use it in web settings and expose it in WAMP and Pyro.

Note: WAMP changes are untested
1511
91538d0c242c add copyright notices to python files where there were missing, that
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1453
diff changeset
     1
#!/usr/bin/env python
91538d0c242c add copyright notices to python files where there were missing, that
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1453
diff changeset
     2
# -*- coding: utf-8 -*-
91538d0c242c add copyright notices to python files where there were missing, that
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1453
diff changeset
     3
1667
cefc9219bb48 runtime is licensed under LGPLv2.1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1595
diff changeset
     4
# This file is part of Beremiz runtime.
1511
91538d0c242c add copyright notices to python files where there were missing, that
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1453
diff changeset
     5
#
91538d0c242c add copyright notices to python files where there were missing, that
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1453
diff changeset
     6
# Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD
1680
6db967480b7d make run Beremiz and PLCOpen Editor, if full path contain non-lating
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1667
diff changeset
     7
# Copyright (C) 2017: Andrey Skvortsov
1511
91538d0c242c add copyright notices to python files where there were missing, that
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1453
diff changeset
     8
#
1667
cefc9219bb48 runtime is licensed under LGPLv2.1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1595
diff changeset
     9
# See COPYING.Runtime file for copyrights details.
1511
91538d0c242c add copyright notices to python files where there were missing, that
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1453
diff changeset
    10
#
1667
cefc9219bb48 runtime is licensed under LGPLv2.1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1595
diff changeset
    11
# This library is free software; you can redistribute it and/or
cefc9219bb48 runtime is licensed under LGPLv2.1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1595
diff changeset
    12
# modify it under the terms of the GNU Lesser General Public
cefc9219bb48 runtime is licensed under LGPLv2.1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1595
diff changeset
    13
# License as published by the Free Software Foundation; either
cefc9219bb48 runtime is licensed under LGPLv2.1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1595
diff changeset
    14
# version 2.1 of the License, or (at your option) any later version.
cefc9219bb48 runtime is licensed under LGPLv2.1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1595
diff changeset
    15
cefc9219bb48 runtime is licensed under LGPLv2.1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1595
diff changeset
    16
# This library is distributed in the hope that it will be useful,
1511
91538d0c242c add copyright notices to python files where there were missing, that
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1453
diff changeset
    17
# but WITHOUT ANY WARRANTY; without even the implied warranty of
1667
cefc9219bb48 runtime is licensed under LGPLv2.1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1595
diff changeset
    18
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
cefc9219bb48 runtime is licensed under LGPLv2.1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1595
diff changeset
    19
# Lesser General Public License for more details.
cefc9219bb48 runtime is licensed under LGPLv2.1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1595
diff changeset
    20
cefc9219bb48 runtime is licensed under LGPLv2.1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1595
diff changeset
    21
# You should have received a copy of the GNU Lesser General Public
cefc9219bb48 runtime is licensed under LGPLv2.1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1595
diff changeset
    22
# License along with this library; if not, write to the Free Software
cefc9219bb48 runtime is licensed under LGPLv2.1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1595
diff changeset
    23
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
1511
91538d0c242c add copyright notices to python files where there were missing, that
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1453
diff changeset
    24
1826
91796f408540 fix usage of python2-only print statement
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    25
1881
091005ec69c4 fix pylint py3k conversion warning: "(no-absolute-import) import missing `from __future__ import absolute_import`"
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1878
diff changeset
    26
from __future__ import absolute_import
1826
91796f408540 fix usage of python2-only print statement
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    27
from __future__ import print_function
1438
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    28
import os
2670
fd348d79a1f3 BACnet and Modbus : Simpler configuration management. NevowServer.py now allows each extension to create and delete multiple configuration forms in the setting page, deprecating delSettings and addAfter.
Edouard Tisserant
parents: 2654
diff changeset
    29
import collections
3703
4b75f1506ea1 Runtime: add arbitrary file upload to working dir in web interface
Edouard Tisserant
parents: 3440
diff changeset
    30
import shutil
2208
32dcacb67f7a Embrio of setting form, just to test
Edouard Tisserant
parents: 1919
diff changeset
    31
from zope.interface import implements
32dcacb67f7a Embrio of setting form, just to test
Edouard Tisserant
parents: 1919
diff changeset
    32
from nevow import appserver, inevow, tags, loaders, athena, url, rend
1438
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    33
from nevow.page import renderer
2266
ed415982a9aa NevowServer : Added minimalist css style customization and a link to go to settings page and back
dporopat <denis.poropat@smarteh.si>
parents: 2219
diff changeset
    34
from nevow.static import File
2208
32dcacb67f7a Embrio of setting form, just to test
Edouard Tisserant
parents: 1919
diff changeset
    35
from formless import annotate
32dcacb67f7a Embrio of setting form, just to test
Edouard Tisserant
parents: 1919
diff changeset
    36
from formless import webform
2209
ee2675e4778d Now, runtime extensions should be able to add their own settings to web configuration interface.
Edouard Tisserant
parents: 2208
diff changeset
    37
from formless import configurable
1439
a68cd4253259 Added stub code for runtime WAMP client. Added runtime command line switch to select WAMP url and Nevow web site port. Web port is now fixed, next port number is not tested if bind fails.
Edouard Tisserant
parents: 1438
diff changeset
    38
from twisted.internet import reactor
2210
81949104291d Nevow based web interface now show simple Log message sending form for basic runtime, and allow extensions to add their own web settings.
Edouard Tisserant
parents: 2209
diff changeset
    39
1919
ccea0fa6ea91 Another set of meaningless changes to satisfy PEP8 and PyLint.
Edouard Tisserant
parents: 1881
diff changeset
    40
import util.paths as paths
2210
81949104291d Nevow based web interface now show simple Log message sending form for basic runtime, and allow extensions to add their own web settings.
Edouard Tisserant
parents: 2209
diff changeset
    41
from runtime.loglevels import LogLevels, LogLevelsDict
2700
144b149cded4 runtime: added restart/reset button in web settings. Accidentaly fixed web settings logging feature.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2672
diff changeset
    42
from runtime import MainWorker, GetPLCObjectSingleton
1438
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    43
2208
32dcacb67f7a Embrio of setting form, just to test
Edouard Tisserant
parents: 1919
diff changeset
    44
PAGE_TITLE = 'Beremiz Runtime Web Interface'
32dcacb67f7a Embrio of setting form, just to test
Edouard Tisserant
parents: 1919
diff changeset
    45
1438
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    46
xhtml_header = '''<?xml version="1.0" encoding="utf-8"?>
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    47
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    48
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    49
'''
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    50
1453
f31353cac197 Fixed Nevow website startup
Edouard Tisserant
parents: 1439
diff changeset
    51
WorkingDir = None
f31353cac197 Fixed Nevow website startup
Edouard Tisserant
parents: 1439
diff changeset
    52
1736
7e61baa047f0 clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1682
diff changeset
    53
1438
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    54
class PLCHMI(athena.LiveElement):
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    55
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    56
    initialised = False
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    57
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    58
    def HMIinitialised(self, result):
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    59
        self.initialised = True
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    60
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    61
    def HMIinitialisation(self):
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    62
        self.HMIinitialised(None)
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    63
2246
51047284cb0e pep8 on runtime/NevowServer.py
Edouard Tisserant
parents: 2219
diff changeset
    64
1438
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    65
class DefaultPLCStartedHMI(PLCHMI):
1878
fb73a6b6622d fix pylint warning '(bad-continuation) Wrong hanging indentation before block'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1870
diff changeset
    66
    docFactory = loaders.stan(
fb73a6b6622d fix pylint warning '(bad-continuation) Wrong hanging indentation before block'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1870
diff changeset
    67
        tags.div(render=tags.directive('liveElement'))[
fb73a6b6622d fix pylint warning '(bad-continuation) Wrong hanging indentation before block'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1870
diff changeset
    68
            tags.h1["PLC IS NOW STARTED"],
fb73a6b6622d fix pylint warning '(bad-continuation) Wrong hanging indentation before block'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1870
diff changeset
    69
        ])
1438
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    70
1736
7e61baa047f0 clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1682
diff changeset
    71
1438
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    72
class PLCStoppedHMI(PLCHMI):
1878
fb73a6b6622d fix pylint warning '(bad-continuation) Wrong hanging indentation before block'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1870
diff changeset
    73
    docFactory = loaders.stan(
fb73a6b6622d fix pylint warning '(bad-continuation) Wrong hanging indentation before block'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1870
diff changeset
    74
        tags.div(render=tags.directive('liveElement'))[
fb73a6b6622d fix pylint warning '(bad-continuation) Wrong hanging indentation before block'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1870
diff changeset
    75
            tags.h1["PLC IS STOPPED"],
fb73a6b6622d fix pylint warning '(bad-continuation) Wrong hanging indentation before block'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1870
diff changeset
    76
        ])
1438
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    77
1736
7e61baa047f0 clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1682
diff changeset
    78
1438
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    79
class MainPage(athena.LiveElement):
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    80
    jsClass = u"WebInterface.PLC"
1878
fb73a6b6622d fix pylint warning '(bad-continuation) Wrong hanging indentation before block'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1870
diff changeset
    81
    docFactory = loaders.stan(
2266
ed415982a9aa NevowServer : Added minimalist css style customization and a link to go to settings page and back
dporopat <denis.poropat@smarteh.si>
parents: 2219
diff changeset
    82
        tags.invisible[
ed415982a9aa NevowServer : Added minimalist css style customization and a link to go to settings page and back
dporopat <denis.poropat@smarteh.si>
parents: 2219
diff changeset
    83
            tags.div(render=tags.directive('liveElement'))[
ed415982a9aa NevowServer : Added minimalist css style customization and a link to go to settings page and back
dporopat <denis.poropat@smarteh.si>
parents: 2219
diff changeset
    84
                tags.div(id='content')[
ed415982a9aa NevowServer : Added minimalist css style customization and a link to go to settings page and back
dporopat <denis.poropat@smarteh.si>
parents: 2219
diff changeset
    85
                    tags.div(render=tags.directive('PLCElement'))]
ed415982a9aa NevowServer : Added minimalist css style customization and a link to go to settings page and back
dporopat <denis.poropat@smarteh.si>
parents: 2219
diff changeset
    86
            ],
ed415982a9aa NevowServer : Added minimalist css style customization and a link to go to settings page and back
dporopat <denis.poropat@smarteh.si>
parents: 2219
diff changeset
    87
            tags.a(href='settings')['Settings']])
1438
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    88
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    89
    def __init__(self, *a, **kw):
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    90
        athena.LiveElement.__init__(self, *a, **kw)
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    91
        self.pcl_state = False
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    92
        self.HMI = None
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    93
        self.resetPLCStartedHMI()
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    94
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    95
    def setPLCState(self, state):
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    96
        self.pcl_state = state
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    97
        if self.HMI is not None:
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    98
            self.callRemote('updateHMI')
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
    99
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   100
    def setPLCStartedHMI(self, hmi):
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   101
        self.PLCStartedHMIClass = hmi
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   102
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   103
    def resetPLCStartedHMI(self):
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   104
        self.PLCStartedHMIClass = DefaultPLCStartedHMI
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   105
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   106
    def getHMI(self):
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   107
        return self.HMI
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   108
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   109
    def HMIexec(self, function, *args, **kwargs):
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   110
        if self.HMI is not None:
1740
b789b695b5c6 clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1736
diff changeset
   111
            getattr(self.HMI, function, lambda: None)(*args, **kwargs)
1438
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   112
    athena.expose(HMIexec)
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   113
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   114
    def resetHMI(self):
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   115
        self.HMI = None
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   116
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   117
    def PLCElement(self, ctx, data):
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   118
        return self.getPLCElement()
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   119
    renderer(PLCElement)
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   120
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   121
    def getPLCElement(self):
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   122
        self.detachFragmentChildren()
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   123
        if self.pcl_state:
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   124
            f = self.PLCStartedHMIClass()
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   125
        else:
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   126
            f = PLCStoppedHMI()
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   127
        f.setFragmentParent(self)
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   128
        self.HMI = f
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   129
        return f
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   130
    athena.expose(getPLCElement)
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   131
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   132
    def detachFragmentChildren(self):
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   133
        for child in self.liveFragmentChildren[:]:
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   134
            child.detach()
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   135
2246
51047284cb0e pep8 on runtime/NevowServer.py
Edouard Tisserant
parents: 2219
diff changeset
   136
2209
ee2675e4778d Now, runtime extensions should be able to add their own settings to web configuration interface.
Edouard Tisserant
parents: 2208
diff changeset
   137
class ConfigurableBindings(configurable.Configurable):
ee2675e4778d Now, runtime extensions should be able to add their own settings to web configuration interface.
Edouard Tisserant
parents: 2208
diff changeset
   138
ee2675e4778d Now, runtime extensions should be able to add their own settings to web configuration interface.
Edouard Tisserant
parents: 2208
diff changeset
   139
    def __init__(self):
ee2675e4778d Now, runtime extensions should be able to add their own settings to web configuration interface.
Edouard Tisserant
parents: 2208
diff changeset
   140
        configurable.Configurable.__init__(self, None)
ee2675e4778d Now, runtime extensions should be able to add their own settings to web configuration interface.
Edouard Tisserant
parents: 2208
diff changeset
   141
        self.bindingsNames = []
2262
4195545e2d17 NevowServer : added addInfoString to allow extensions to declare some read-only strings to be displayed in settings. Also renamed addExtension in addSettings for clarity.
Edouard Tisserant
parents: 2260
diff changeset
   142
        self.infostringcount = 0
2209
ee2675e4778d Now, runtime extensions should be able to add their own settings to web configuration interface.
Edouard Tisserant
parents: 2208
diff changeset
   143
ee2675e4778d Now, runtime extensions should be able to add their own settings to web configuration interface.
Edouard Tisserant
parents: 2208
diff changeset
   144
    def getBindingNames(self, ctx):
ee2675e4778d Now, runtime extensions should be able to add their own settings to web configuration interface.
Edouard Tisserant
parents: 2208
diff changeset
   145
        return self.bindingsNames
ee2675e4778d Now, runtime extensions should be able to add their own settings to web configuration interface.
Edouard Tisserant
parents: 2208
diff changeset
   146
2262
4195545e2d17 NevowServer : added addInfoString to allow extensions to declare some read-only strings to be displayed in settings. Also renamed addExtension in addSettings for clarity.
Edouard Tisserant
parents: 2260
diff changeset
   147
    def addInfoString(self, label, value, name=None):
2267
Edouard Tisserant
parents: 2262 2266
diff changeset
   148
        if isinstance(value, str):
2262
4195545e2d17 NevowServer : added addInfoString to allow extensions to declare some read-only strings to be displayed in settings. Also renamed addExtension in addSettings for clarity.
Edouard Tisserant
parents: 2260
diff changeset
   149
            def default(*k):
4195545e2d17 NevowServer : added addInfoString to allow extensions to declare some read-only strings to be displayed in settings. Also renamed addExtension in addSettings for clarity.
Edouard Tisserant
parents: 2260
diff changeset
   150
                return value
4195545e2d17 NevowServer : added addInfoString to allow extensions to declare some read-only strings to be displayed in settings. Also renamed addExtension in addSettings for clarity.
Edouard Tisserant
parents: 2260
diff changeset
   151
        else:
4195545e2d17 NevowServer : added addInfoString to allow extensions to declare some read-only strings to be displayed in settings. Also renamed addExtension in addSettings for clarity.
Edouard Tisserant
parents: 2260
diff changeset
   152
            def default(*k):
4195545e2d17 NevowServer : added addInfoString to allow extensions to declare some read-only strings to be displayed in settings. Also renamed addExtension in addSettings for clarity.
Edouard Tisserant
parents: 2260
diff changeset
   153
                return value()
4195545e2d17 NevowServer : added addInfoString to allow extensions to declare some read-only strings to be displayed in settings. Also renamed addExtension in addSettings for clarity.
Edouard Tisserant
parents: 2260
diff changeset
   154
4195545e2d17 NevowServer : added addInfoString to allow extensions to declare some read-only strings to be displayed in settings. Also renamed addExtension in addSettings for clarity.
Edouard Tisserant
parents: 2260
diff changeset
   155
        if name is None:
4195545e2d17 NevowServer : added addInfoString to allow extensions to declare some read-only strings to be displayed in settings. Also renamed addExtension in addSettings for clarity.
Edouard Tisserant
parents: 2260
diff changeset
   156
            name = "_infostring_" + str(self.infostringcount)
4195545e2d17 NevowServer : added addInfoString to allow extensions to declare some read-only strings to be displayed in settings. Also renamed addExtension in addSettings for clarity.
Edouard Tisserant
parents: 2260
diff changeset
   157
            self.infostringcount = self.infostringcount + 1
4195545e2d17 NevowServer : added addInfoString to allow extensions to declare some read-only strings to be displayed in settings. Also renamed addExtension in addSettings for clarity.
Edouard Tisserant
parents: 2260
diff changeset
   158
4195545e2d17 NevowServer : added addInfoString to allow extensions to declare some read-only strings to be displayed in settings. Also renamed addExtension in addSettings for clarity.
Edouard Tisserant
parents: 2260
diff changeset
   159
        def _bind(ctx):
4195545e2d17 NevowServer : added addInfoString to allow extensions to declare some read-only strings to be displayed in settings. Also renamed addExtension in addSettings for clarity.
Edouard Tisserant
parents: 2260
diff changeset
   160
            return annotate.Property(
4195545e2d17 NevowServer : added addInfoString to allow extensions to declare some read-only strings to be displayed in settings. Also renamed addExtension in addSettings for clarity.
Edouard Tisserant
parents: 2260
diff changeset
   161
                name,
4195545e2d17 NevowServer : added addInfoString to allow extensions to declare some read-only strings to be displayed in settings. Also renamed addExtension in addSettings for clarity.
Edouard Tisserant
parents: 2260
diff changeset
   162
                annotate.String(
4195545e2d17 NevowServer : added addInfoString to allow extensions to declare some read-only strings to be displayed in settings. Also renamed addExtension in addSettings for clarity.
Edouard Tisserant
parents: 2260
diff changeset
   163
                    label=label,
4195545e2d17 NevowServer : added addInfoString to allow extensions to declare some read-only strings to be displayed in settings. Also renamed addExtension in addSettings for clarity.
Edouard Tisserant
parents: 2260
diff changeset
   164
                    default=default,
4195545e2d17 NevowServer : added addInfoString to allow extensions to declare some read-only strings to be displayed in settings. Also renamed addExtension in addSettings for clarity.
Edouard Tisserant
parents: 2260
diff changeset
   165
                    immutable=True))
4195545e2d17 NevowServer : added addInfoString to allow extensions to declare some read-only strings to be displayed in settings. Also renamed addExtension in addSettings for clarity.
Edouard Tisserant
parents: 2260
diff changeset
   166
        setattr(self, 'bind_' + name, _bind)
4195545e2d17 NevowServer : added addInfoString to allow extensions to declare some read-only strings to be displayed in settings. Also renamed addExtension in addSettings for clarity.
Edouard Tisserant
parents: 2260
diff changeset
   167
        self.bindingsNames.append(name)
4195545e2d17 NevowServer : added addInfoString to allow extensions to declare some read-only strings to be displayed in settings. Also renamed addExtension in addSettings for clarity.
Edouard Tisserant
parents: 2260
diff changeset
   168
2670
fd348d79a1f3 BACnet and Modbus : Simpler configuration management. NevowServer.py now allows each extension to create and delete multiple configuration forms in the setting page, deprecating delSettings and addAfter.
Edouard Tisserant
parents: 2654
diff changeset
   169
    def addSettings(self, name, desc, fields, btnlabel, callback):
2209
ee2675e4778d Now, runtime extensions should be able to add their own settings to web configuration interface.
Edouard Tisserant
parents: 2208
diff changeset
   170
        def _bind(ctx):
ee2675e4778d Now, runtime extensions should be able to add their own settings to web configuration interface.
Edouard Tisserant
parents: 2208
diff changeset
   171
            return annotate.MethodBinding(
2246
51047284cb0e pep8 on runtime/NevowServer.py
Edouard Tisserant
parents: 2219
diff changeset
   172
                'action_' + name,
2247
921ba5658183 pylint on runtime/NevowServer.py
Edouard Tisserant
parents: 2246
diff changeset
   173
                annotate.Method(
921ba5658183 pylint on runtime/NevowServer.py
Edouard Tisserant
parents: 2246
diff changeset
   174
                    arguments=[
921ba5658183 pylint on runtime/NevowServer.py
Edouard Tisserant
parents: 2246
diff changeset
   175
                        annotate.Argument(*field)
921ba5658183 pylint on runtime/NevowServer.py
Edouard Tisserant
parents: 2246
diff changeset
   176
                        for field in fields],
2246
51047284cb0e pep8 on runtime/NevowServer.py
Edouard Tisserant
parents: 2219
diff changeset
   177
                    label=desc),
51047284cb0e pep8 on runtime/NevowServer.py
Edouard Tisserant
parents: 2219
diff changeset
   178
                action=btnlabel)
51047284cb0e pep8 on runtime/NevowServer.py
Edouard Tisserant
parents: 2219
diff changeset
   179
        setattr(self, 'bind_' + name, _bind)
51047284cb0e pep8 on runtime/NevowServer.py
Edouard Tisserant
parents: 2219
diff changeset
   180
51047284cb0e pep8 on runtime/NevowServer.py
Edouard Tisserant
parents: 2219
diff changeset
   181
        setattr(self, 'action_' + name, callback)
2209
ee2675e4778d Now, runtime extensions should be able to add their own settings to web configuration interface.
Edouard Tisserant
parents: 2208
diff changeset
   182
2670
fd348d79a1f3 BACnet and Modbus : Simpler configuration management. NevowServer.py now allows each extension to create and delete multiple configuration forms in the setting page, deprecating delSettings and addAfter.
Edouard Tisserant
parents: 2654
diff changeset
   183
        self.bindingsNames.append(name)
2654
7575050a80c5 Add web extension: configure Modbus plugin parameters (currently only supports Modbus clients)
Mario de Sousa <msousa@fe.up.pt>
parents: 2649
diff changeset
   184
            
3856
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   185
    customSettingsURLs = {}
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   186
    def addCustomURL(self, segment, func):
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   187
        self.customSettingsURLs[segment] = func
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   188
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   189
    def removeCustomURL(self, segment):
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   190
        del self.customSettingsURLs[segment]
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   191
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   192
    def customLocateChild(self, ctx, segments):
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   193
        segment = segments[0]
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   194
        if segment in self.customSettingsURLs:
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   195
            return self.customSettingsURLs[segment](ctx, segments)
2260
74205edac761 Some blank lines to make bitbucket's PEP8 2.2.0 happy
Edouard Tisserant
parents: 2247
diff changeset
   196
2209
ee2675e4778d Now, runtime extensions should be able to add their own settings to web configuration interface.
Edouard Tisserant
parents: 2208
diff changeset
   197
ConfigurableSettings = ConfigurableBindings()
ee2675e4778d Now, runtime extensions should be able to add their own settings to web configuration interface.
Edouard Tisserant
parents: 2208
diff changeset
   198
2672
4bc60e426dd6 Runtime extrension web settings: distinguish display string and token when calling NS.newExtensionSetting, thus allowing meaningful name to be displayed instead of an id.
Edouard Tisserant
parents: 2670
diff changeset
   199
def newExtensionSetting(display, token):
2670
fd348d79a1f3 BACnet and Modbus : Simpler configuration management. NevowServer.py now allows each extension to create and delete multiple configuration forms in the setting page, deprecating delSettings and addAfter.
Edouard Tisserant
parents: 2654
diff changeset
   200
    global extensions_settings_od
fd348d79a1f3 BACnet and Modbus : Simpler configuration management. NevowServer.py now allows each extension to create and delete multiple configuration forms in the setting page, deprecating delSettings and addAfter.
Edouard Tisserant
parents: 2654
diff changeset
   201
    settings = ConfigurableBindings()
2672
4bc60e426dd6 Runtime extrension web settings: distinguish display string and token when calling NS.newExtensionSetting, thus allowing meaningful name to be displayed instead of an id.
Edouard Tisserant
parents: 2670
diff changeset
   202
    extensions_settings_od[token] = (settings, display)
2670
fd348d79a1f3 BACnet and Modbus : Simpler configuration management. NevowServer.py now allows each extension to create and delete multiple configuration forms in the setting page, deprecating delSettings and addAfter.
Edouard Tisserant
parents: 2654
diff changeset
   203
    return settings
fd348d79a1f3 BACnet and Modbus : Simpler configuration management. NevowServer.py now allows each extension to create and delete multiple configuration forms in the setting page, deprecating delSettings and addAfter.
Edouard Tisserant
parents: 2654
diff changeset
   204
2672
4bc60e426dd6 Runtime extrension web settings: distinguish display string and token when calling NS.newExtensionSetting, thus allowing meaningful name to be displayed instead of an id.
Edouard Tisserant
parents: 2670
diff changeset
   205
def removeExtensionSetting(token):
2670
fd348d79a1f3 BACnet and Modbus : Simpler configuration management. NevowServer.py now allows each extension to create and delete multiple configuration forms in the setting page, deprecating delSettings and addAfter.
Edouard Tisserant
parents: 2654
diff changeset
   206
    global extensions_settings_od
2672
4bc60e426dd6 Runtime extrension web settings: distinguish display string and token when calling NS.newExtensionSetting, thus allowing meaningful name to be displayed instead of an id.
Edouard Tisserant
parents: 2670
diff changeset
   207
    extensions_settings_od.pop(token)
2246
51047284cb0e pep8 on runtime/NevowServer.py
Edouard Tisserant
parents: 2219
diff changeset
   208
3855
beccb995b10e Runtime web settings: allow customization of version string by extensions
Edouard Tisserant
parents: 3703
diff changeset
   209
2208
32dcacb67f7a Embrio of setting form, just to test
Edouard Tisserant
parents: 1919
diff changeset
   210
class ISettings(annotate.TypedInterface):
2246
51047284cb0e pep8 on runtime/NevowServer.py
Edouard Tisserant
parents: 2219
diff changeset
   211
    platform = annotate.String(label=_("Platform"),
3861
7e17f7e02a2b Runtime: add GetVersions() call to PLCObject, use it in web settings and expose it in WAMP and Pyro.
Edouard Tisserant
parents: 3858
diff changeset
   212
                               default=lambda *a,**k:GetPLCObjectSingleton().GetVersions(),
2247
921ba5658183 pylint on runtime/NevowServer.py
Edouard Tisserant
parents: 2246
diff changeset
   213
                               immutable=True)
921ba5658183 pylint on runtime/NevowServer.py
Edouard Tisserant
parents: 2246
diff changeset
   214
921ba5658183 pylint on runtime/NevowServer.py
Edouard Tisserant
parents: 2246
diff changeset
   215
    # pylint: disable=no-self-argument
2210
81949104291d Nevow based web interface now show simple Log message sending form for basic runtime, and allow extensions to add their own web settings.
Edouard Tisserant
parents: 2209
diff changeset
   216
    def sendLogMessage(
2247
921ba5658183 pylint on runtime/NevowServer.py
Edouard Tisserant
parents: 2246
diff changeset
   217
            ctx=annotate.Context(),
921ba5658183 pylint on runtime/NevowServer.py
Edouard Tisserant
parents: 2246
diff changeset
   218
            level=annotate.Choice(LogLevels,
921ba5658183 pylint on runtime/NevowServer.py
Edouard Tisserant
parents: 2246
diff changeset
   219
                                  required=True,
921ba5658183 pylint on runtime/NevowServer.py
Edouard Tisserant
parents: 2246
diff changeset
   220
                                  label=_("Log message level")),
2246
51047284cb0e pep8 on runtime/NevowServer.py
Edouard Tisserant
parents: 2219
diff changeset
   221
            message=annotate.String(label=_("Message text"))):
2247
921ba5658183 pylint on runtime/NevowServer.py
Edouard Tisserant
parents: 2246
diff changeset
   222
        pass
921ba5658183 pylint on runtime/NevowServer.py
Edouard Tisserant
parents: 2246
diff changeset
   223
2246
51047284cb0e pep8 on runtime/NevowServer.py
Edouard Tisserant
parents: 2219
diff changeset
   224
    sendLogMessage = annotate.autocallable(sendLogMessage,
51047284cb0e pep8 on runtime/NevowServer.py
Edouard Tisserant
parents: 2219
diff changeset
   225
                                           label=_(
51047284cb0e pep8 on runtime/NevowServer.py
Edouard Tisserant
parents: 2219
diff changeset
   226
                                               "Send a message to the log"),
2210
81949104291d Nevow based web interface now show simple Log message sending form for basic runtime, and allow extensions to add their own web settings.
Edouard Tisserant
parents: 2209
diff changeset
   227
                                           action=_("Send"))
2208
32dcacb67f7a Embrio of setting form, just to test
Edouard Tisserant
parents: 1919
diff changeset
   228
2700
144b149cded4 runtime: added restart/reset button in web settings. Accidentaly fixed web settings logging feature.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2672
diff changeset
   229
    # pylint: disable=no-self-argument
2701
f4dac054cfa3 WebInterface: better wording for wiping PLC content: "Repair"
Edouard Tisserant
parents: 2700
diff changeset
   230
    def restartOrRepairPLC(
2700
144b149cded4 runtime: added restart/reset button in web settings. Accidentaly fixed web settings logging feature.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2672
diff changeset
   231
            ctx=annotate.Context(),
2701
f4dac054cfa3 WebInterface: better wording for wiping PLC content: "Repair"
Edouard Tisserant
parents: 2700
diff changeset
   232
            action=annotate.Choice(["Restart", "Repair"],
2700
144b149cded4 runtime: added restart/reset button in web settings. Accidentaly fixed web settings logging feature.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2672
diff changeset
   233
                                  required=True,
144b149cded4 runtime: added restart/reset button in web settings. Accidentaly fixed web settings logging feature.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2672
diff changeset
   234
                                  label=_("Action"))):
144b149cded4 runtime: added restart/reset button in web settings. Accidentaly fixed web settings logging feature.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2672
diff changeset
   235
        pass
144b149cded4 runtime: added restart/reset button in web settings. Accidentaly fixed web settings logging feature.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2672
diff changeset
   236
2701
f4dac054cfa3 WebInterface: better wording for wiping PLC content: "Repair"
Edouard Tisserant
parents: 2700
diff changeset
   237
    restartOrRepairPLC = annotate.autocallable(restartOrRepairPLC,
2700
144b149cded4 runtime: added restart/reset button in web settings. Accidentaly fixed web settings logging feature.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2672
diff changeset
   238
                                           label=_(
2701
f4dac054cfa3 WebInterface: better wording for wiping PLC content: "Repair"
Edouard Tisserant
parents: 2700
diff changeset
   239
                                               "Restart or Repair"),
2700
144b149cded4 runtime: added restart/reset button in web settings. Accidentaly fixed web settings logging feature.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2672
diff changeset
   240
                                           action=_("Do"))
2260
74205edac761 Some blank lines to make bitbucket's PEP8 2.2.0 happy
Edouard Tisserant
parents: 2247
diff changeset
   241
3703
4b75f1506ea1 Runtime: add arbitrary file upload to working dir in web interface
Edouard Tisserant
parents: 3440
diff changeset
   242
    # pylint: disable=no-self-argument
4b75f1506ea1 Runtime: add arbitrary file upload to working dir in web interface
Edouard Tisserant
parents: 3440
diff changeset
   243
    def uploadFile(
4b75f1506ea1 Runtime: add arbitrary file upload to working dir in web interface
Edouard Tisserant
parents: 3440
diff changeset
   244
            ctx=annotate.Context(),
4b75f1506ea1 Runtime: add arbitrary file upload to working dir in web interface
Edouard Tisserant
parents: 3440
diff changeset
   245
            uploadedfile=annotate.FileUpload(required=True,
4b75f1506ea1 Runtime: add arbitrary file upload to working dir in web interface
Edouard Tisserant
parents: 3440
diff changeset
   246
                                  label=_("File to upload"))):
4b75f1506ea1 Runtime: add arbitrary file upload to working dir in web interface
Edouard Tisserant
parents: 3440
diff changeset
   247
        pass
4b75f1506ea1 Runtime: add arbitrary file upload to working dir in web interface
Edouard Tisserant
parents: 3440
diff changeset
   248
4b75f1506ea1 Runtime: add arbitrary file upload to working dir in web interface
Edouard Tisserant
parents: 3440
diff changeset
   249
    uploadFile = annotate.autocallable(uploadFile,
4b75f1506ea1 Runtime: add arbitrary file upload to working dir in web interface
Edouard Tisserant
parents: 3440
diff changeset
   250
                                           label=_(
4b75f1506ea1 Runtime: add arbitrary file upload to working dir in web interface
Edouard Tisserant
parents: 3440
diff changeset
   251
                                               "Upload a file to PLC working directory"),
4b75f1506ea1 Runtime: add arbitrary file upload to working dir in web interface
Edouard Tisserant
parents: 3440
diff changeset
   252
                                           action=_("Upload"))
4b75f1506ea1 Runtime: add arbitrary file upload to working dir in web interface
Edouard Tisserant
parents: 3440
diff changeset
   253
2670
fd348d79a1f3 BACnet and Modbus : Simpler configuration management. NevowServer.py now allows each extension to create and delete multiple configuration forms in the setting page, deprecating delSettings and addAfter.
Edouard Tisserant
parents: 2654
diff changeset
   254
extensions_settings_od = collections.OrderedDict()
2246
51047284cb0e pep8 on runtime/NevowServer.py
Edouard Tisserant
parents: 2219
diff changeset
   255
3856
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   256
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   257
CSS_tags = [tags.link(rel='stylesheet',
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   258
                      type='text/css',
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   259
                      href=url.here.child("webform_css")),
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   260
           tags.link(rel='stylesheet',
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   261
                      type='text/css',
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   262
                      href=url.here.child("webinterface_css"))]
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   263
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   264
class StyledSettingsPage(rend.Page):
2208
32dcacb67f7a Embrio of setting form, just to test
Edouard Tisserant
parents: 1919
diff changeset
   265
    addSlash = True
2246
51047284cb0e pep8 on runtime/NevowServer.py
Edouard Tisserant
parents: 2219
diff changeset
   266
2208
32dcacb67f7a Embrio of setting form, just to test
Edouard Tisserant
parents: 1919
diff changeset
   267
    # This makes webform_css url answer some default CSS
32dcacb67f7a Embrio of setting form, just to test
Edouard Tisserant
parents: 1919
diff changeset
   268
    child_webform_css = webform.defaultCSS
2266
ed415982a9aa NevowServer : Added minimalist css style customization and a link to go to settings page and back
dporopat <denis.poropat@smarteh.si>
parents: 2219
diff changeset
   269
    child_webinterface_css = File(paths.AbsNeighbourFile(__file__, 'webinterface.css'), 'text/css')
2208
32dcacb67f7a Embrio of setting form, just to test
Edouard Tisserant
parents: 1919
diff changeset
   270
3856
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   271
class SettingsPage(StyledSettingsPage):
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   272
2208
32dcacb67f7a Embrio of setting form, just to test
Edouard Tisserant
parents: 1919
diff changeset
   273
    implements(ISettings)
2670
fd348d79a1f3 BACnet and Modbus : Simpler configuration management. NevowServer.py now allows each extension to create and delete multiple configuration forms in the setting page, deprecating delSettings and addAfter.
Edouard Tisserant
parents: 2654
diff changeset
   274
   
3856
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   275
    # def __getattr__(self, name):
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   276
    #     global extensions_settings_od
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   277
    #     if name.startswith('configurable_'):
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   278
    #         token = name[13:]
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   279
    #         def configurable_something(ctx):
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   280
    #             settings, _display = extensions_settings_od[token]
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   281
    #             return settings
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   282
    #         return configurable_something
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   283
    #     raise AttributeError
2670
fd348d79a1f3 BACnet and Modbus : Simpler configuration management. NevowServer.py now allows each extension to create and delete multiple configuration forms in the setting page, deprecating delSettings and addAfter.
Edouard Tisserant
parents: 2654
diff changeset
   284
    
fd348d79a1f3 BACnet and Modbus : Simpler configuration management. NevowServer.py now allows each extension to create and delete multiple configuration forms in the setting page, deprecating delSettings and addAfter.
Edouard Tisserant
parents: 2654
diff changeset
   285
    def extensions_settings(self, context, data):
fd348d79a1f3 BACnet and Modbus : Simpler configuration management. NevowServer.py now allows each extension to create and delete multiple configuration forms in the setting page, deprecating delSettings and addAfter.
Edouard Tisserant
parents: 2654
diff changeset
   286
        """ Project extensions settings
fd348d79a1f3 BACnet and Modbus : Simpler configuration management. NevowServer.py now allows each extension to create and delete multiple configuration forms in the setting page, deprecating delSettings and addAfter.
Edouard Tisserant
parents: 2654
diff changeset
   287
        Extensions added to Configuration Tree in IDE have their setting rendered here
fd348d79a1f3 BACnet and Modbus : Simpler configuration management. NevowServer.py now allows each extension to create and delete multiple configuration forms in the setting page, deprecating delSettings and addAfter.
Edouard Tisserant
parents: 2654
diff changeset
   288
        """
fd348d79a1f3 BACnet and Modbus : Simpler configuration management. NevowServer.py now allows each extension to create and delete multiple configuration forms in the setting page, deprecating delSettings and addAfter.
Edouard Tisserant
parents: 2654
diff changeset
   289
        global extensions_settings_od
fd348d79a1f3 BACnet and Modbus : Simpler configuration management. NevowServer.py now allows each extension to create and delete multiple configuration forms in the setting page, deprecating delSettings and addAfter.
Edouard Tisserant
parents: 2654
diff changeset
   290
        res = []
2672
4bc60e426dd6 Runtime extrension web settings: distinguish display string and token when calling NS.newExtensionSetting, thus allowing meaningful name to be displayed instead of an id.
Edouard Tisserant
parents: 2670
diff changeset
   291
        for token in extensions_settings_od:
4bc60e426dd6 Runtime extrension web settings: distinguish display string and token when calling NS.newExtensionSetting, thus allowing meaningful name to be displayed instead of an id.
Edouard Tisserant
parents: 2670
diff changeset
   292
            _settings, display = extensions_settings_od[token]
3856
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   293
            #res += [tags.a(href=token)[display]] 
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   294
            res += [tags.p[tags.a(href=token)[display]]]
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   295
            # res += [tags.h2[display], webform.renderForms(token)] 
2670
fd348d79a1f3 BACnet and Modbus : Simpler configuration management. NevowServer.py now allows each extension to create and delete multiple configuration forms in the setting page, deprecating delSettings and addAfter.
Edouard Tisserant
parents: 2654
diff changeset
   296
        return res
2208
32dcacb67f7a Embrio of setting form, just to test
Edouard Tisserant
parents: 1919
diff changeset
   297
32dcacb67f7a Embrio of setting form, just to test
Edouard Tisserant
parents: 1919
diff changeset
   298
    docFactory = loaders.stan([tags.html[
2267
Edouard Tisserant
parents: 2262 2266
diff changeset
   299
        tags.head[
Edouard Tisserant
parents: 2262 2266
diff changeset
   300
            tags.title[_("Beremiz Runtime Settings")],
3856
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   301
            CSS_tags
2267
Edouard Tisserant
parents: 2262 2266
diff changeset
   302
        ],
Edouard Tisserant
parents: 2262 2266
diff changeset
   303
        tags.body[
3858
dcc83e03d065 Runtime web settings: fix punctuation and update CSS again
Edouard Tisserant
parents: 3856
diff changeset
   304
            tags.h1["Settings"],
2267
Edouard Tisserant
parents: 2262 2266
diff changeset
   305
            tags.a(href='/')['Back'],
3858
dcc83e03d065 Runtime web settings: fix punctuation and update CSS again
Edouard Tisserant
parents: 3856
diff changeset
   306
            tags.h2["Runtime service"],
2267
Edouard Tisserant
parents: 2262 2266
diff changeset
   307
            webform.renderForms('staticSettings'),
3858
dcc83e03d065 Runtime web settings: fix punctuation and update CSS again
Edouard Tisserant
parents: 3856
diff changeset
   308
            tags.h2["Target specific"],
2267
Edouard Tisserant
parents: 2262 2266
diff changeset
   309
            webform.renderForms('dynamicSettings'),
3858
dcc83e03d065 Runtime web settings: fix punctuation and update CSS again
Edouard Tisserant
parents: 3856
diff changeset
   310
            tags.h2["Extensions"],
2670
fd348d79a1f3 BACnet and Modbus : Simpler configuration management. NevowServer.py now allows each extension to create and delete multiple configuration forms in the setting page, deprecating delSettings and addAfter.
Edouard Tisserant
parents: 2654
diff changeset
   311
            extensions_settings
2267
Edouard Tisserant
parents: 2262 2266
diff changeset
   312
        ]]])
2208
32dcacb67f7a Embrio of setting form, just to test
Edouard Tisserant
parents: 1919
diff changeset
   313
2209
ee2675e4778d Now, runtime extensions should be able to add their own settings to web configuration interface.
Edouard Tisserant
parents: 2208
diff changeset
   314
    def configurable_staticSettings(self, ctx):
ee2675e4778d Now, runtime extensions should be able to add their own settings to web configuration interface.
Edouard Tisserant
parents: 2208
diff changeset
   315
        return configurable.TypedInterfaceConfigurable(self)
ee2675e4778d Now, runtime extensions should be able to add their own settings to web configuration interface.
Edouard Tisserant
parents: 2208
diff changeset
   316
ee2675e4778d Now, runtime extensions should be able to add their own settings to web configuration interface.
Edouard Tisserant
parents: 2208
diff changeset
   317
    def configurable_dynamicSettings(self, ctx):
2670
fd348d79a1f3 BACnet and Modbus : Simpler configuration management. NevowServer.py now allows each extension to create and delete multiple configuration forms in the setting page, deprecating delSettings and addAfter.
Edouard Tisserant
parents: 2654
diff changeset
   318
        """ Runtime Extensions settings
fd348d79a1f3 BACnet and Modbus : Simpler configuration management. NevowServer.py now allows each extension to create and delete multiple configuration forms in the setting page, deprecating delSettings and addAfter.
Edouard Tisserant
parents: 2654
diff changeset
   319
        Extensions loaded through Beremiz_service -e or optional runtime features render setting forms here
fd348d79a1f3 BACnet and Modbus : Simpler configuration management. NevowServer.py now allows each extension to create and delete multiple configuration forms in the setting page, deprecating delSettings and addAfter.
Edouard Tisserant
parents: 2654
diff changeset
   320
        """
2209
ee2675e4778d Now, runtime extensions should be able to add their own settings to web configuration interface.
Edouard Tisserant
parents: 2208
diff changeset
   321
        return ConfigurableSettings
2246
51047284cb0e pep8 on runtime/NevowServer.py
Edouard Tisserant
parents: 2219
diff changeset
   322
2210
81949104291d Nevow based web interface now show simple Log message sending form for basic runtime, and allow extensions to add their own web settings.
Edouard Tisserant
parents: 2209
diff changeset
   323
    def sendLogMessage(self, level, message, **kwargs):
81949104291d Nevow based web interface now show simple Log message sending form for basic runtime, and allow extensions to add their own web settings.
Edouard Tisserant
parents: 2209
diff changeset
   324
        level = LogLevelsDict[level]
2700
144b149cded4 runtime: added restart/reset button in web settings. Accidentaly fixed web settings logging feature.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2672
diff changeset
   325
        GetPLCObjectSingleton().LogMessage(
144b149cded4 runtime: added restart/reset button in web settings. Accidentaly fixed web settings logging feature.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2672
diff changeset
   326
            level, "Web form log message: " + message)
144b149cded4 runtime: added restart/reset button in web settings. Accidentaly fixed web settings logging feature.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2672
diff changeset
   327
2701
f4dac054cfa3 WebInterface: better wording for wiping PLC content: "Repair"
Edouard Tisserant
parents: 2700
diff changeset
   328
    def restartOrRepairPLC(self, action, **kwargs):
f4dac054cfa3 WebInterface: better wording for wiping PLC content: "Repair"
Edouard Tisserant
parents: 2700
diff changeset
   329
        if(action == "Repair"):
2700
144b149cded4 runtime: added restart/reset button in web settings. Accidentaly fixed web settings logging feature.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2672
diff changeset
   330
            GetPLCObjectSingleton().RepairPLC()
144b149cded4 runtime: added restart/reset button in web settings. Accidentaly fixed web settings logging feature.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2672
diff changeset
   331
        else:
144b149cded4 runtime: added restart/reset button in web settings. Accidentaly fixed web settings logging feature.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2672
diff changeset
   332
            MainWorker.quit()
3703
4b75f1506ea1 Runtime: add arbitrary file upload to working dir in web interface
Edouard Tisserant
parents: 3440
diff changeset
   333
4b75f1506ea1 Runtime: add arbitrary file upload to working dir in web interface
Edouard Tisserant
parents: 3440
diff changeset
   334
    def uploadFile(self, uploadedfile, **kwargs):
4b75f1506ea1 Runtime: add arbitrary file upload to working dir in web interface
Edouard Tisserant
parents: 3440
diff changeset
   335
        if uploadedfile is not None:
4b75f1506ea1 Runtime: add arbitrary file upload to working dir in web interface
Edouard Tisserant
parents: 3440
diff changeset
   336
            fobj = getattr(uploadedfile, "file", None)
4b75f1506ea1 Runtime: add arbitrary file upload to working dir in web interface
Edouard Tisserant
parents: 3440
diff changeset
   337
        if fobj is not None:
4b75f1506ea1 Runtime: add arbitrary file upload to working dir in web interface
Edouard Tisserant
parents: 3440
diff changeset
   338
            with open(uploadedfile.filename, 'w') as destfd:
4b75f1506ea1 Runtime: add arbitrary file upload to working dir in web interface
Edouard Tisserant
parents: 3440
diff changeset
   339
                fobj.seek(0)
4b75f1506ea1 Runtime: add arbitrary file upload to working dir in web interface
Edouard Tisserant
parents: 3440
diff changeset
   340
                shutil.copyfileobj(fobj,destfd)
2208
32dcacb67f7a Embrio of setting form, just to test
Edouard Tisserant
parents: 1919
diff changeset
   341
2219
73042b2d8d65 Added a way for extension to register dedicated URL under settings page URL (i.e. /settings/something)
Edouard Tisserant
parents: 2217
diff changeset
   342
    def locateChild(self, ctx, segments):
3856
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   343
        segment = segments[0]
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   344
        if segment in extensions_settings_od:
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   345
            settings, display = extensions_settings_od[segment]
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   346
            return ExtensionSettingsPage(settings, display), segments[1:]
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   347
        else:
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   348
            res = ConfigurableSettings.customLocateChild(ctx, segments)
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   349
            if res:
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   350
                return res 
2219
73042b2d8d65 Added a way for extension to register dedicated URL under settings page URL (i.e. /settings/something)
Edouard Tisserant
parents: 2217
diff changeset
   351
        return super(SettingsPage, self).locateChild(ctx, segments)
73042b2d8d65 Added a way for extension to register dedicated URL under settings page URL (i.e. /settings/something)
Edouard Tisserant
parents: 2217
diff changeset
   352
3856
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   353
class ExtensionSettingsPage(StyledSettingsPage):
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   354
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   355
    docFactory = loaders.stan([
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   356
        tags.html[
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   357
            tags.head()[
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   358
                tags.title[tags.directive("title")],
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   359
                CSS_tags
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   360
            ],
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   361
            tags.body[
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   362
                tags.h1[tags.directive("title")],
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   363
                tags.a(href='/settings')['Back'],
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   364
                webform.renderForms('settings')
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   365
            ]]])
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   366
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   367
    def render_title(self, ctx, data):
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   368
        return self._display_name
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   369
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   370
    def configurable_settings(self, ctx):
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   371
        return self._settings
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   372
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   373
    def __init__(self, settings, display):
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   374
        self._settings = settings
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   375
        self._display_name = display
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   376
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   377
    def locateChild(self, ctx, segments):
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   378
        res = self._settings.customLocateChild(ctx, segments)
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   379
        if res:
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   380
            return res 
054c4f1b2ea7 Runtime WebSetings for extensions are now served on individual URLs to prevent cluttering.
Edouard Tisserant
parents: 3855
diff changeset
   381
        return super(ExtensionSettingsPage, self).locateChild(ctx, segments)
1736
7e61baa047f0 clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1682
diff changeset
   382
1438
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   383
class WebInterface(athena.LivePage):
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   384
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   385
    docFactory = loaders.stan([tags.raw(xhtml_header),
1767
c74815729afd clean-up: fix PEP8 E127 continuation line over-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1756
diff changeset
   386
                               tags.html(xmlns="http://www.w3.org/1999/xhtml")[
2208
32dcacb67f7a Embrio of setting form, just to test
Edouard Tisserant
parents: 1919
diff changeset
   387
                                   tags.head(render=tags.directive('liveglue'))[
32dcacb67f7a Embrio of setting form, just to test
Edouard Tisserant
parents: 1919
diff changeset
   388
                                       tags.title[PAGE_TITLE],
32dcacb67f7a Embrio of setting form, just to test
Edouard Tisserant
parents: 1919
diff changeset
   389
                                       tags.link(rel='stylesheet',
2246
51047284cb0e pep8 on runtime/NevowServer.py
Edouard Tisserant
parents: 2219
diff changeset
   390
                                                 type='text/css',
2208
32dcacb67f7a Embrio of setting form, just to test
Edouard Tisserant
parents: 1919
diff changeset
   391
                                                 href=url.here.child("webform_css"))
32dcacb67f7a Embrio of setting form, just to test
Edouard Tisserant
parents: 1919
diff changeset
   392
                                   ],
1767
c74815729afd clean-up: fix PEP8 E127 continuation line over-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1756
diff changeset
   393
                                   tags.body[
c74815729afd clean-up: fix PEP8 E127 continuation line over-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1756
diff changeset
   394
                                       tags.div[
2246
51047284cb0e pep8 on runtime/NevowServer.py
Edouard Tisserant
parents: 2219
diff changeset
   395
                                           tags.div(
51047284cb0e pep8 on runtime/NevowServer.py
Edouard Tisserant
parents: 2219
diff changeset
   396
                                               render=tags.directive(
51047284cb0e pep8 on runtime/NevowServer.py
Edouard Tisserant
parents: 2219
diff changeset
   397
                                                   "MainPage")),
1767
c74815729afd clean-up: fix PEP8 E127 continuation line over-indented for visual indent
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1756
diff changeset
   398
                                       ]]]])
1438
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   399
    MainPage = MainPage()
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   400
    PLCHMI = PLCHMI
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   401
2208
32dcacb67f7a Embrio of setting form, just to test
Edouard Tisserant
parents: 1919
diff changeset
   402
    def child_settings(self, context):
32dcacb67f7a Embrio of setting form, just to test
Edouard Tisserant
parents: 1919
diff changeset
   403
        return SettingsPage()
32dcacb67f7a Embrio of setting form, just to test
Edouard Tisserant
parents: 1919
diff changeset
   404
1438
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   405
    def __init__(self, plcState=False, *a, **kw):
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   406
        super(WebInterface, self).__init__(*a, **kw)
2246
51047284cb0e pep8 on runtime/NevowServer.py
Edouard Tisserant
parents: 2219
diff changeset
   407
        self.jsModules.mapping[u'WebInterface'] = paths.AbsNeighbourFile(
51047284cb0e pep8 on runtime/NevowServer.py
Edouard Tisserant
parents: 2219
diff changeset
   408
            __file__, 'webinterface.js')
1438
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   409
        self.plcState = plcState
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   410
        self.MainPage.setPLCState(plcState)
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   411
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   412
    def getHMI(self):
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   413
        return self.MainPage.getHMI()
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   414
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   415
    def LoadHMI(self, hmi, jsmodules):
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   416
        for name, path in jsmodules.iteritems():
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   417
            self.jsModules.mapping[name] = os.path.join(WorkingDir, path)
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   418
        self.MainPage.setPLCStartedHMI(hmi)
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   419
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   420
    def UnLoadHMI(self):
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   421
        self.MainPage.resetPLCStartedHMI()
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   422
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   423
    def PLCStarted(self):
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   424
        self.plcState = True
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   425
        self.MainPage.setPLCState(True)
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   426
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   427
    def PLCStopped(self):
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   428
        self.plcState = False
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   429
        self.MainPage.setPLCState(False)
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   430
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   431
    def renderHTTP(self, ctx):
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   432
        """
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   433
        Force content type to fit with SVG
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   434
        """
1870
4d070115b552 fix pylint error '(too-many-function-args) Too many positional arguments for function call'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1850
diff changeset
   435
        req = ctx.locate(inevow.IRequest)
1438
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   436
        req.setHeader('Content-type', 'application/xhtml+xml')
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   437
        return super(WebInterface, self).renderHTTP(ctx)
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   438
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   439
    def render_MainPage(self, ctx, data):
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   440
        f = self.MainPage
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   441
        f.setFragmentParent(self)
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   442
        return ctx.tag[f]
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   443
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   444
    def child_(self, ctx):
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   445
        self.MainPage.detachFragmentChildren()
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   446
        return WebInterface(plcState=self.plcState)
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   447
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   448
    def beforeRender(self, ctx):
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   449
        d = self.notifyOnDisconnect()
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   450
        d.addErrback(self.disconnected)
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   451
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   452
    def disconnected(self, reason):
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   453
        self.MainPage.resetHMI()
1782
5b6ad7a7fd9d clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1776
diff changeset
   454
        # print reason
5b6ad7a7fd9d clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1776
diff changeset
   455
        # print "We will be called back when the client disconnects"
1438
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   456
1736
7e61baa047f0 clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1682
diff changeset
   457
2311
bef2b4b87370 Beremiz_service now binds both pyro and nevow ports to interface given with '-i' argument.
Edouard Tisserant
parents: 2267
diff changeset
   458
def RegisterWebsite(iface, port):
1438
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   459
    website = WebInterface()
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   460
    site = appserver.NevowSite(website)
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   461
2311
bef2b4b87370 Beremiz_service now binds both pyro and nevow ports to interface given with '-i' argument.
Edouard Tisserant
parents: 2267
diff changeset
   462
    reactor.listenTCP(port, site, interface=iface)
1826
91796f408540 fix usage of python2-only print statement
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
   463
    print(_('HTTP interface port :'), port)
1439
a68cd4253259 Added stub code for runtime WAMP client. Added runtime command line switch to select WAMP url and Nevow web site port. Web port is now fixed, next port number is not tested if bind fails.
Edouard Tisserant
parents: 1438
diff changeset
   464
    return website
1438
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   465
2210
81949104291d Nevow based web interface now show simple Log message sending form for basic runtime, and allow extensions to add their own web settings.
Edouard Tisserant
parents: 2209
diff changeset
   466
1831
56b48961cc68 fix (old-style-class) Old-style class defined error for most parts of
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1826
diff changeset
   467
class statuslistener(object):
2246
51047284cb0e pep8 on runtime/NevowServer.py
Edouard Tisserant
parents: 2219
diff changeset
   468
1438
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   469
    def __init__(self, site):
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   470
        self.oldstate = None
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   471
        self.site = site
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   472
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   473
    def listen(self, state):
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   474
        if state != self.oldstate:
1453
f31353cac197 Fixed Nevow website startup
Edouard Tisserant
parents: 1439
diff changeset
   475
            action = {'Started': self.site.PLCStarted,
f31353cac197 Fixed Nevow website startup
Edouard Tisserant
parents: 1439
diff changeset
   476
                      'Stopped': self.site.PLCStopped}.get(state, None)
1756
08e4394ff4fb clean-up: fix PEP8 E701 multiple statements on one line (colon)
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1746
diff changeset
   477
            if action is not None:
08e4394ff4fb clean-up: fix PEP8 E701 multiple statements on one line (colon)
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1746
diff changeset
   478
                action()
1438
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   479
            self.oldstate = state
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   480
1736
7e61baa047f0 clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1682
diff changeset
   481
1438
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   482
def website_statuslistener_factory(site):
19ebe96b41c0 Moved twisted/nevow/athena away from Berermiz_service.py + some minor cleanup
Edouard Tisserant
parents:
diff changeset
   483
    return statuslistener(site).listen
2208
32dcacb67f7a Embrio of setting form, just to test
Edouard Tisserant
parents: 1919
diff changeset
   484
32dcacb67f7a Embrio of setting form, just to test
Edouard Tisserant
parents: 1919
diff changeset
   485