[Checkins] SVN: grok/branches/darrylcousins-branch/ Bringing in z3c layers, dumbing down to IBrowserRequest, offering also minimal and pagelet layers

Darryl Cousins darryl at darrylcousins.net.nz
Sun Jul 1 04:23:50 EDT 2007


Log message for revision 77279:
  Bringing in z3c layers, dumbing down to IBrowserRequest, offering also minimal and pagelet layers

Changed:
  U   grok/branches/darrylcousins-branch/megrok.layer/setup.py
  U   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/__init__.py
  U   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/components.py
  U   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/view.py
  U   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/test_functional.py
  U   grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/meta.py
  U   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/components.py
  U   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/test_functional.py
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/adapter.py
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/adapter_templates/
  A   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/adapter_templates/painting.pt
  U   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view.py
  U   grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/meta.py
  U   grok/branches/darrylcousins-branch/src/grok/components.py
  U   grok/branches/darrylcousins-branch/src/grok/meta.py

-=-
Modified: grok/branches/darrylcousins-branch/megrok.layer/setup.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/setup.py	2007-07-01 06:05:22 UTC (rev 77278)
+++ grok/branches/darrylcousins-branch/megrok.layer/setup.py	2007-07-01 08:23:47 UTC (rev 77279)
@@ -16,6 +16,10 @@
     license='ZPL',
 
     install_requires=['setuptools',
+                      'z3c.layer',
+                      'z3c.template',
+                      'z3c.macro',
+                      'z3c.pagelet',
                      ],
 )
 

Modified: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/__init__.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/__init__.py	2007-07-01 06:05:22 UTC (rev 77278)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/__init__.py	2007-07-01 08:23:47 UTC (rev 77279)
@@ -1,3 +1,4 @@
 from directive import layer
 from components import ILayer, Skin
+from components import IMinimalLayer, IPageletLayer
 

Modified: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/components.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/components.py	2007-07-01 06:05:22 UTC (rev 77278)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/components.py	2007-07-01 08:23:47 UTC (rev 77279)
@@ -1,8 +1,16 @@
-from zope.publisher.interfaces.browser import IDefaultBrowserLayer
+from zope.publisher.interfaces.browser import IBrowserRequest
+from z3c.layer.pagelet import IPageletBrowserLayer
+from z3c.layer.minimal import IMinimalBrowserLayer
 
-class ILayer(IDefaultBrowserLayer):
+class ILayer(IBrowserRequest):
     pass
 
+class IMinimalLayer(IMinimalBrowserLayer):
+    pass
+
+class IPageletLayer(IPageletBrowserLayer):
+    pass
+
 class Skin(object):
     pass
 

Modified: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/view.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/view.py	2007-07-01 06:05:22 UTC (rev 77278)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/layer/view.py	2007-07-01 08:23:47 UTC (rev 77279)
@@ -15,9 +15,8 @@
   </body>
   </html>
   
-In another branch this would raise NotFound
 
-  >>> #browser.open("http://localhost/++skin++Rotterdam/manfred/cavedrawings")
+  >>> browser.open("http://localhost/++skin++Rotterdam/manfred/cavedrawings")
   Traceback (most recent call last):
   ...
   NotFound: Object: <megrok.layer.ftests.layer.view.Mammoth object at ...>, name: u'cavedrawings'

Modified: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/test_functional.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/test_functional.py	2007-07-01 06:05:22 UTC (rev 77278)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/ftests/test_functional.py	2007-07-01 08:23:47 UTC (rev 77279)
@@ -6,7 +6,6 @@
 def suiteFromPackage(name):
     files = resource_listdir(__name__, name)
     suite = unittest.TestSuite()
-    #files = ['view.py']
     for filename in files:
         if not filename.endswith('.py'):
             continue

Modified: grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/meta.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/meta.py	2007-07-01 06:05:22 UTC (rev 77278)
+++ grok/branches/darrylcousins-branch/megrok.layer/src/megrok/layer/meta.py	2007-07-01 08:23:47 UTC (rev 77279)
@@ -2,6 +2,7 @@
 import grok
 import zope.component
 from zope.publisher.interfaces.browser import (IDefaultBrowserLayer,
+                                               IBrowserRequest,
                                                IBrowserSkinType)
 from martian import util
 import megrok.layer
@@ -16,7 +17,7 @@
     def grok(self, name, factory, context, module_info, templates):
         layer = util.class_annotation(factory, 'megrok.layer.layer',
                                     None) or module_info.getAnnotation('megrok.layer.layer',
-                                    None) or IDefaultBrowserLayer
+                                    None) or IBrowserRequest
         name = grok.util.class_annotation(factory, 'grok.name', factory.__name__.lower())
         zope.component.interface.provideInterface(name, layer, IBrowserSkinType)
 

Modified: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/components.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/components.py	2007-07-01 06:05:22 UTC (rev 77278)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/components.py	2007-07-01 08:23:47 UTC (rev 77279)
@@ -9,69 +9,8 @@
 
 from z3c.viewlet.manager import WeightOrderedViewletManager
 
-class ViewBase(object):
+from grok.components import ViewBase
 
-    def _render_template(self):
-        namespace = self.template.pt_getContext()
-        namespace['request'] = self.request
-        namespace['view'] = self
-        namespace['context'] = self.context
-        namespace['static'] = self.static
-        return self.template.pt_render(namespace)
-
-    def application(self):
-        obj = self.context
-        while obj is not None:
-            if isinstance(obj, grok.Application):
-                return obj
-            obj = obj.__parent__
-        raise ValueErrror("No application found.")
-
-    def site(self):
-        obj = self.context
-        while obj is not None:
-            if isinstance(obj, grok.Site):
-                return obj
-            obj = obj.__parent__
-        raise ValueErrror("No site found.")
-
-    def application_url(self, name=None):
-        obj = self.context
-        while obj is not None:
-            if isinstance(obj, grok.Application):
-                return self.url(obj, name)
-            obj = obj.__parent__
-        raise ValueErrror("No application found.")
-
-    def url(self, obj=None, name=None):
-        # if the first argument is a string, that's the name. There should
-        # be no second argument
-        if isinstance(obj, basestring):
-            if name is not None:
-                raise TypeError(
-                    'url() takes either obj argument, obj, string arguments, '
-                    'or string argument')
-            name = obj
-            obj = None
-
-        if name is None and obj is None:
-            # create URL to view itself
-            obj = self
-        elif name is not None and obj is None:
-            # create URL to view on context
-            obj = self.context
-        return url(self.request, obj, name)
-        
-    def redirect(self, url):
-        return self.request.response.redirect(url)
-        
-    @property
-    def response(self):
-        return self.request.response
-
-    def update(self):
-        pass
-
 class TemplateContentBase(object):
     """Mixin class to provide render method using given template"""
 

Modified: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/test_functional.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/test_functional.py	2007-07-01 06:05:22 UTC (rev 77278)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/test_functional.py	2007-07-01 08:23:47 UTC (rev 77279)
@@ -6,7 +6,6 @@
 def suiteFromPackage(name):
     files = resource_listdir(__name__, name)
     suite = unittest.TestSuite()
-    #files = ['view.py']
     for filename in files:
         if not filename.endswith('.py'):
             continue

Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/adapter.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/adapter.py	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/adapter.py	2007-07-01 08:23:47 UTC (rev 77279)
@@ -0,0 +1,101 @@
+"""
+This first doctest demonstrates the use of grok.MultiAdapter to create and
+configure providers, viewletmanagers and viewlets.
+
+It is more wordy and not as convenient as the grokked equivalent.
+
+  >>> import grok
+  >>> from megrok.viewlet.ftests.viewlet.adapter import Mammoth
+  >>> grok.grok('megrok.viewlet.ftests.viewlet.adapter')
+  >>> getRootFolder()["manfred"] = Mammoth()
+
+  >>> from zope.testbrowser.testing import Browser
+  >>> browser = Browser()
+  >>> browser.handleErrors = False
+  >>> browser.open("http://localhost/++skin++myskin/manfred/@@painting")
+  >>> print browser.contents
+  <html>
+  <body>
+  <h1>This is a cave painting</h1>
+  <div><p>Hello World</p></div>
+  </body>
+  </html>
+
+"""
+import grok
+
+from zope.publisher.interfaces.browser import IBrowserRequest, IBrowserView
+from zope.contentprovider.interfaces import IContentProvider
+from zope.viewlet.interfaces import IViewletManager
+from zope.viewlet.interfaces import IViewlet
+from zope.viewlet.viewlet import ViewletBase
+import zope.component
+
+from z3c.viewlet.manager import WeightOrderedViewletManager
+
+import megrok.layer
+
+class Mammoth(grok.Model):
+    pass
+
+class IMySkinLayer(megrok.layer.ILayer):
+    pass
+
+class MySkin(megrok.layer.Skin):
+    megrok.layer.layer(IMySkinLayer)
+
+class Painting(grok.View):
+    """Template must be in *_templates, I tried and I tried to find out
+    why when inline the `provider` tal directive wasn't found"""
+    pass
+
+class MammothContentProvider(grok.MultiAdapter):
+    grok.adapts(Mammoth, IMySkinLayer, IBrowserView)
+    grok.implements(IContentProvider)
+    grok.name('cave')
+
+    def __init__(self, context, request, view):
+        self.context = context
+        self.request = request
+        self.view = self.__parent__ = view
+
+    def update(self):
+        pass
+
+    def render(self):
+        return u'This is a cave painting'
+
+class MammothViewletManager(grok.MultiAdapter, WeightOrderedViewletManager):
+    grok.adapts(Mammoth, IMySkinLayer, IBrowserView)
+    grok.name('cavecolumn')
+
+    def __init__(self, context, request, view):
+        WeightOrderedViewletManager.__init__(self, context, request, view)
+
+    def update(self):
+        viewlets = zope.component.getAdapters(
+                    (self.context, self.request, self.__parent__, self),
+                    IViewlet)
+        self.viewlets = []
+        for viewlet in viewlets:
+            self.viewlets.append(viewlet[1])
+
+    def render(self):
+        return '\n'.join([s.render() for s in self.viewlets])
+
+class HelloWorldViewlet(grok.MultiAdapter):
+    grok.adapts(Mammoth, IMySkinLayer, IBrowserView, IViewletManager)
+    grok.implements(IViewlet)
+    grok.name('helloworld')
+    weight = 0
+
+    def __init__(self, context, request, view, manager):
+        self.__parent__ = view
+        self.context = context
+        self.request = request
+        self.manager = manager
+
+    def render(self):
+        return u'<p>Hello World</p>'
+
+


Property changes on: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/adapter.py
___________________________________________________________________
Name: svn:keywords
   + Id

Added: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/adapter_templates/painting.pt
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/adapter_templates/painting.pt	                        (rev 0)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/adapter_templates/painting.pt	2007-07-01 08:23:47 UTC (rev 77279)
@@ -0,0 +1,7 @@
+<html>
+<body>
+<h1 tal:content="structure provider:cave">Hello, world!</h1>
+<div tal:content="structure provider:cavecolumn">Cave column</div>
+</body>
+</html>
+

Modified: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view.py	2007-07-01 06:05:22 UTC (rev 77278)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/ftests/viewlet/view.py	2007-07-01 08:23:47 UTC (rev 77279)
@@ -24,9 +24,7 @@
   </body>
   </html>
 
-In another branch this would raise NotFound
-
-  >>> #browser.open("http://localhost/manfred/@@skinnedindex")
+  >>> browser.open("http://localhost/manfred/@@skinnedindex")
   Traceback (most recent call last):
   ...
   NotFound...'@@skinnedindex'

Modified: grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/meta.py
===================================================================
--- grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/meta.py	2007-07-01 06:05:22 UTC (rev 77278)
+++ grok/branches/darrylcousins-branch/megrok.viewlet/src/megrok/viewlet/meta.py	2007-07-01 08:23:47 UTC (rev 77279)
@@ -1,7 +1,7 @@
 import martian
 import grok
 from zope import component
-from zope.publisher.interfaces.browser import (IDefaultBrowserLayer,
+from zope.publisher.interfaces.browser import (IBrowserRequest,
                                                IBrowserView)
 from zope.viewlet.interfaces import IViewlet, IViewletManager
 from zope.contentprovider.interfaces import IContentProvider
@@ -68,7 +68,7 @@
 
         view_layer = util.class_annotation(factory, 'megrok.layer.layer',
                                            None) or module_info.getAnnotation('megrok.layer.layer',
-                                               None) or IDefaultBrowserLayer
+                                               None) or IBrowserRequest
 
         view_name = util.class_annotation(factory, 'grok.name',
                                           self.factory_name)
@@ -95,7 +95,7 @@
 
         view_layer = util.class_annotation(factory, 'megrok.layer.layer',
                                            None) or module_info.getAnnotation('megrok.layer.layer',
-                                               None) or IDefaultBrowserLayer
+                                               None) or IBrowserRequest
 
         view_name = util.class_annotation(factory, 'grok.name',
                                           self.factory_name)

Modified: grok/branches/darrylcousins-branch/src/grok/components.py
===================================================================
--- grok/branches/darrylcousins-branch/src/grok/components.py	2007-07-01 06:05:22 UTC (rev 77278)
+++ grok/branches/darrylcousins-branch/src/grok/components.py	2007-07-01 08:23:47 UTC (rev 77279)
@@ -95,47 +95,40 @@
 class Annotation(persistent.Persistent):
     pass
 
+class ViewBase(object):
 
-class View(BrowserPage):
-    interface.implements(interfaces.IGrokView)
-
-    def __init__(self, context, request):
-        super(View, self).__init__(context, request)
-        self.static = component.queryAdapter(
-            self.request,
-            interface.Interface,
-            name=self.module_info.package_dotted_name
-            )
-
-    @property
-    def response(self):
-        return self.request.response
-
-    def __call__(self):
-        mapply(self.update, (), self.request)
-        if self.request.response.getStatus() in (302, 303):
-            # A redirect was triggered somewhere in update().  Don't
-            # continue rendering the template or doing anything else.
-            return
-
-        template = getattr(self, 'template', None)
-        if template is not None:
-            return self._render_template()
-        return mapply(self.render, (), self.request)
-
     def _render_template(self):
         namespace = self.template.pt_getContext()
         namespace['request'] = self.request
         namespace['view'] = self
         namespace['context'] = self.context
-        # XXX need to check whether we really want to put None here if missing
         namespace['static'] = self.static
         return self.template.pt_render(namespace)
 
-    def __getitem__(self, key):
-        # XXX give nice error message if template is None
-        return self.template.macros[key]
+    def application(self):
+        obj = self.context
+        while obj is not None:
+            if isinstance(obj, Application):
+                return obj
+            obj = obj.__parent__
+        raise ValueErrror("No application found.")
 
+    def site(self):
+        obj = self.context
+        while obj is not None:
+            if isinstance(obj, grok.Site):
+                return obj
+            obj = obj.__parent__
+        raise ValueErrror("No site found.")
+
+    def application_url(self, name=None):
+        obj = self.context
+        while obj is not None:
+            if isinstance(obj, Application):
+                return self.url(obj, name)
+            obj = obj.__parent__
+        raise ValueErrror("No application found.")
+
     def url(self, obj=None, name=None):
         # if the first argument is a string, that's the name. There should
         # be no second argument
@@ -154,21 +147,46 @@
             # create URL to view on context
             obj = self.context
         return url(self.request, obj, name)
-
-    def application_url(self, name=None):
-        obj = self.context
-        while obj is not None:
-            if isinstance(obj, Application):
-                return self.url(obj, name)
-            obj = obj.__parent__
-        raise ValueError("No application found.")
-
+        
     def redirect(self, url):
         return self.request.response.redirect(url)
+        
+    @property
+    def response(self):
+        return self.request.response
 
     def update(self):
         pass
 
+
+class View(BrowserPage, ViewBase):
+    interface.implements(interfaces.IGrokView)
+
+    def __init__(self, context, request):
+        super(View, self).__init__(context, request)
+        self.static = component.queryAdapter(
+            self.request,
+            interface.Interface,
+            name=self.module_info.package_dotted_name
+            )
+
+    def __call__(self):
+        mapply(self.update, (), self.request)
+        if self.request.response.getStatus() in (302, 303):
+            # A redirect was triggered somewhere in update().  Don't
+            # continue rendering the template or doing anything else.
+            return
+
+        template = getattr(self, 'template', None)
+        if template is not None:
+            return self._render_template()
+        return mapply(self.render, (), self.request)
+
+    def __getitem__(self, key):
+        # XXX give nice error message if template is None
+        return self.template.macros[key]
+
+
 class GrokViewAbsoluteURL(AbsoluteURL):
 
     def _getContextName(self, context):

Modified: grok/branches/darrylcousins-branch/src/grok/meta.py
===================================================================
--- grok/branches/darrylcousins-branch/src/grok/meta.py	2007-07-01 06:05:22 UTC (rev 77278)
+++ grok/branches/darrylcousins-branch/src/grok/meta.py	2007-07-01 08:23:47 UTC (rev 77279)
@@ -167,12 +167,15 @@
                 raise GrokError("View %r has no associated template or "
                                 "'render' method." % factory, factory)
 
+        view_layer = util.class_annotation(factory, 'megrok.layer.layer',
+                                    None) or module_info.getAnnotation('megrok.layer.layer',
+                                    None) or IBrowserRequest
         view_name = util.class_annotation(factory, 'grok.name',
                                           factory_name)
         # __view_name__ is needed to support IAbsoluteURL on views
         factory.__view_name__ = view_name
         component.provideAdapter(factory,
-                                 adapts=(view_context, IDefaultBrowserLayer),
+                                 adapts=(view_context, view_layer),
                                  provides=interface.Interface,
                                  name=view_name)
 
@@ -310,7 +313,7 @@
         resource_factory = components.DirectoryResourceFactory(
             resource_path, module_info.dotted_name)
         component.provideAdapter(
-            resource_factory, (IDefaultBrowserLayer,),
+            resource_factory, (IBrowserRequest,),
             interface.Interface, name=module_info.dotted_name)
         return True
 



More information about the Checkins mailing list