[Checkins] SVN: grok/branches/snowsprint-viewlets2/src/grok/ Add new test for context association, and make it work.

Martijn Faassen faassen at infrae.com
Thu Jan 24 10:12:20 EST 2008


Log message for revision 83169:
  Add new test for context association, and make it work.
  

Changed:
  A   grok/branches/snowsprint-viewlets2/src/grok/ftests/viewlet/viewlet_context.py
  A   grok/branches/snowsprint-viewlets2/src/grok/ftests/viewlet/viewlet_context2.py
  U   grok/branches/snowsprint-viewlets2/src/grok/meta.py

-=-
Added: grok/branches/snowsprint-viewlets2/src/grok/ftests/viewlet/viewlet_context.py
===================================================================
--- grok/branches/snowsprint-viewlets2/src/grok/ftests/viewlet/viewlet_context.py	                        (rev 0)
+++ grok/branches/snowsprint-viewlets2/src/grok/ftests/viewlet/viewlet_context.py	2008-01-24 15:12:19 UTC (rev 83169)
@@ -0,0 +1,72 @@
+"""
+Viewlets and viewlet managers auto-associate with the context object that
+may be in a module.
+
+Set up the model object to view::
+
+  >>> root = getRootFolder()
+  >>> root['cave'] = cave = Cave()
+
+We also set up another model that the viewlet manager and viewlets should
+not be associated with::
+
+  >>> from viewlet_context2 import Club
+  >>> root['club'] = club = Club()
+
+Let's get a viewletmanager associated with ``cave``::
+
+  >>> from zope.publisher.browser import TestRequest
+  >>> request = TestRequest()
+  >>> from zope import component
+  >>> view = component.getMultiAdapter((cave, request), name='index')
+  >>> from zope.contentprovider.interfaces import IContentProvider
+  >>> mgr = component.getMultiAdapter((cave, request, view), IContentProvider,
+  ...   'manage.cavemen')
+  
+We cannot get this viewletmanager for ``club``, as there is no viewlet
+manager associated with that as a context::
+
+  >>> component.queryMultiAdapter((club, request, view), IContentProvider,
+  ...   'manage.caveman') is None
+  True
+
+We can get the viewlet for ``cave``::
+  
+  >>> mgr['fredviewlet']
+  <grok.ftests.viewlet.viewlet_context.FredViewlet object at ...>
+
+We can also directly look it up using a manual lookup::
+
+  >>> from zope.viewlet.interfaces import IViewlet
+  >>> viewlet = component.getMultiAdapter((cave, request, view, mgr),
+  ...   IViewlet, name='fredviewlet')
+
+We cannot get the viewlet for the ``club`` however, as it is not associated
+with the same context::
+
+  >>> viewlet = component.getMultiAdapter((club, request, view, mgr),
+  ...   IViewlet, name='fredviewlet')
+  Traceback (most recent call last):
+    ...
+  ComponentLookupError: ...
+
+"""
+
+import grok
+from zope.interface import Interface
+
+class CavemenViewletManager(grok.ViewletManager):
+    grok.name('manage.cavemen')
+
+class FredViewlet(grok.Viewlet):
+    grok.viewletmanager(CavemenViewletManager)
+
+    def render(self):
+        return 'Me Fred'
+
+class Cave(grok.Model):
+    pass
+
+class Index(grok.View):
+    def render(self):
+        return "hoi"

Added: grok/branches/snowsprint-viewlets2/src/grok/ftests/viewlet/viewlet_context2.py
===================================================================
--- grok/branches/snowsprint-viewlets2/src/grok/ftests/viewlet/viewlet_context2.py	                        (rev 0)
+++ grok/branches/snowsprint-viewlets2/src/grok/ftests/viewlet/viewlet_context2.py	2008-01-24 15:12:19 UTC (rev 83169)
@@ -0,0 +1,10 @@
+"""
+This file is used by viewlet_context. It defines a model that the viewlets
+and viewlet manager should *not* be associating with.
+"""
+
+import grok
+
+class Club(grok.Model):
+    pass
+

Modified: grok/branches/snowsprint-viewlets2/src/grok/meta.py
===================================================================
--- grok/branches/snowsprint-viewlets2/src/grok/meta.py	2008-01-24 13:53:19 UTC (rev 83168)
+++ grok/branches/snowsprint-viewlets2/src/grok/meta.py	2008-01-24 15:12:19 UTC (rev 83169)
@@ -903,10 +903,11 @@
     component_class = grok.Viewlet
 
     def grok(self, name, factory, module_info, config, **kw):
+        viewlet_name = get_name_classname(factory)
+        view_context = get_context(module_info, factory)
+
         factory.module_info = module_info # to make /static available
 
-        view_context = get_context(module_info, factory)
-        
         # find templates
         templates = module_info.getAnnotation('grok.templates', None)
         if templates is not None:
@@ -928,10 +929,10 @@
     
         config.action(
             discriminator = ('viewlet', view_context, view_layer,
-                             view, viewletmanager, name),
+                             view, viewletmanager, viewlet_name),
             callable = component.provideAdapter,
             args = (factory, (view_context, view_layer, view,
-                    viewletmanager), IViewlet, name)
+                    viewletmanager), IViewlet, viewlet_name)
             )
 
         permission = get_default_permission(factory)



More information about the Checkins mailing list