diff --git a/README.txt b/README.txt index 67a4ae7..dbe613f 100755 --- a/README.txt +++ b/README.txt @@ -783,7 +783,7 @@ be accessed as a `virtual target`. This is done by putting ".targetNNN" at the end of the URL, with NNN being the unique id of the concept or resource. - >>> from loops.view import NodeTraverser + >>> from loops.browser.node import NodeTraverser >>> magic = '.target' + util.getUidForObject(resources['d001.txt']) >>> url = 'http://127.0.0.1/loops/views/m1/m11/m111/' + magic + '/@@node.html' diff --git a/browser/common.py b/browser/common.py index 14b376f..095cfab 100644 --- a/browser/common.py +++ b/browser/common.py @@ -36,7 +36,6 @@ from zope.formlib.form import FormFields from zope.formlib.namedtemplate import NamedTemplate from zope.interface import Interface, implements from zope.publisher.browser import applySkin -#from zope.publisher.interfaces.browser import ISkin from zope.publisher.interfaces.browser import IBrowserSkinType from zope import schema from zope.schema.vocabulary import SimpleTerm @@ -105,7 +104,7 @@ class BaseView(GenericView, I18NView): super(BaseView, self).__init__(context, request) # TODO: get rid of removeSecurityProxy() call self.context = removeSecurityProxy(context) - self.setSkin(self.loopsRoot.skinName) + #self.setSkin(self.loopsRoot.skinName) self.checkLanguage() try: if not canAccess(context, 'title'): diff --git a/browser/configure.zcml b/browser/configure.zcml index d59c283..85ac99d 100644 --- a/browser/configure.zcml +++ b/browser/configure.zcml @@ -685,7 +685,7 @@ for="loops.resource.ResourceTypeSourceList zope.publisher.interfaces.browser.IBrowserRequest" /> - tag show the current object + traversedNames[-1] = name + if len(name) > len('.target'): + uid = int(name[len('.target'):]) + target = util.getObjectForUid(uid) + #target = component.getUtility(IIntIds).getObject(uid) + else: + target = self.context.target + if target is not None: + # remember self.context in request + viewAnnotations = request.annotations.setdefault('loops.view', {}) + viewAnnotations['node'] = self.context + if request.method == 'PUT': + # we have to use the target object directly + return target + else: + # switch to correct version if appropriate + target = getVersion(target, request) + # we'll use the target object in the node's context + viewAnnotations['target'] = target + return self.context + obj = super(NodeTraverser, self).publishTraverse(request, name) + return obj + + +def setViewConfiguration(context, request): + viewAnnotations = request.annotations.setdefault('loops.view', {}) + config = IViewConfiguratorSchema(context) + skinName = config.skinName + if not skinName: + skinName = context.getLoopsRoot().skinName + if skinName: + viewAnnotations['skinName'] = skinName + if config.options: + viewAnnotations['options'] = config.options + return dict(skinName=skinName, options=config.options) + +def getViewConfiguration(context, request): + if INode.providedBy(context) and context.nodeType == 'menu': + setViewConfiguration(context, request) + viewAnnotations = request.annotations.get('loops.view', {}) + return dict(skinName=viewAnnotations.get('skinName'), + options=viewAnnotations.get('options')) diff --git a/tests/setup.py b/tests/setup.py index 1156483..54132db 100644 --- a/tests/setup.py +++ b/tests/setup.py @@ -32,6 +32,7 @@ from cybertools.typology.interfaces import IType from loops.base import Loops from loops import util +from loops.browser.node import ViewPropertiesConfigurator from loops.common import NameChooser from loops.interfaces import ILoopsObject, IIndexAttributes from loops.interfaces import IDocument, IFile, ITextDocument @@ -83,6 +84,7 @@ class TestSite(object): component.provideAdapter(FileAdapter, provides=IFile) component.provideAdapter(TextDocumentAdapter, provides=ITextDocument) component.provideAdapter(NodeAdapter) + component.provideAdapter(ViewPropertiesConfigurator) component.provideAdapter(NameChooser) component.provideAdapter(Instance) component.provideAdapter(Editor, name='editor') diff --git a/view.py b/view.py index 942fe86..991c40e 100644 --- a/view.py +++ b/view.py @@ -207,45 +207,3 @@ class NodeAdapter(AdapterBase): adapts(INode) _contextAttributes = ('title', 'description', 'body',) - - -# traveral adapter - -class NodeTraverser(ItemTraverser): - - adapts(INode) - - def publishTraverse(self, request, name): - if name == '.loops': - return self.context.getLoopsRoot() - if name.startswith('.target'): - traversalStack = request._traversal_stack - while traversalStack and traversalStack[0].startswith('.target'): - # skip obsolete target references in the url - name = traversalStack.pop(0) - traversedNames = request._traversed_names - if traversedNames: - lastTraversed = traversedNames[-1] - if lastTraversed.startswith('.target') and lastTraversed != name: - # let tag show the current object - traversedNames[-1] = name - if len(name) > len('.target'): - uid = int(name[len('.target'):]) - target = component.getUtility(IIntIds).getObject(uid) - else: - target = self.context.target - if target is not None: - # remember self.context in request - viewAnnotations = request.annotations.setdefault('loops.view', {}) - viewAnnotations['node'] = self.context - if request.method == 'PUT': - # we have to use the target object directly - return target - else: - # switch to correct version if appropriate - target = getVersion(target, request) - # we'll use the target object in the node's context - viewAnnotations['target'] = target - return self.context - return super(NodeTraverser, self).publishTraverse(request, name) -