provide registry for views, use for default view
This commit is contained in:
parent
0bda603f1e
commit
3d10c45222
2 changed files with 48 additions and 21 deletions
|
@ -1,14 +1,14 @@
|
|||
# scopes.server.app
|
||||
|
||||
import json
|
||||
from zope.interface import implementer
|
||||
from zope.publisher.base import DefaultPublication
|
||||
from zope.publisher.browser import BrowserRequest
|
||||
from zope.publisher.interfaces import NotFound
|
||||
from zope.publisher.publish import publish
|
||||
from zope.traversing.publicationtraverse import PublicationTraverser
|
||||
|
||||
from scopes.interfaces import IContainer, ITraversable, IView
|
||||
from scopes.interfaces import ITraversable, IView
|
||||
from scopes.server.browser import getView
|
||||
from scopes.storage.folder import Root
|
||||
|
||||
|
||||
|
@ -29,12 +29,11 @@ def zope_app_factory(config):
|
|||
class Publication(DefaultPublication):
|
||||
|
||||
def traverseName(self, request, ob, name):
|
||||
next = None
|
||||
next = getView(request, ob, name)
|
||||
if next is not None:
|
||||
return next
|
||||
if ITraversable.providedBy(ob):
|
||||
next = ob.get(name)
|
||||
if next is None:
|
||||
if name == 'index.html':
|
||||
next = DefaultView(ob, request)
|
||||
if next is None:
|
||||
raise NotFound(ob, name, request)
|
||||
return next
|
||||
|
@ -44,18 +43,3 @@ class Publication(DefaultPublication):
|
|||
return ob, ()
|
||||
return ob, ('index.html',)
|
||||
|
||||
|
||||
@implementer(IView)
|
||||
class DefaultView:
|
||||
|
||||
def __init__(self, context, request):
|
||||
self.context = context
|
||||
self.request = request
|
||||
|
||||
def __call__(self):
|
||||
ob = self.context
|
||||
result = dict(head=ob.head, data=ob.data)
|
||||
if IContainer.providedBy(ob):
|
||||
result['items'] = list(ob.keys())
|
||||
return json.dumps(result)
|
||||
|
||||
|
|
43
scopes/server/browser.py
Normal file
43
scopes/server/browser.py
Normal file
|
@ -0,0 +1,43 @@
|
|||
# scopes.server.browser
|
||||
|
||||
import json
|
||||
from zope.interface import implementer
|
||||
from scopes.interfaces import IContainer, IView
|
||||
|
||||
views = {}
|
||||
|
||||
def register(contextClass, name):
|
||||
def doRegister(viewClass):
|
||||
nameEntry = views.setdefault(name, {})
|
||||
key = contextClass and contextClass.prefix or ''
|
||||
nameEntry[key] = viewClass
|
||||
return viewClass
|
||||
return doRegister
|
||||
|
||||
def getView(request, ob, name):
|
||||
nameEntry = views.get(name)
|
||||
if nameEntry is None:
|
||||
return None
|
||||
viewClass = nameEntry.get(ob.__class__.prefix)
|
||||
if viewClass is None:
|
||||
viewClass = nameEntry.get('')
|
||||
if viewClass is None:
|
||||
return None
|
||||
return viewClass(ob, request)
|
||||
|
||||
|
||||
@register(None, 'index.html')
|
||||
@implementer(IView)
|
||||
class DefaultView:
|
||||
|
||||
def __init__(self, context, request):
|
||||
self.context = context
|
||||
self.request = request
|
||||
|
||||
def __call__(self):
|
||||
ob = self.context
|
||||
result = dict(head=ob.head, data=ob.data)
|
||||
if IContainer.providedBy(ob):
|
||||
result['items'] = list(ob.keys())
|
||||
return json.dumps(result)
|
||||
|
Loading…
Add table
Reference in a new issue