From 3d10c45222427427347ff7291601773af7d4243d Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Wed, 13 Mar 2024 10:05:43 +0100 Subject: [PATCH] provide registry for views, use for default view --- scopes/server/app.py | 26 +++++------------------- scopes/server/browser.py | 43 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 21 deletions(-) create mode 100644 scopes/server/browser.py diff --git a/scopes/server/app.py b/scopes/server/app.py index b377199..4dedf6f 100644 --- a/scopes/server/app.py +++ b/scopes/server/app.py @@ -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) - diff --git a/scopes/server/browser.py b/scopes/server/browser.py new file mode 100644 index 0000000..83bc04f --- /dev/null +++ b/scopes/server/browser.py @@ -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) +