work in progress: Resource-oriented Architecture with Zope 2: handle GET and PUT via methods of a view

git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@3527 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2009-09-04 12:31:54 +00:00
parent b48f8ef9e3
commit 8fdd5971fc
3 changed files with 49 additions and 13 deletions

View file

@ -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

View file

@ -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)

View file

@ -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.'