109 lines
2.6 KiB
Python
109 lines
2.6 KiB
Python
from hwo import Persistence,NoPersistence,Aquisition,AquisitionProxy
|
|
import hserver
|
|
|
|
class WebCallable:
|
|
|
|
def __init__(self, method=None, instance=None):
|
|
self._method = method
|
|
self._instance = instance
|
|
|
|
def __call__(self,request, o=None):
|
|
if (hasattr(self,"_method")):
|
|
m = getattr( self, "_method")
|
|
i = getattr( self, "_instance", o)
|
|
if i is None:
|
|
i = o
|
|
m(i,request, o=o)
|
|
else:
|
|
request.getContentFile().write("<html><head><title>No Content</title></head><body>Sorry, no content here!</body></html>")
|
|
|
|
|
|
class WebObject(WebCallable,Aquisition):
|
|
|
|
def __init__(self):
|
|
self.__default = None
|
|
|
|
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 )
|
|
|
|
def __delitem__(self,name):
|
|
delattr( self, name )
|
|
|
|
def setDefault(self,default):
|
|
self.__default = default
|
|
|
|
def setChild(self,name,child):
|
|
setattr( 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):
|
|
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,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 )
|
|
|
|
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 WebFolder(WebObject, Persistence):
|
|
pass
|