provide registry for views, use for default view

This commit is contained in:
Helmut Merz 2024-03-13 10:05:43 +01:00
parent 0bda603f1e
commit 3d10c45222
2 changed files with 48 additions and 21 deletions

View file

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