add pageName field to layout node interface, use for selecting suitable layouts; let traversal adapter store page name in request annotation

git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@3005 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2008-11-23 21:40:48 +00:00
parent 73042183b3
commit 267bc66b92
5 changed files with 43 additions and 6 deletions

View file

@ -35,6 +35,8 @@ from loops.view import Node
class LayoutNode(Node): class LayoutNode(Node):
pageName = u''
implements(ILayoutNode, ILayoutNodeContained) implements(ILayoutNode, ILayoutNodeContained)
@ -42,6 +44,10 @@ class LayoutNode(Node):
class NodeLayoutInstance(LayoutInstance): class NodeLayoutInstance(LayoutInstance):
@Lazy
def viewAnnotations(self):
return self.view.request.annotations.get('loops.view', {})
@Lazy @Lazy
def target(self): def target(self):
return adapted(self.context.target) return adapted(self.context.target)
@ -81,6 +87,7 @@ class TargetLayoutInstance(NodeLayoutInstance):
""" Return sublayout instances specified by the target object. """ Return sublayout instances specified by the target object.
""" """
target = self.target target = self.target
pageName = self.viewAnnotations.get('pageName', u'')
if region is None or target is None: if region is None or target is None:
return [] return []
result = [] result = []
@ -88,17 +95,20 @@ class TargetLayoutInstance(NodeLayoutInstance):
tp = target.context.conceptType tp = target.context.conceptType
for n in tp.getClients(): for n in tp.getClients():
if n.nodeType == 'info' and n.viewName in names: if n.nodeType == 'info' and n.viewName in names:
if pageName != n.pageName:
continue
layout = region.layouts[n.viewName] layout = region.layouts[n.viewName]
li = component.getAdapter(n, ILayoutInstance, li = component.getAdapter(n, ILayoutInstance,
name=layout.instanceName) name=layout.instanceName)
li.template = layout li.template = layout
result.append(li) result.append(li)
# TODO: if not result: provide error info with names, pageName,
# info on client nodes
return result return result
@Lazy @Lazy
def target(self): def target(self):
viewAnnotations = self.view.request.annotations.get('loops.view', {}) target = self.viewAnnotations.get('target')
target = viewAnnotations.get('target')
if target is None: if target is None:
target = adapted(self.context.target) target = adapted(self.context.target)
return target return target

View file

@ -18,11 +18,11 @@
name="AddLoopsLayoutNode.html" name="AddLoopsLayoutNode.html"
content_factory="loops.layout.base.LayoutNode" content_factory="loops.layout.base.LayoutNode"
schema="loops.layout.interfaces.ILayoutNode" schema="loops.layout.interfaces.ILayoutNode"
fields="title description nodeType viewName body" fields="title description nodeType viewName pageName body"
template="../../browser/add.pt" template="../../browser/add.pt"
permission="zope.ManageContent"> permission="zope.ManageContent">
<widget field="description" height="2" /> <widget field="description" height="2" />
<widget field="body" height="8" /> <widget field="body" height="3" />
</browser:addform> </browser:addform>
<browser:addMenuItem <browser:addMenuItem
@ -32,6 +32,19 @@
permission="zope.ManageContent" permission="zope.ManageContent"
view="AddLoopsLayoutNode.html" /> view="AddLoopsLayoutNode.html" />
<browser:editform
label="Edit Node"
name="edit.html"
schema="loops.layout.interfaces.ILayoutNode"
fields="title description nodeType viewName pageName body"
for="loops.layout.interfaces.ILayoutNode"
template="../../browser/edit.pt"
permission="zope.ManageContent"
menu="zmi_views" title="Edit Node">
<widget field="description" height="2" />
<widget field="body" height="3" />
</browser:editform>
<!-- target views --> <!-- target views -->
<zope:adapter <zope:adapter

View file

@ -25,6 +25,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.component import adapts from zope.component import adapts
from zope.publisher.interfaces import NotFound
from loops.common import adapted from loops.common import adapted
from loops.i18n.browser import LanguageInfo from loops.i18n.browser import LanguageInfo
@ -38,6 +39,7 @@ class NodeTraverser(ItemTraverser):
adapts(ILayoutNode) adapts(ILayoutNode)
def publishTraverse(self, request, name): def publishTraverse(self, request, name):
viewAnnotations = request.annotations.setdefault('loops.view', {})
if name.startswith('.'): if name.startswith('.'):
if len(name) > 1: if len(name) > 1:
if '-' in name: if '-' in name:
@ -54,5 +56,9 @@ class NodeTraverser(ItemTraverser):
viewAnnotations['target'] = target viewAnnotations['target'] = target
#return target #return target
return self.context return self.context
obj = super(NodeTraverser, self).publishTraverse(request, name) try:
obj = super(NodeTraverser, self).publishTraverse(request, name)
except NotFound, e:
viewAnnotations['pageName'] = name
return self.context
return obj return obj

View file

@ -24,6 +24,7 @@ $Id$
from zope.app.container.constraints import contains, containers from zope.app.container.constraints import contains, containers
from zope.interface import Interface from zope.interface import Interface
from zope import schema
from loops.interfaces import INodeSchema, IBaseNode, INode, IViewManager from loops.interfaces import INodeSchema, IBaseNode, INode, IViewManager
@ -33,6 +34,13 @@ class ILayoutView(INodeSchema):
presentation mechanism. presentation mechanism.
""" """
pageName = schema.TextLine(
title=_(u'Page name'),
description=_(u'Name that may be used to identify the layout '
u'via a name in the URL.'),
default=u'',
required=False)
class ILayoutNode(ILayoutView, INode): class ILayoutNode(ILayoutView, INode):

View file

@ -21,7 +21,7 @@ loops version specifications.
""" """
revision = '$Id$' revision = '$Id$'
shortVersion = '0.8' shortVersion = '0.9'
longVersion = '%s-%s' % (shortVersion, ' '.join(revision.split()[2:5])) longVersion = '%s-%s' % (shortVersion, ' '.join(revision.split()[2:5]))
versions = dict(loops=shortVersion) versions = dict(loops=shortVersion)