python-hserver/hserver/manage/RootFolder.py

116 lines
2.8 KiB
Python

from objectbroker import NoPersistence,Persistence
from hserver.api.WebCallable import WebCallable
from hserver.api.WebObject import WebObject
from hserver.templates.Template import Template
import hserver
from simplelog import log
import simplelog
from objectbroker import Serializer,XMLStore
import os
import os.path
import json
import xml.etree.ElementTree
class RootFolder(WebObject,Persistence):
_hm_frame = Template( base = os.path.dirname( __file__ ), template = "frame.html" )
_hm_style = Template( base = os.path.dirname( __file__ ), template = "style.css" )
_hm_api = Template( base = os.path.dirname( __file__ ), template = "api.js" )
_hm_edit = Template( base = os.path.dirname( __file__ ), template = "edit.html" )
_hm_tree = Template( base = os.path.dirname( __file__ ), template = "tree.html" )
def __init__(self):
WebObject.__init__(self)
def __call__(self,request,o = None):
if not self.default() is None:
request.redirect( request.pathwalker().walked() + "/" + self.default() )
elif "index_html" in self:
request.redirect( request.pathwalker().walked() + "/index_html" )
request.redirect( request.pathwalker().walked() + "/_hm_frame" )
def hm_json(self, request, o = None):
reply = { "result": None, "exception": None }
try:
j = json.loads( request.mime().body() )
log("Received JSON Request: {0}".format( j ))
method = j["method"]
parameters = j["parameters"]
m = getattr(self, method)
if not m is None:
reply["result"] = m(request,**parameters)
except Exception as ex:
log("JSON-RPC: Exception")
simplelog.logException(ex)
reply["result"] = None
reply["exception"] = repr(ex)
request.setResponseHeader("Content-Type","application/json")
jreply = json.dumps( reply )
log("JReply: {0}".format(jreply))
request.getContentFile().write( jreply )
_hm_json = WebCallable( method = hm_json )
def objCreate(self,request,objTypeName,objName,objPath):
if (objTypeName == ""):
raise Exception("objTypeName must contain a valid type")
pObject = self.objPathWalk(request, objPath)
if (objName == "") or (objName in pObject):
raise Exception("objName must contain a valid and unused name of the new object")
objClass = hserver.api.findClass( objTypeName.split(".") )
o = objClass()
pObject[ objName ] = o
return True
def objRemove(self,request,objPath):
if (len(objPath) < 1):
raise Exception("Can't delete root object")
pObject = self.objPathWalk(request, objPath)
del pObject._aq_parent[pObject._aq_name]
return True
def objExport(self,request, objPath):
xs = XMLStore(None)
s = Serializer(xs)
o = self.objPathWalk( request, objPath )
s.serialize( o._aq_object )
return xml.etree.ElementTree.tostring( xs.lastXml() ).decode("utf-8")
def objPathWalk(self, request, path):
o = self
for n in path:
o = getattr( o, n )
return o