diff --git a/roa/json.py b/roa/json.py index 39ebe23..9e6193b 100644 --- a/roa/json.py +++ b/roa/json.py @@ -32,9 +32,18 @@ class JSONView(object): self.request = request def __call__(self): + return self.context.__name__ return json.dumps(self.context.__dict__.keys()) - def traverse(self, name): - # To be implemented by subclass - print '*** traversing', self.context, name + def create(self, name): + print '*** create (PUT)', self.context, name + return self.context + + def put(self): + print '*** PUT', self.context + return self.context + + def get(self): + print '*** GET', self.context + self.request.response.write('hello') return self.context diff --git a/roa/traversal.py b/roa/traversal.py index 42c31e3..f429029 100644 --- a/roa/traversal.py +++ b/roa/traversal.py @@ -29,25 +29,37 @@ from zope import component jsonMimeTypes = ('application/json',) +def isJSONRequest(request): + return request.get('CONTENT_TYPE') in jsonMimeTypes + + class CheckJSONTraverser(ItemTraverser): def publishTraverse(self, request, name): - if self.isJSONRequest(request): + if isJSONRequest(request): return self.jsonTraverse(request, name) return self.defaultTraverse(request, name) - def isJSONRequest(self, request): - return request.get('CONTENT_TYPE') in jsonMimeTypes - def jsonTraverse(self, request, name): + print '*** jsonTraverse', self.context, name + if request['TraversalRequestNameStack']: + return self.defaultTraverse(request, name) + method = self.request['REQUEST_METHOD'] + print '*** traversing', self.context, name, method item = self.context.get(name) - if item is not None: - return item - # TODO: specify provides=IJSONView - view = component.getMultiAdapter((self.context, request), name='json') + if item is None: + view = component.getMultiAdapter((self.context, request), name='json') + if view is None: + return self.defaultTraverse(request, name) + if method == 'PUT': + return view.create(name) + return self.defaultTraverse(request, name) + view = component.getMultiAdapter((item, request), name='json') if view is None: return self.defaultTraverse(request, name) - return view.traverse(name) + if method == 'PUT': + return view.put() + return view.get() def defaultTraverse(self, request, name): return super(CheckJSONTraverser, self).publishTraverse(request, name) diff --git a/roa/z2/traversal.py b/roa/z2/traversal.py index 7aa9dc6..4e3bcc2 100644 --- a/roa/z2/traversal.py +++ b/roa/z2/traversal.py @@ -22,7 +22,10 @@ $Id$ """ from ZPublisher.BaseRequest import DefaultPublishTraverse +from ZPublisher.HTTPRequest import HTTPRequest + from cybertools.roa.traversal import CheckJSONTraverser as BaseTraverser +from cybertools.roa.traversal import isJSONRequest class CheckJSONTraverser(BaseTraverser, DefaultPublishTraverse): @@ -30,6 +33,18 @@ class CheckJSONTraverser(BaseTraverser, DefaultPublishTraverse): defaultTraverse = DefaultPublishTraverse.publishTraverse def browserDefault(self, request): - if self.isJSONRequest(request): + if isJSONRequest(request): return self.context, ('@@json',) return DefaultPublishTraverse.browserDefault(self, request) + + +old_traverse = HTTPRequest.traverse + +def traverse(self, *args, **kw): + if isJSONRequest(self): + self.maybe_webdav_client = 0 + old_traverse(self, *args, **kw) + +HTTPRequest.traverse = traverse + +print '***** HTTPRequest.traverse monkey patch installed.'