From 79e225e05444402b96e4519137d71ad3ee850475 Mon Sep 17 00:00:00 2001 From: helmutm Date: Mon, 30 Mar 2009 17:38:16 +0000 Subject: [PATCH] layout node traversal: handling of special cases, keep target view in request git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@3313 fd906abe-77d9-0310-91a1-e0d9ade77398 --- layout/browser/base.py | 8 ++++++++ layout/browser/node.py | 4 ++++ layout/browser/traversal.py | 32 ++++++++++++++++++++++++++------ 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/layout/browser/base.py b/layout/browser/base.py index a52cb3a..430e9d3 100644 --- a/layout/browser/base.py +++ b/layout/browser/base.py @@ -50,6 +50,14 @@ class BaseView(object): def virtualTarget(self): return self.viewAnnotations.get('target') + @Lazy + def virtualTargetView(self): + return self.viewAnnotations.get('targetView') + + @Lazy + def node(self): + return self.viewAnnotations.get('node') + @Lazy def title(self): return self.context.title diff --git a/layout/browser/node.py b/layout/browser/node.py index 2d4dbd1..65b23a1 100644 --- a/layout/browser/node.py +++ b/layout/browser/node.py @@ -44,6 +44,10 @@ class LayoutNodeView(Page): def conceptManager(self): return self.loopsRoot.getConceptManager() + @Lazy + def resourceManager(self): + return self.loopsRoot.getResourceManager() + @Lazy def defaultPredicate(self): return self.conceptManager.getDefaultPredicate() diff --git a/layout/browser/traversal.py b/layout/browser/traversal.py index b4a13a2..94719d8 100644 --- a/layout/browser/traversal.py +++ b/layout/browser/traversal.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2008 Helmut Merz helmutm@cy55.de +# Copyright (c) 2009 Helmut Merz helmutm@cy55.de # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -24,6 +24,7 @@ $Id$ from zope.app.container.traversal import ItemTraverser from zope.cachedescriptors.property import Lazy +from zope import component from zope.component import adapts from zope.publisher.interfaces import NotFound @@ -40,21 +41,26 @@ class NodeTraverser(ItemTraverser): def publishTraverse(self, request, name): viewAnnotations = request.annotations.setdefault('loops.view', {}) + viewAnnotations['node'] = self.context + if name == '.loops': + return self.context.getLoopsRoot() if name.startswith('.'): - if len(name) > 1: + name = self.cleanUpTraversalStack(request, name)[1:] + if name: + if name.startswith('target'): + name = name[6:] if '-' in name: name, ignore = name.split('-', 1) - uid = int(name[1:]) + uid = int(name) target = util.getObjectForUid(uid) else: target = self.context.target if target is not None: - #viewAnnotations = request.annotations.setdefault('loops.view', {}) - viewAnnotations['node'] = self.context target = getVersion(target, request) target = adapted(target, LanguageInfo(target, request)) viewAnnotations['target'] = target - #return target + tv = component.getMultiAdapter((target, request), name='layout') + viewAnnotations['targetView'] = tv return self.context try: obj = super(NodeTraverser, self).publishTraverse(request, name) @@ -62,3 +68,17 @@ class NodeTraverser(ItemTraverser): viewAnnotations['pageName'] = name return self.context return obj + + def cleanUpTraversalStack(self, request, name): + traversalStack = request._traversal_stack + while traversalStack and traversalStack[0].startswith('.'): + # skip obsolete target references in the url + name = traversalStack.pop(0) + traversedNames = request._traversed_names + if traversedNames: + lastTraversed = traversedNames[-1] + if lastTraversed.startswith('.') and lastTraversed != name: + # let tag show the current object + traversedNames[-1] = name + return name +