2
from zope.interface import implements, providedBy
3
from zope.publisher.interfaces import IPublishTraverse
4
from zope.publisher.interfaces import NotFound
5
from zope.security.checker import ProxyFactory
6
from zope.location.location import locate
8
from schooltool.rest.interfaces import ICommonEntry
9
from schooltool.rest.interfaces import ST_CONTEXT_IFC, ST_CONTEXT_ATTR
12
class TraverseViaGet(object):
13
implements(IPublishTraverse)
15
def publishTraverse(self, request, name):
17
value = self.get(name, marker)
18
if (value is marker or
20
raise NotFound(self, name, request)
25
implements(ICommonEntry)
31
def __init__(self, obj, parent=None):
33
if parent is not None:
35
self.__name__ = getattr(obj, '__name__', None)
37
def __getattr__(self, name):
38
for ifc in providedBy(self):
41
adapter = ifc[name].queryTaggedValue(ST_CONTEXT_IFC)
44
attr = ifc[name].queryTaggedValue(ST_CONTEXT_ATTR)
47
context = object.__getattribute__(self, attr)
48
target = adapter(ProxyFactory(context))
49
return getattr(target, name)
50
raise AttributeError(self, name)
52
def __setattr__(self, name, value):
53
for ifc in providedBy(self):
56
adapter = ifc[name].queryTaggedValue(ST_CONTEXT_IFC)
59
attr = ifc[name].queryTaggedValue(ST_CONTEXT_ATTR)
62
context = object.__getattribute__(self, attr)
63
target = adapter(ProxyFactory(context))
64
setattr(target, name, value)
66
object.__setattr__(self, name, value)