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:
parent
0cf020c289
commit
d8ffeb5ce1
6 changed files with 74 additions and 47 deletions
|
@ -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'
|
||||
|
|
|
@ -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'):
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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'))
|
||||
|
|
|
@ -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
42
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 <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)
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue