use default sublayout if no suitable target layout is available; issue a warning if no target layout found

git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@3433 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2009-06-29 09:31:37 +00:00
parent a16fa69fe5
commit e1c163c887

View file

@ -22,10 +22,12 @@ Layout node + instance implementations.
$Id$
"""
from logging import getLogger
from zope import component
from zope.component import adapts
from zope.cachedescriptors.property import Lazy
from zope.interface import implements
from zope.traversing.api import getName
from cybertools.composer.layout.base import Layout, LayoutInstance
from cybertools.composer.layout.interfaces import ILayoutInstance
@ -34,6 +36,9 @@ from loops.layout.interfaces import ILayoutNode, ILayoutNodeContained
from loops.view import Node
logger = getLogger('loops.layout')
class LayoutNode(Node):
pageName = u''
@ -102,6 +107,7 @@ class TargetLayoutInstance(NodeLayoutInstance):
pageName = self.viewAnnotations.get('pageName', u'')
obj = self.target.context
tp = obj.getType()
found = False
for n in obj.getClients() + tp.getClients():
if not ILayoutNode.providedBy(n):
continue
@ -113,8 +119,18 @@ class TargetLayoutInstance(NodeLayoutInstance):
name=layout.instanceName)
li.template = layout
result.append(li)
# TODO: if not result: provide error info with names, pageName,
# info on client nodes
found = True
if not found:
if self.template.defaultSublayout is None:
logger.warn('No target layout found: pageName = %r, target = %r'
% (pageName, getName(obj)))
else:
layout = region.layouts.get(self.template.defaultSublayout)
if layout is not None:
li = component.getAdapter(self.context, ILayoutInstance,
name=layout.instanceName)
li.template = layout
result.append(li)
return result
@Lazy