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