set view configuration already during node traversal - make sure the skin is set before creating/invoking the view controller

git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@2306 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2008-01-11 08:53:10 +00:00
parent 0cf020c289
commit d8ffeb5ce1
6 changed files with 74 additions and 47 deletions

View file

@ -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'

View file

@ -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'):

View file

@ -685,7 +685,7 @@
for="loops.resource.ResourceTypeSourceList
zope.publisher.interfaces.browser.IBrowserRequest" />
<zope:view factory="loops.view.NodeTraverser"
<zope:view factory="loops.browser.node.NodeTraverser"
for="loops.interfaces.INode"
type="zope.publisher.interfaces.http.IHTTPRequest"
provides="zope.publisher.interfaces.browser.IBrowserPublisher"

View file

@ -29,6 +29,7 @@ from zope.annotation.interfaces import IAnnotations
from zope.app.catalog.interfaces import ICatalog
from zope.app.container.browser.contents import JustContents
from zope.app.container.browser.adding import Adding
from zope.app.container.traversal import ItemTraverser
from zope.app.pagetemplate import ViewPageTemplateFile
from zope.app.security.interfaces import IUnauthenticatedPrincipal
from zope.dottedname.resolve import resolve
@ -65,9 +66,13 @@ class NodeView(BaseView):
_itemNum = 0
#template = NamedTemplate('loops.node_macros')
template = node_macros
def __init__(self, context, request):
super(NodeView, self).__init__(context, request)
viewConfig = getViewConfiguration(context, request)
self.setSkin(viewConfig.get('skinName'))
@Lazy
def macro(self):
return self.template.macros['content']
@ -677,3 +682,66 @@ class NodeViewConfigurator(configurator.ViewConfigurator):
return result
# traveral adapter
class NodeTraverser(ItemTraverser):
component.adapts(INode)
def publishTraverse(self, request, name):
if self.context.nodeType == 'menu':
setViewConfiguration(self.context, request)
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 <base .../> 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'))

View file

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

42
view.py
View file

@ -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 <base .../> 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)