[Checkins] SVN: grokcore.traverser/trunk/src/grokcore/traverser/ add a layer to traverser components
Christian Klinger
cvs-admin at zope.org
Tue Nov 13 09:33:49 UTC 2012
Log message for revision 128269:
add a layer to traverser components
Changed:
A grokcore.traverser/trunk/src/grokcore/traverser/ftests/traversal/traverser_with_layer.py
U grokcore.traverser/trunk/src/grokcore/traverser/meta.py
-=-
Added: grokcore.traverser/trunk/src/grokcore/traverser/ftests/traversal/traverser_with_layer.py
===================================================================
--- grokcore.traverser/trunk/src/grokcore/traverser/ftests/traversal/traverser_with_layer.py (rev 0)
+++ grokcore.traverser/trunk/src/grokcore/traverser/ftests/traversal/traverser_with_layer.py 2012-11-13 09:33:48 UTC (rev 128269)
@@ -0,0 +1,90 @@
+"""
+Apart from using the ``traverse`` method on a model, you can
+also create a separate traverser component:
+
+ >>> getRootFolder()["herd"] = Herd('The Big Mammoth Herd')
+
+ >>> from zope.app.wsgi.testlayer import Browser
+ >>> browser = Browser()
+ >>> browser.handleErrors = False
+ >>> browser.open("http://localhost/herd/manfred")
+ >>> print browser.contents
+ <html>
+ <body>
+ <h1>Hello, Manfred!</h1>
+ <p>Manfred is part of The Big Mammoth Herd.</p>
+ </body>
+ </html>
+
+ >>> browser.open("http://localhost/herd/ellie")
+ >>> print browser.contents
+ <html>
+ <body>
+ <h1>Hello, Ellie!</h1>
+ <p>Ellie is part of The Big Mammoth Herd.</p>
+ </body>
+ </html>
+
+Now let's call the same URI on a different Layer.
+
+ >>> browser.open("http://localhost/++skin++elephant/herd/ellie")
+ >>> print browser.contents
+ <html>
+ <body>
+ <h1>Hello, Ellie Elephant!</h1>
+ <p>Ellie Elephant is part of The Big Mammoth Herd.</p>
+ </body>
+ </html>
+"""
+import grokcore.component as grok
+import grokcore.content as content
+import grokcore.traverser
+import grokcore.view as view
+
+
+class ElephantLayer(view.IDefaultBrowserLayer):
+ pass
+
+class ElephantSkin(ElephantLayer):
+ view.skin('elephant')
+
+
+class Herd(content.Model):
+
+ def __init__(self, name):
+ self.name = name
+
+
+class HerdTraverser(grokcore.traverser.Traverser):
+ grok.context(Herd)
+
+ def traverse(self, name):
+ return Mammoth(name)
+
+
+class ElephantTraverser(grokcore.traverser.Traverser):
+ grok.context(Herd)
+ view.layer(ElephantLayer)
+
+ def traverse(self, name):
+ return Mammoth(name + ' Elephant')
+
+
+class Mammoth(content.Model):
+
+ def __init__(self, name):
+ self.name = name
+
+grok.context(Mammoth)
+
+class Index(view.View):
+ pass
+
+index = view.PageTemplate("""\
+<html>
+<body>
+<h1>Hello, <span tal:replace="context/name/title" />!</h1>
+<p><span tal:replace="context/name/title" /> is part of <span tal:replace="context/__parent__/name" />.</p>
+</body>
+</html>
+""")
Modified: grokcore.traverser/trunk/src/grokcore/traverser/meta.py
===================================================================
--- grokcore.traverser/trunk/src/grokcore/traverser/meta.py 2012-11-12 22:48:44 UTC (rev 128268)
+++ grokcore.traverser/trunk/src/grokcore/traverser/meta.py 2012-11-13 09:33:48 UTC (rev 128269)
@@ -23,20 +23,23 @@
"""
import martian
+import grokcore.view
import grokcore.traverser
import grokcore.component
from zope.publisher.interfaces.http import IHTTPRequest
from zope.publisher.interfaces.browser import IBrowserPublisher
+from zope.publisher.interfaces.browser import IDefaultBrowserLayer
class TraverserGrokker(martian.ClassGrokker):
"""Grokker for subclasses of `grok.Traverser`."""
martian.component(grokcore.traverser.Traverser)
martian.directive(grokcore.component.context)
+ martian.directive(grokcore.view.layer, default=IDefaultBrowserLayer)
- def execute(self, factory, config, context, **kw):
- adapts = (context, IHTTPRequest)
+ def execute(self, factory, config, context, layer, **kw):
+ adapts = (context, layer)
config.action(
discriminator=('adapter', adapts, IBrowserPublisher, ''),
callable=grokcore.component.provideAdapter,
More information about the checkins
mailing list