python-hserver/hserver/api/WebObject.py

168 lines
3.9 KiB
Python

from objectbroker import Persistence,NoPersistence,Aquisition,AquisitionProxy
from hserver.api.WebCallable import WebCallable,WebCallableObject
from hserver.types.FormApplyable import FormApplyable
from hserver.session.SessionHandler import SessionHandler
import hserver
import hserver.api
from simplelog import log
class WebObject(WebCallableObject,FormApplyable,Aquisition):
WO_Accepts = None
FA_Names = { "title": "title" }
def wo_accepts(self):
woa = getattr(self,"WO_Accepts",None)
if woa is None:
if (self.__class__ == WebObject) or (self._aq_parent is None):
return hserver.api.ListKnownWebObjects()
else:
return self._aq_parent.wo_accepts()
return woa
def __init__(self, templates = None):
self.__default = None
self.__sessionhandlers = []
self.title = "No Title yet"
self.__templates = templates
def __getitem__(self,name):
try:
return getattr( self, name )
except:
raise IndexError("%s not found in %s" % (name,self))
def __setitem__(self,name,value):
setattr( self, name, value )
if isinstance(value, SessionHandler):
self.__sessionhandlers.append(value)
def __delitem__(self,name):
c = getattr( self, name )
if isinstance(c, SessionHandler):
self.__sessionhandlers.remove(c)
delattr( self, name )
def __contains__(self,name):
o = getattr(self,name,None)
return not o is None
def __getattr__(self,name):
if not (name.startswith("_")):
t = self.__templates
if (not t is None) and (name in t):
print("-----------################## {0}".format(t))
return t[ name ]
raise AttributeError("%s not found in %s" % (name,self))
def default(self):
return self.__default
def setDefault(self,default):
self.__default = default
def setChild(self,name,child):
self[name] = child
def children(self):
ls = []
for an in dir(self):
if isinstance( self[an], WebObject ):
ls.append( an )
return ls
def walk(self,request):
log("walk: {0}".format(self))
for shandler in self.__sessionhandlers:
shandler.applySession(request)
next, stack = request.pathwalker().walk()
no = getattr(self, next, None)
if no is None:
raise hserver.HttpException(404,"%s in /%s" % (next,request.pathwalker().walked(-1)))
if (len(stack)==0) or (not isinstance(no,WebObject)):
if (isinstance(no,WebCallableObject)):
no(request, o=no)
elif (isinstance(no,WebCallable)):
no(request, o=self)
else:
raise hserver.HttpException(404,"%s in /%s" % (next,request.pathwalker().walked(-1)))
else:
no.walk(request)
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.getContentFile().write("<html><head><title>No Content</title></head><body>Sorry, no content here!</body></html>")
def attribute(self,name,default):
if not hasattr(self,name):
setattr( self, name, default )
return getattr( self, name )
def __public_types(self):
if hasattr(self,"_public_types"):
return self._public_types
return {}
def __public_names(self):
if hasattr(self,"_public_names"):
return self._public_names
return {}
def update(self,request):
if not request is None:
f = request.getForm()
else:
f = None
for n in self.__public_names():
if n in self.__public_types():
t = self.__public_types()[n]
else:
t = str
if (not f is None) and (n in f):
setattr(self, n, t(f[n].value()))
elif not hasattr(self, n):
setattr( self, n, t() )
class NavWebObject(WebObject,Persistence):
def __init__(self,title = None):
WebObject.__init__(self)
def navigation(self,levels = 1):
nav = {}
nav["title"] = self.title
nav["children"] = {}
if (levels > 0):
for child in self.children():
if isinstance(self[child],NavWebObject):
nav["children"][child] = self[child].navigation(levels-1)
return nav