[Checkins] SVN: grok/branches/snowsprint-viewlets/src/grok/ Added a grok.view() directive for use with viewlets and viewlet managers.

Tim Terlegård tim.terlegard at valentinewebsystems.se
Tue Jan 22 12:00:25 EST 2008


Log message for revision 83094:
  Added a grok.view() directive for use with viewlets and viewlet managers.
  

Changed:
  U   grok/branches/snowsprint-viewlets/src/grok/__init__.py
  U   grok/branches/snowsprint-viewlets/src/grok/directive.py
  U   grok/branches/snowsprint-viewlets/src/grok/ftests/viewlet/viewlet_security.py
  U   grok/branches/snowsprint-viewlets/src/grok/meta.py

-=-
Modified: grok/branches/snowsprint-viewlets/src/grok/__init__.py
===================================================================
--- grok/branches/snowsprint-viewlets/src/grok/__init__.py	2008-01-22 16:35:08 UTC (rev 83093)
+++ grok/branches/snowsprint-viewlets/src/grok/__init__.py	2008-01-22 17:00:25 UTC (rev 83094)
@@ -44,7 +44,8 @@
 
 from grok.directive import (context, name, title, template, templatedir,
                             provides, baseclass, global_utility, local_utility,
-                            permissions, require, site, layer, direct, viewletmanager)
+                            permissions, require, site, layer, direct, viewletmanager,
+                            view)
 from grok.decorators import subscribe, adapter, implementer
 from martian.error import GrokError, GrokImportError
 

Modified: grok/branches/snowsprint-viewlets/src/grok/directive.py
===================================================================
--- grok/branches/snowsprint-viewlets/src/grok/directive.py	2008-01-22 16:35:08 UTC (rev 83093)
+++ grok/branches/snowsprint-viewlets/src/grok/directive.py	2008-01-22 17:00:25 UTC (rev 83094)
@@ -127,3 +127,5 @@
 direct = MarkerDirective('grok.direct', ClassDirectiveContext())
 viewletmanager = InterfaceOrClassDirective('grok.viewletmanager',
                                            ClassDirectiveContext())
+view = InterfaceOrClassDirective('grok.view',
+                                 ClassDirectiveContext())

Modified: grok/branches/snowsprint-viewlets/src/grok/ftests/viewlet/viewlet_security.py
===================================================================
--- grok/branches/snowsprint-viewlets/src/grok/ftests/viewlet/viewlet_security.py	2008-01-22 16:35:08 UTC (rev 83093)
+++ grok/branches/snowsprint-viewlets/src/grok/ftests/viewlet/viewlet_security.py	2008-01-22 17:00:25 UTC (rev 83094)
@@ -12,6 +12,7 @@
 
   >>> root = getRootFolder()
   >>> root['wilma'] = CaveWoman()
+  >>> root['fred'] = CaveMan()
 
 Traverse to the view on the model object. We get the viewlets
 registered for the default layer, with the anybody permission::
@@ -37,7 +38,8 @@
   Gold Bone
   T-Rex Bone
 
-Now we traverse to the view through a skin. Now we gain the viewlet registered for a particular layer, ``LayeredBone``::
+Now we traverse to the view through a skin. We gain the viewlet
+registered for a particular layer, ``LayeredBone``::
 
   >>> browser.open('http://localhost/++skin++boneskin/wilma/@@caveview')
   >>> print browser.contents
@@ -46,10 +48,34 @@
   Layered Bone
   T-Rex Bone
 
+Only viewlets registered for the CaveMan model, ``ManBone``, should up
+when traversing to fred::
+
+  >>> browser.open('http://localhost/fred/@@caveview')
+  >>> print browser.contents
+  Brack Bone
+  Gold Bone
+  Man Bone
+  T-Rex Bone
+
+
+Viewlets registered for a particular view, like ``LadyViewlet``,
+should only associate with that particular one::
+
+  >>> browser.open('http://localhost/fred/@@fireview')
+  >>> print browser.contents
+  Brack Bone
+  Gold Bone
+  Lady Viewlet
+  Man Bone
+  T-Rex Bone
+
+
 """
 
 
 import grok
+from zope.interface import Interface
 from zope.publisher.interfaces.browser import IDefaultBrowserLayer
 
 
@@ -59,19 +85,29 @@
 class CaveWoman(grok.Model):
     pass
 
-class CaveView(grok.View):
+class CaveMan(grok.Model):
     pass
 
+class CaveView(grok.View):
+    grok.context(Interface)
+
+class FireView(grok.View):
+    grok.context(Interface)
+    grok.template('caveview')
+
 class Pot(grok.ViewletManager):
+    grok.context(Interface)
     grok.name('pot')
 
 class TRexBone(grok.Viewlet):
+    grok.context(Interface)
     grok.viewletmanager(Pot)
 
     def render(self):
         return "T-Rex Bone"
 
 class BrackerBone(grok.Viewlet):
+    grok.context(Interface)
     grok.viewletmanager(Pot)
 
     def render(self):
@@ -83,6 +119,7 @@
     grok.permissions('bone.gold')
 
 class GoldBone(grok.Viewlet):
+    grok.context(Interface)
     grok.viewletmanager(Pot)
     grok.require('bone.gold')
 
@@ -93,11 +130,27 @@
     pass
 
 class LayeredBone(grok.Viewlet):
+    grok.context(Interface)
     grok.viewletmanager(Pot)
     grok.layer(IBoneLayer)
 
     def render(self):
         return 'Layered Bone'
 
+class ManBone(grok.Viewlet):
+    grok.viewletmanager(Pot)
+    grok.context(CaveMan)
+
+    def render(self):
+        return "Man Bone"
+
+class LadyViewlet(grok.Viewlet):
+    grok.context(Interface)
+    grok.viewletmanager(Pot)
+    grok.view(FireView)
+
+    def render(self):
+        return 'Lady Viewlet'
+
 class BoneSkin(grok.Skin):
     grok.layer(IBoneLayer)

Modified: grok/branches/snowsprint-viewlets/src/grok/meta.py
===================================================================
--- grok/branches/snowsprint-viewlets/src/grok/meta.py	2008-01-22 16:35:08 UTC (rev 83093)
+++ grok/branches/snowsprint-viewlets/src/grok/meta.py	2008-01-22 17:00:25 UTC (rev 83094)
@@ -884,9 +884,13 @@
                                                     None) or module_info.getAnnotation('grok.layer',
                                                      None) or IDefaultBrowserLayer
 
-        context = module_info.getAnnotation('grok.context', None)
+        context = module_info.getAnnotation('grok.context', interface.Interface)
         view_context = util.determine_class_context(factory, context)
 
+        # content providers can be associated with a view as well
+        # we default to all views, or IBrowserView
+        view = grok.util.class_annotation(factory, 'grok.view', IBrowserView)
+
         view_layer = determine_class_directive('grok.layer', factory,
                                                module_info,
                                                default=IDefaultBrowserLayer)
@@ -894,9 +898,9 @@
         # TODO - manager is registered for IBrowserView instead of the real view
         config.action(
             discriminator = ('viewletManager', view_context, view_layer,
-                             IBrowserView, name),
+                             view, name),
             callable = component.provideAdapter,
-            args = (factory, (interface.Interface, view_layer, IBrowserView),
+            args = (factory, (interface.Interface, view_layer, view),
                     IViewletManager, name)
             )
 
@@ -957,9 +961,13 @@
                 raise GrokError("View %r has no associated template or "
                                 "'render' method." % factory, factory)
 
-        context = module_info.getAnnotation('grok.context', None)
+        context = module_info.getAnnotation('grok.context', interface.Interface)
         view_context = util.determine_class_context(factory, context)
 
+        # content providers can be associated with a view as well
+        # we default to all views, or IBrowserView
+        view = grok.util.class_annotation(factory, 'grok.view', IBrowserView)
+
         viewletmanager = grok.util.class_annotation(factory, 'grok.viewletmanager', [])
         view_layer = util.class_annotation(factory, 'grok.layer',
                                             None) or module_info.getAnnotation('grok.layer',
@@ -967,9 +975,9 @@
 
         config.action(
             discriminator = ('viewlet', view_context, view_layer,
-                             IBrowserView, viewletmanager, name),
+                             view, viewletmanager, name),
             callable = component.provideAdapter,
-            args = (factory, (view_context, view_layer, IBrowserView,
+            args = (factory, (view_context, view_layer, view,
                     viewletmanager), IViewlet, name)
             )
 



More information about the Checkins mailing list