[Checkins] SVN: grok/branches/ksmith_mcweekly-viewlet/src/grok/ * based on Lennart Regebro's work on megrok.viewlet

Kevin Smith kevin at mcweekly.com
Thu Apr 26 02:13:36 EDT 2007


Log message for revision 74778:
  * based on Lennart Regebro's work on megrok.viewlet
  * add components grok.ViewletManager, grok.Viewlet
  * add directive grok.viewletmanager
  
  usage
  -----
  
  class MyView(grok.View):
      pass
  
  myview.pt
  <span tal:replace="provider:boxes" />
  
  class Boxes(grok.ViewletManager):
      grok.context(MyView)
      grok.name('boxes') #default, available as provider:boxes
  
  class Box1(grok.Viewlet):
      grok.viewletmanager(Boxes)
      def render(self):
          return "Box1"
  
  class Box2(grok.Viewlet):
      grok.viewletmanager(Boxes)
      def render(self):
          return "Box2"
  
  

Changed:
  U   grok/branches/ksmith_mcweekly-viewlet/src/grok/__init__.py
  U   grok/branches/ksmith_mcweekly-viewlet/src/grok/components.py
  U   grok/branches/ksmith_mcweekly-viewlet/src/grok/directive.py
  U   grok/branches/ksmith_mcweekly-viewlet/src/grok/ftests/static/simple_fixture/ellie.py
  U   grok/branches/ksmith_mcweekly-viewlet/src/grok/interfaces.py
  U   grok/branches/ksmith_mcweekly-viewlet/src/grok/meta.py
  U   grok/branches/ksmith_mcweekly-viewlet/src/grok/tests/test_grok.py

-=-
Modified: grok/branches/ksmith_mcweekly-viewlet/src/grok/__init__.py
===================================================================
--- grok/branches/ksmith_mcweekly-viewlet/src/grok/__init__.py	2007-04-26 04:03:07 UTC (rev 74777)
+++ grok/branches/ksmith_mcweekly-viewlet/src/grok/__init__.py	2007-04-26 06:13:36 UTC (rev 74778)
@@ -34,10 +34,12 @@
 from grok.components import PageTemplate, PageTemplateFile, Container, Traverser
 from grok.components import Site, GlobalUtility, LocalUtility, Annotation
 from grok.components import Application, Form, AddForm, EditForm, DisplayForm
-from grok.components import Indexes, Skin
+from grok.components import Indexes, Skin, ViewletManager, Viewlet
+
 from grok.directive import (context, name, template, templatedir, provides,
                             baseclass, global_utility, local_utility,
-                            define_permission, require, site, layer)
+                            define_permission, require, site, layer,
+                            viewletmanager)
 
 from grok._grok import do_grok as grok  # Avoid name clash within _grok
 from grok._grok import SubscribeDecorator as subscribe

Modified: grok/branches/ksmith_mcweekly-viewlet/src/grok/components.py
===================================================================
--- grok/branches/ksmith_mcweekly-viewlet/src/grok/components.py	2007-04-26 04:03:07 UTC (rev 74777)
+++ grok/branches/ksmith_mcweekly-viewlet/src/grok/components.py	2007-04-26 06:13:36 UTC (rev 74778)
@@ -39,6 +39,8 @@
 from zope.traversing.browser.absoluteurl import AbsoluteURL
 from zope.traversing.browser.absoluteurl import _safe as SAFE_URL_CHARACTERS
 from zope.annotation.interfaces import IAttributeAnnotatable
+from zope.viewlet.manager import ViewletManagerBase
+from zope.viewlet.viewlet import ViewletBase
 
 from zope.app.pagetemplate.engine import TrustedAppPT
 from zope.app.publisher.browser import getDefaultViewName
@@ -510,3 +512,11 @@
 
 class Skin(object):
     pass
+
+
+class ViewletManager(ViewletManagerBase):
+    template = None
+    
+        
+class Viewlet(ViewletBase):
+    pass

Modified: grok/branches/ksmith_mcweekly-viewlet/src/grok/directive.py
===================================================================
--- grok/branches/ksmith_mcweekly-viewlet/src/grok/directive.py	2007-04-26 04:03:07 UTC (rev 74777)
+++ grok/branches/ksmith_mcweekly-viewlet/src/grok/directive.py	2007-04-26 06:13:36 UTC (rev 74778)
@@ -284,3 +284,5 @@
 layer = InterfaceOrClassDirective('grok.layer',
                            ClassOrModuleDirectiveContext())
 
+viewletmanager = InterfaceOrClassDirective('grok.viewletmanager',
+                                           ClassDirectiveContext())

Modified: grok/branches/ksmith_mcweekly-viewlet/src/grok/ftests/static/simple_fixture/ellie.py
===================================================================
--- grok/branches/ksmith_mcweekly-viewlet/src/grok/ftests/static/simple_fixture/ellie.py	2007-04-26 04:03:07 UTC (rev 74777)
+++ grok/branches/ksmith_mcweekly-viewlet/src/grok/ftests/static/simple_fixture/ellie.py	2007-04-26 06:13:36 UTC (rev 74778)
@@ -19,7 +19,6 @@
 class MammothSkin(grok.Skin):
     grok.layer(MammothLayer)
 
-
 class CaveDrawings(grok.View):
 
     def render(self):

Modified: grok/branches/ksmith_mcweekly-viewlet/src/grok/interfaces.py
===================================================================
--- grok/branches/ksmith_mcweekly-viewlet/src/grok/interfaces.py	2007-04-26 04:03:07 UTC (rev 74777)
+++ grok/branches/ksmith_mcweekly-viewlet/src/grok/interfaces.py	2007-04-26 06:13:36 UTC (rev 74778)
@@ -41,8 +41,12 @@
     AddForm = interface.Attribute("Base class for add forms.")
     EditForm = interface.Attribute("Base class for edit forms.")
     DisplayForm = interface.Attribute("Base class for display forms.")
-    Layer = interface.Attribute("Base interface for skin layers.")
+    Layer = interface.Attribute("Base interface for layer.")
+    Skin  = interface.Attribute("Base interface for skin.")
+    ViewletManager = interface.Attribute("Base interface for viewletmanager.")
+    Viewlet = interface.Attribute("Base interface for viewlet.")
 
+
 class IGrokErrors(interface.Interface):
 
     def GrokError(message, component):
@@ -81,11 +85,6 @@
         This directive acts as a contraint on the 'request' of
         grok.View. This directive can only be used on class level."""
 
-    def skin(skin):
-        """Declare this layer as a named skin.
-
-        This directive can only be used on class level."""
-
     def template(template):
         """Declare the template name for a view.
 
@@ -131,8 +130,6 @@
                  The site should in this case be a container.
         name_in_container - the name to use for storing the utility
         """
-    def register_skin(name, iface):
-        """Register skin name for layer."""
 
     def define_permission(permission):
         """Defines a new permission with the id ``permission``."""

Modified: grok/branches/ksmith_mcweekly-viewlet/src/grok/meta.py
===================================================================
--- grok/branches/ksmith_mcweekly-viewlet/src/grok/meta.py	2007-04-26 04:03:07 UTC (rev 74777)
+++ grok/branches/ksmith_mcweekly-viewlet/src/grok/meta.py	2007-04-26 06:13:36 UTC (rev 74778)
@@ -7,8 +7,11 @@
                                                IBrowserPublisher,
                                                IBrowserSkinType)
 from zope.publisher.interfaces.xmlrpc import IXMLRPCRequest
+from zope.publisher.browser import IBrowserView
+from zope.viewlet.interfaces import IViewletManager, IViewlet
 from zope.security.permission import Permission
 from zope.security.interfaces import IPermission
+from zope.security.checker import NamesChecker, defineChecker
 from zope.annotation.interfaces import IAnnotations
 
 from zope.app.publisher.xmlrpc import MethodPublisher
@@ -595,3 +598,63 @@
                                     None) or grok.IDefaultBrowserLayer
         name = grok.util.class_annotation(factory, 'grok.name', factory.__name__.lower())
         zope.component.interface.provideInterface(name, layer, IBrowserSkinType)
+
+
+
+class ViewletManagerGrokker(grok.ClassGrokker):
+    component_class = grok.ViewletManager
+
+    def register(self, context, name, factory, module_info, templates):
+
+        name = grok.util.class_annotation(factory, 'grok.name', factory.__name__.lower())
+        view_layer = util.class_annotation(factory, 'grok.layer',
+                                                    None) or module_info.getAnnotation('grok.layer',
+                                                     None) or IDefaultBrowserLayer
+        
+        view_context = util.determine_class_context(factory, context)
+        component.provideAdapter(factory,
+                                 adapts=(None, # TODO: Make configurable
+                                         view_layer, 
+                                         view_context),
+                                 provides=IViewletManager,
+                                 name=factory.__name__.lower())
+
+            
+class ViewletGrokker(grok.ClassGrokker):
+    component_class = grok.Viewlet
+                
+    def register(self, context, name, factory, module_info, templates):
+        # Try to set up permissions (copied from the View grokker)
+        permissions = grok.util.class_annotation(factory, 'grok.require', [])
+        if not permissions:
+            checker = NamesChecker(['update', 'render'])
+        elif len(permissions) > 1:
+            raise GrokError('grok.require was called multiple times in viewlet '
+                            '%r. It may only be called once.' % factory,
+                            factory)
+        elif permissions[0] == 'zope.Public':
+            checker = NamesChecker(['update','render'])
+        else:
+            perm = permissions[0]
+            if component.queryUtility(IPermission, name=perm) is None:
+                raise GrokError('Undefined permission %r in view %r. Use '
+                            'grok.define_permission first.'
+                            % (perm, factory), factory)
+            checker = NamesChecker(['update','render'], permissions[0])
+        
+        defineChecker(factory, checker)
+        
+        # New directive
+        viewletmanager = grok.util.class_annotation(factory, 'grok.viewletmanager', [])
+        layer = util.class_annotation(factory, 'grok.layer',
+                                            None) or module_info.getAnnotation('grok.layer',
+                                             None) or IDefaultBrowserLayer
+       
+        component.provideAdapter(factory,
+                                 adapts=(None, # TODO: Make configurable
+                                         layer,
+                                         IBrowserView,
+                                         viewletmanager),
+                                 provides=IViewlet,
+                                 name=name)
+

Modified: grok/branches/ksmith_mcweekly-viewlet/src/grok/tests/test_grok.py
===================================================================
--- grok/branches/ksmith_mcweekly-viewlet/src/grok/tests/test_grok.py	2007-04-26 04:03:07 UTC (rev 74777)
+++ grok/branches/ksmith_mcweekly-viewlet/src/grok/tests/test_grok.py	2007-04-26 06:13:36 UTC (rev 74778)
@@ -2,10 +2,12 @@
 from pkg_resources import resource_listdir
 from zope.testing import doctest, cleanup
 import zope.component.eventtesting
+import zope.viewlet.tests
 
 def setUpZope(test):
     zope.component.eventtesting.setUp(test)
-
+    zope.viewlet.tests.setUp(test) # setup 'provider' talnamespace
+    
 def cleanUpZope(test):
     cleanup.cleanUp()
 



More information about the Checkins mailing list