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
This commit is contained in:
helmutm 2009-03-30 17:38:16 +00:00
parent b82f776b0b
commit 79e225e054
3 changed files with 38 additions and 6 deletions

View file

@ -50,6 +50,14 @@ class BaseView(object):
def virtualTarget(self): def virtualTarget(self):
return self.viewAnnotations.get('target') return self.viewAnnotations.get('target')
@Lazy
def virtualTargetView(self):
return self.viewAnnotations.get('targetView')
@Lazy
def node(self):
return self.viewAnnotations.get('node')
@Lazy @Lazy
def title(self): def title(self):
return self.context.title return self.context.title

View file

@ -44,6 +44,10 @@ class LayoutNodeView(Page):
def conceptManager(self): def conceptManager(self):
return self.loopsRoot.getConceptManager() return self.loopsRoot.getConceptManager()
@Lazy
def resourceManager(self):
return self.loopsRoot.getResourceManager()
@Lazy @Lazy
def defaultPredicate(self): def defaultPredicate(self):
return self.conceptManager.getDefaultPredicate() return self.conceptManager.getDefaultPredicate()

View file

@ -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 # 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 # 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.app.container.traversal import ItemTraverser
from zope.cachedescriptors.property import Lazy from zope.cachedescriptors.property import Lazy
from zope import component
from zope.component import adapts from zope.component import adapts
from zope.publisher.interfaces import NotFound from zope.publisher.interfaces import NotFound
@ -40,21 +41,26 @@ class NodeTraverser(ItemTraverser):
def publishTraverse(self, request, name): def publishTraverse(self, request, name):
viewAnnotations = request.annotations.setdefault('loops.view', {}) viewAnnotations = request.annotations.setdefault('loops.view', {})
viewAnnotations['node'] = self.context
if name == '.loops':
return self.context.getLoopsRoot()
if name.startswith('.'): 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: if '-' in name:
name, ignore = name.split('-', 1) name, ignore = name.split('-', 1)
uid = int(name[1:]) uid = int(name)
target = util.getObjectForUid(uid) target = util.getObjectForUid(uid)
else: else:
target = self.context.target target = self.context.target
if target is not None: if target is not None:
#viewAnnotations = request.annotations.setdefault('loops.view', {})
viewAnnotations['node'] = self.context
target = getVersion(target, request) target = getVersion(target, request)
target = adapted(target, LanguageInfo(target, request)) target = adapted(target, LanguageInfo(target, request))
viewAnnotations['target'] = target viewAnnotations['target'] = target
#return target tv = component.getMultiAdapter((target, request), name='layout')
viewAnnotations['targetView'] = tv
return self.context return self.context
try: try:
obj = super(NodeTraverser, self).publishTraverse(request, name) obj = super(NodeTraverser, self).publishTraverse(request, name)
@ -62,3 +68,17 @@ class NodeTraverser(ItemTraverser):
viewAnnotations['pageName'] = name viewAnnotations['pageName'] = name
return self.context return self.context
return obj 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 <base .../> tag show the current object
traversedNames[-1] = name
return name