[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