diff --git a/browser/node.py b/browser/node.py index 733b8e6..e5dd4d5 100644 --- a/browser/node.py +++ b/browser/node.py @@ -948,7 +948,8 @@ class NodeTraverser(ItemTraverser): if context.nodeType == 'menu': setViewConfiguration(context, request) if name == '.loops': - return self.context.getLoopsRoot() + name = self.getTargetUid(request) + #return self.context.getLoopsRoot() if name.startswith('.'): name = self.cleanUpTraversalStack(request, name)[1:] target = self.getTarget(name) @@ -975,17 +976,34 @@ class NodeTraverser(ItemTraverser): obj = super(NodeTraverser, self).publishTraverse(request, name) return obj + def getTargetUid(self, request): + parent = self.context.getLoopsRoot() + stack = request._traversal_stack + for i in range(2): + name = stack.pop() + obj = parent.get(name) + if not obj: + return name + parent = obj + return '.' + util.getUidForObject(obj) + def cleanUpTraversalStack(self, request, name): - traversalStack = request._traversal_stack - while traversalStack and traversalStack[0].startswith('.'): + #traversalStack = request._traversal_stack + #while traversalStack and traversalStack[0].startswith('.'): # skip obsolete target references in the url - name = traversalStack.pop(0) + # name = traversalStack.pop(0) traversedNames = request._traversed_names - if traversedNames: - lastTraversed = traversedNames[-1] - if lastTraversed.startswith('.') and lastTraversed != name: + for n in list(traversedNames): + if n.startswith('.'): + # remove obsolete target refs + traversedNames.remove(n) + #if traversedNames: + # lastTraversed = traversedNames[-1] + # if lastTraversed.startswith('.') and lastTraversed != name: # let tag show the current object - traversedNames[-1] = name + # traversedNames[-1] = name + # let tag show the current object + traversedNames.append(name) return name def getTarget(self, name):