[Checkins] SVN: megrok.quarry/trunk/ fixed missing checkin, fixed buildout order issue, added demo

Kevin Smith kevin at mcweekly.com
Wed May 2 18:38:10 EDT 2007


Log message for revision 75031:
  fixed missing checkin, fixed buildout order issue, added demo

Changed:
  U   megrok.quarry/trunk/buildout.cfg
  U   megrok.quarry/trunk/setup.py
  U   megrok.quarry/trunk/src/megrok/quarry/__init__.py
  U   megrok.quarry/trunk/src/megrok/quarry/components.py
  U   megrok.quarry/trunk/src/megrok/quarry/configure.zcml
  A   megrok.quarry/trunk/src/megrok/quarry/demo/
  A   megrok.quarry/trunk/src/megrok/quarry/demo/__init__.py
  A   megrok.quarry/trunk/src/megrok/quarry/demo/app.py
  A   megrok.quarry/trunk/src/megrok/quarry/demo/configure.zcml
  A   megrok.quarry/trunk/src/megrok/quarry/demo/demoshare.py
  A   megrok.quarry/trunk/src/megrok/quarry/demo/master.pt
  A   megrok.quarry/trunk/src/megrok/quarry/demo/menu.pt
  U   megrok.quarry/trunk/src/megrok/quarry/directive.py
  U   megrok.quarry/trunk/src/megrok/quarry/meta.py

-=-
Modified: megrok.quarry/trunk/buildout.cfg
===================================================================
--- megrok.quarry/trunk/buildout.cfg	2007-05-02 22:13:21 UTC (rev 75030)
+++ megrok.quarry/trunk/buildout.cfg	2007-05-02 22:38:10 UTC (rev 75031)
@@ -1,9 +1,8 @@
 [test]
 working-directory = parts/instance
-eggs = megrok.quarry
-	grok
+eggs = grok
 recipe = zc.recipe.testrunner
-extra-paths = /root/zope3/src
+extra-paths = /parts/zope3/src
 defaults = ['--tests-pattern', '^f?tests$',
 	'-v'
 	]
@@ -12,12 +11,12 @@
 recipe = zc.recipe.filestorage
 
 [zope3]
-location = /root/zope3
+recipe = zc.recipe.zope3checkout
+url = svn://svn.zope.org/repos/main/Zope3/branches/3.3
 
 [buildout]
-parts = data instance test
+parts = zope3 data instance test
 develop = .
-          ../grok
 
 [instance]
 database = data
@@ -45,7 +44,8 @@
 	zope.app.intid
 	zope.app.keyreference
 	zope.app.twisted
-	megrok.quarry-meta
+	zope.contentprovider
 	grok
 	grok-meta
-
+	megrok.quarry-meta
+	megrok.quarry

Modified: megrok.quarry/trunk/setup.py
===================================================================
--- megrok.quarry/trunk/setup.py	2007-05-02 22:13:21 UTC (rev 75030)
+++ megrok.quarry/trunk/setup.py	2007-05-02 22:38:10 UTC (rev 75031)
@@ -15,6 +15,7 @@
       url="",
       license="ZPL",
       package_dir={'': 'src'},
+      namespace_packages=['megrok'],      
       packages=find_packages('src'),
       include_package_data=True,
       zip_safe=False,

Modified: megrok.quarry/trunk/src/megrok/quarry/__init__.py
===================================================================
--- megrok.quarry/trunk/src/megrok/quarry/__init__.py	2007-05-02 22:13:21 UTC (rev 75030)
+++ megrok.quarry/trunk/src/megrok/quarry/__init__.py	2007-05-02 22:38:10 UTC (rev 75031)
@@ -1,5 +1,5 @@
 # this directory is a package
 
 
-from directive import layer, template
-from components import Layer, Skin, View
+from directive import layer, template, viewletmanager
+from components import Layer, Skin, View, Viewlet, ViewletManager

Modified: megrok.quarry/trunk/src/megrok/quarry/components.py
===================================================================
--- megrok.quarry/trunk/src/megrok/quarry/components.py	2007-05-02 22:13:21 UTC (rev 75030)
+++ megrok.quarry/trunk/src/megrok/quarry/components.py	2007-05-02 22:38:10 UTC (rev 75031)
@@ -1,10 +1,13 @@
 from zope import interface, component
 from zope.publisher.browser import BrowserPage
 from zope.publisher.interfaces.browser import IDefaultBrowserLayer
+from zope.viewlet.manager import ViewletManagerBase
+from zope.viewlet.viewlet import ViewletBase
+from zope.publisher.interfaces.browser import IBrowserView
 from zope.publisher.publish import mapply
 from grok import util, interfaces, formlib
+import grok
 
-
 class Layer(IDefaultBrowserLayer):
     pass
 
@@ -23,6 +26,7 @@
             interface.Interface,
             name=self.module_info.package_dotted_name
             )
+
         
     @property
     def response(self):
@@ -52,6 +56,17 @@
     def __getitem__(self, key):
         # XXX give nice error message if template is None
         return self.template.macros[key]
+
+    def application_obj(self):
+        obj = self.context
+        while obj:
+            if isinstance(obj, grok.Application):
+                return obj
+            obj = obj.__parent__
+        raise ValueErrror("No application found.")
+
+    def application_url(self):
+        return self.url(self.application_obj())
     
     def url(self, obj=None, name=None):
         # if the first argument is a string, that's the name. There should
@@ -79,136 +94,136 @@
         pass
     
 
-# class ViewletManager(ViewletManagerBase):
-#     """  A grok.View-like ViewletManager
-#     """
+class ViewletManager(ViewletManagerBase):
+    """  A grok.View-like ViewletManager
+    """
     
-#     template = None
+    template = None
 
-#     def __init__(self, context, request, view):
-#         super(ViewletManager, self).__init__(context, request, view)
-#         self.static = component.queryAdapter(
-#             self.request,
-#             interface.Interface,
-#             name=self.module_info.package_dotted_name
-#             )
+    def __init__(self, context, request, view):
+        super(ViewletManager, self).__init__(context, request, view)
+        self.static = component.queryAdapter(
+            self.request,
+            interface.Interface,
+            name=self.module_info.package_dotted_name
+            )
         
-#     def render(self):
-#         """See zope.contentprovider.interfaces.IContentProvider"""
-#         # Now render the view
-#         if self.template:
-#             #return self.template(viewlets=self.viewlets)
-#             return self._render_template()
-#         else:
-#             return u'\n'.join([viewlet.render() for viewlet in self.viewlets])
+    def render(self):
+        """See zope.contentprovider.interfaces.IContentProvider"""
+        # Now render the view
+        if self.template:
+            #return self.template(viewlets=self.viewlets)
+            return self._render_template()
+        else:
+            return u'\n'.join([viewlet.render() for viewlet in self.viewlets])
                                                 
-#     @property
-#     def response(self):
-#         return self.request.response
+    @property
+    def response(self):
+        return self.request.response
 
-#     def _render_template(self):
-#         namespace = self.template.pt_getContext()
-#         namespace['request'] = self.request
-#         namespace['view'] = self
-#         namespace['viewlets'] = self.viewlets
-#         namespace['static'] = self.static
-#         namespace['context'] = self.context
-#         # XXX need to check whether we really want to put None here if missing
-#         return self.template.pt_render(namespace)
+    def _render_template(self):
+        namespace = self.template.pt_getContext()
+        namespace['request'] = self.request
+        namespace['view'] = self
+        namespace['viewlets'] = self.viewlets
+        namespace['static'] = self.static
+        namespace['context'] = self.context
+        # XXX need to check whether we really want to put None here if missing
+        return self.template.pt_render(namespace)
 
-#     def sort(self, viewlets):
-#         # sort by viewlet class name as default
-#         return sorted(viewlets, lambda x,y: cmp(x[0], y[0]))
+    def sort(self, viewlets):
+        # sort by viewlet class name as default
+        return sorted(viewlets, lambda x,y: cmp(x[0], y[0]))
 
-#     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
+    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 util.url(self.request, obj, name)
+        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 util.url(self.request, obj, name)
 
-#     def redirect(self, url):
-#         return self.request.response.redirect(url)
+    def redirect(self, url):
+        return self.request.response.redirect(url)
 
 
-# class Viewlet(ViewletBase):
-#     """ A grok.View-like viewlet
-#     """
+class Viewlet(ViewletBase):
+    """ A grok.View-like viewlet
+    """
 
 
-#     def __init__(self, context, request, view, manager):
-#         super(Viewlet, self).__init__(context, request, view, manager)
-#         self.static = component.queryAdapter(
-#             self.request,
-#             interface.Interface,
-#             name=self.module_info.package_dotted_name
-#             )
+    def __init__(self, context, request, view, manager):
+        super(Viewlet, self).__init__(context, request, view, manager)
+        self.static = component.queryAdapter(
+            self.request,
+            interface.Interface,
+            name=self.module_info.package_dotted_name
+            )
 
 
-#     @property
-#     def response(self):
-#         return self.request.response
+    @property
+    def response(self):
+        return self.request.response
 
 
-#     def render(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
+    def render(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()
+        template = getattr(self, 'template', None)
+        if template is not None:
+            return self._render_template()
 
-#     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 _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 __getitem__(self, key):
+        # XXX give nice error message if template is None
+        return self.template.macros[key]
 
-#     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
+    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 util.url(self.request, obj, name)
+        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 util.url(self.request, obj, name)
 
-#     def redirect(self, url):
-#         return self.request.response.redirect(url)
+    def redirect(self, url):
+        return self.request.response.redirect(url)
 
-#     def update(self):
-#         pass
+    def update(self):
+        pass
 
 

Modified: megrok.quarry/trunk/src/megrok/quarry/configure.zcml
===================================================================
--- megrok.quarry/trunk/src/megrok/quarry/configure.zcml	2007-05-02 22:13:21 UTC (rev 75030)
+++ megrok.quarry/trunk/src/megrok/quarry/configure.zcml	2007-05-02 22:38:10 UTC (rev 75031)
@@ -1 +1,5 @@
-<configure></configure>
\ No newline at end of file
+<configure>
+
+	<include package=".demo" />
+
+</configure>
\ No newline at end of file

Added: megrok.quarry/trunk/src/megrok/quarry/demo/__init__.py
===================================================================

Added: megrok.quarry/trunk/src/megrok/quarry/demo/app.py
===================================================================
--- megrok.quarry/trunk/src/megrok/quarry/demo/app.py	2007-05-02 22:13:21 UTC (rev 75030)
+++ megrok.quarry/trunk/src/megrok/quarry/demo/app.py	2007-05-02 22:38:10 UTC (rev 75031)
@@ -0,0 +1,94 @@
+import os
+import grok
+from megrok import quarry
+
+class QuarryDemo(grok.Application, grok.Container):
+    pass
+
+
+# access any template in the python path
+
+class Index(quarry.View):
+    quarry.template('megrok.quarry.demo.demoshare.template')
+
+
+
+
+
+
+# skins and layers
+
+class TestLayer(quarry.Layer):
+    pass
+
+
+class Test(quarry.Skin):
+    grok.name('test') # default to this
+    quarry.layer(TestLayer)
+    # accessible as ++skin++test
+
+
+class TestView(quarry.View):
+    
+    def render(self):
+        return """<html><body><h1>GROK NO HIDE</h1>
+        Now try http:://yourhost/++skin++test/yourdemo/@@hiddenview
+        </body></html>"""
+
+
+
+
+
+
+# viewlets
+
+class MenuPage(quarry.View):
+    quarry.template('megrok.quarry.demo.app.menu')
+    grok.name('menu')
+
+    title = "Viewlet Test Page"
+
+
+class Menu(quarry.View):
+    """ View class needed when defining inline page templates
+
+    Due to a possible bug or implementation issue,
+    the tal namespace 'provider' only seems to work with
+    grok.PageTemplateFile and grok.PageTemplate or strings.
+    """
+
+menu = grok.PageTemplateFile(os.path.join('menu.pt'))
+
+
+
+class MenuManager(quarry.ViewletManager):
+    grok.context(MenuPage)
+    grok.name('body') #talnamespace 'provider:body'
+
+
+class Menu10(quarry.Viewlet):
+    quarry.viewletmanager(MenuManager)
+
+    def render(self):
+        return "<li>Fish</li>"
+
+
+class Menu20(quarry.Viewlet):
+    quarry.viewletmanager(MenuManager)
+
+    def render(self):
+        return "<li>Stone Soup</li>"
+    
+
+class Menu30(quarry.Viewlet):
+    """
+    <li tal:repeat="item view/items">
+      <span tal:replace="item" />
+    </li>
+    """
+    quarry.viewletmanager(MenuManager)
+    quarry.template('megrok.quarry.demo.app.Menu30.__doc__')
+    
+    def items(self): #accessible as view/items
+        return ['Buffalo Wings', 'Celery', 'Blue Cheese' ,'Duffs T-shirt']
+

Added: megrok.quarry/trunk/src/megrok/quarry/demo/configure.zcml
===================================================================
--- megrok.quarry/trunk/src/megrok/quarry/demo/configure.zcml	2007-05-02 22:13:21 UTC (rev 75030)
+++ megrok.quarry/trunk/src/megrok/quarry/demo/configure.zcml	2007-05-02 22:38:10 UTC (rev 75031)
@@ -0,0 +1 @@
+<grok package="." xmlns="http://namespaces.zope.org/grok" />
\ No newline at end of file

Added: megrok.quarry/trunk/src/megrok/quarry/demo/demoshare.py
===================================================================
--- megrok.quarry/trunk/src/megrok/quarry/demo/demoshare.py	2007-05-02 22:13:21 UTC (rev 75030)
+++ megrok.quarry/trunk/src/megrok/quarry/demo/demoshare.py	2007-05-02 22:38:10 UTC (rev 75031)
@@ -0,0 +1,26 @@
+import grok
+from zope import interface
+import os
+
+
+class Template(grok.View):
+    grok.context(interface.Interface)
+
+template = grok.PageTemplate("""
+<html><body>
+<h2>GROK SMASH ZCML!</h2>
+<ul>
+<li><a href="./@@testview">Test Skins & Layers</a></li>
+<li><a href="./@@menu">Viewlet Test Page</a></li>
+</ul>
+</body></html>
+""")
+
+
+
+class Master(grok.View):
+    grok.context(interface.Interface)
+
+
+master = grok.PageTemplateFile(os.path.join('master.pt'))
+

Added: megrok.quarry/trunk/src/megrok/quarry/demo/master.pt
===================================================================
--- megrok.quarry/trunk/src/megrok/quarry/demo/master.pt	2007-05-02 22:13:21 UTC (rev 75030)
+++ megrok.quarry/trunk/src/megrok/quarry/demo/master.pt	2007-05-02 22:38:10 UTC (rev 75031)
@@ -0,0 +1,10 @@
+<html metal:define-macro="page">
+  <head>
+    <title>Master Template</title>
+  </head>
+  
+  <body metal:define-slot="body">
+
+  </body>
+
+</html>
\ No newline at end of file

Added: megrok.quarry/trunk/src/megrok/quarry/demo/menu.pt
===================================================================
--- megrok.quarry/trunk/src/megrok/quarry/demo/menu.pt	2007-05-02 22:13:21 UTC (rev 75030)
+++ megrok.quarry/trunk/src/megrok/quarry/demo/menu.pt	2007-05-02 22:38:10 UTC (rev 75031)
@@ -0,0 +1,6 @@
+<html metal:use-macro="context/@@master/page">
+  <body metal:fill-slot="body">
+    <h2 tal:content="view/title|default">Menu</h2>
+    <span tal:replace="structure provider:body" />
+  </body>
+</html>
\ No newline at end of file

Modified: megrok.quarry/trunk/src/megrok/quarry/directive.py
===================================================================
--- megrok.quarry/trunk/src/megrok/quarry/directive.py	2007-05-02 22:13:21 UTC (rev 75030)
+++ megrok.quarry/trunk/src/megrok/quarry/directive.py	2007-05-02 22:38:10 UTC (rev 75031)
@@ -5,3 +5,7 @@
                            ClassOrModuleDirectiveContext())
 
 template = SingleTextDirective('quarry.template', ClassDirectiveContext())
+
+
+viewletmanager = InterfaceOrClassDirective('quarry.viewletmanager',
+                                           ClassDirectiveContext())

Modified: megrok.quarry/trunk/src/megrok/quarry/meta.py
===================================================================
--- megrok.quarry/trunk/src/megrok/quarry/meta.py	2007-05-02 22:13:21 UTC (rev 75030)
+++ megrok.quarry/trunk/src/megrok/quarry/meta.py	2007-05-02 22:38:10 UTC (rev 75031)
@@ -3,12 +3,14 @@
 from grok import util, components, formlib
 from grok.error import GrokError
 
-from zope.publisher.interfaces.browser import IBrowserSkinType
+from zope.publisher.interfaces.browser import IBrowserSkinType, IDefaultBrowserLayer
+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.dottedname.resolve import resolve
 from zope import interface, component
 import zope.component.interface
@@ -22,7 +24,7 @@
 
     def register(self, context, name, factory, module_info, templates):
         layer = util.class_annotation(factory, 'quarry.layer',
-                                    None) or module_info.getAnnotation('grok.layer',
+                                    None) or module_info.getAnnotation('quarry.layer',
                                     None) or grok.IDefaultBrowserLayer
         name = util.class_annotation(factory, 'grok.name', factory.__name__.lower())
         zope.component.interface.provideInterface(name, layer, IBrowserSkinType)
@@ -49,7 +51,7 @@
                     "template or a custom-supplied one." % factory,
                     factory)
 
-        # find templates
+        # can't use grok.template
         if util.class_annotation(factory, 'grok.template',
                                  None):
             raise GrokError(
@@ -65,15 +67,15 @@
 
             
         if factory_name != template_name:
-            # grok.template is being used
+            # quarry.template is being used
             if templates.get(factory_name):
                 raise GrokError("Multiple possible templates for view %r. It "
-                                "uses grok.template('%s'), but there is also "
+                                "uses quarry.template('%s'), but there is also "
                                 "a template called '%s'."
                                 % (factory, template_name, factory_name),
                                 factory)
             # no conflicts, lets try and load the template
-            # using grok.Template('with.dotted.name')
+            # using quarry.template('with.dotted.name')
             try:
                 factory.template = resolve(template_name)
                 # accept string and unicode objects, useful if .__doc__ is referenced
@@ -111,8 +113,8 @@
                 raise GrokError("View %r has no associated template or "
                                 "'render' method." % factory, factory)
 
-        view_layer = util.class_annotation(factory, 'grok.layer',
-                                           None) or module_info.getAnnotation('grok.layer',
+        view_layer = util.class_annotation(factory, 'quarry.layer',
+                                           None) or module_info.getAnnotation('quarry.layer',
                                                None) or IDefaultBrowserLayer
 
         view_name = util.class_annotation(factory, 'grok.name',
@@ -139,108 +141,226 @@
                                 % (method.__name__, factory), factory)
 
 
+class ViewletManagerGrokker(grok.ClassGrokker):
+    component_class = quarry.ViewletManager
 
+    def register(self, context, name, factory, module_info, templates):
 
-# class ViewletManagerGrokker(grok.ClassGrokker):
-#     component_class = (grok.ViewletManager, grok.OrderedViewletManager)
+        factory.module_info = module_info # to make /static available
+        factory_name = factory.__name__.lower()
+        
+        permissions = grok.util.class_annotation(factory, 'grok.require', [])
+        if not permissions:
+            checker = NamesChecker(['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(['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(['render'], permissions[0])
+        
+        defineChecker(factory, checker)
 
-#     def register(self, context, name, factory, module_info, templates):
+        # can't use grok.template
+        if util.class_annotation(factory, 'grok.template',
+                                 None):
+            raise GrokError(
+                "%s may not use grok.template, use quarry.template instead."
+                % factory.__name__, factory)
 
-#         factory.module_info = module_info # to make /static available
 
-#         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
+        # find templates
+        template_name = util.class_annotation(factory, 'quarry.template',
+                                              factory_name)
+        template = templates.get(template_name)
+
+        if factory_name != template_name:
+            # quarry.template is being used
+            if templates.get(factory_name):
+                raise GrokError("Multiple possible templates for view %r. It "
+                                "uses quarry.template('%s'), but there is also "
+                                "a template called '%s'."
+                                % (factory, template_name, factory_name),
+                                factory)
+
+            # no conflicts, lets try and load the template
+            # using quarry.template('with.dotted.name')
+            try:
+                factory.template = resolve(template_name)
+                # accept string and unicode objects, useful if .__doc__ is referenced
+                if isinstance(factory.template, (str, unicode)):
+                    factory.template = grok.PageTemplate(factory.template)
+            except ImportError:
+                # verify this is a dotted name
+                if template_name.find('.') >=0:
+                    raise GrokError(
+                        "'%s' is not importable. Check the path and"
+                        "be sure it's a grok.PageTemplate,"
+                        "grok.PageTemplateFile, string, or unicode object"
+                        % template_name, factory)
+
+
+        # support in-class imports template = grok.PageTemplateFile
+        factory_template = getattr(factory, 'template', None)
         
-#         view_context = util.determine_class_context(factory, context)
-#         component.provideAdapter(factory,
-#                                  adapts=(None, # TODO: Make configurable
-#                                          view_layer, # TODO: Make configurable
-#                                          view_context),
-#                                  provides=IViewletManager,
-#                                  name=name)
+        if template:
+            if (getattr(factory, 'render', None) and not
+                util.check_subclass(factory, components.GrokForm) and not
+                util.check_subclass(factory, components.Viewlet)):
+                # we do not accept render and template both for a view
+                # (unless it's a form, they happen to have render.)
+                # Forms currently not implemented in viewlets.
+                raise GrokError(
+                    "Multiple possible ways to render view %r. "
+                    "It has both a 'render' method as well as "
+                    "an associated template." % factory, factory)
 
+            templates.markAssociated(template_name)
+            factory.template = template
+        elif factory_template and isinstance(factory_template, (components.PageTemplate, components.PageTemplateFile)):
+            pass
+        else:
+            if not getattr(factory, 'render', None):
+                # we do not accept a view without any way to render it
+                raise GrokError("View %r has no associated template or "
+                                "'render' method." % factory, factory)
+
+
+
+
+
+        
+        name = grok.util.class_annotation(factory, 'grok.name', factory.__name__.lower())
+        layer = util.class_annotation(factory, 'quarry.layer',
+                                                    None) or module_info.getAnnotation('quarry.layer',
+                                                     None) or IDefaultBrowserLayer
+        
+        view_context = util.determine_class_context(factory, context)
+        component.provideAdapter(factory,
+                                 adapts=(None, # TODO: Make configurable
+                                         layer, # TODO: Make configurable
+                                         view_context),
+                                 provides=IViewletManager,
+                                 name=name)
+
             
-# class ViewletGrokker(grok.ClassGrokker):
-#     component_class = grok.Viewlet
+class ViewletGrokker(grok.ClassGrokker):
+    component_class = quarry.Viewlet
                 
-#     def register(self, context, name, factory, module_info, templates):
-#         # Try to set up permissions (copied from the View grokker)
+    def register(self, context, name, factory, module_info, templates):
+        # Try to set up permissions (copied from the View grokker)
 
-#         factory.module_info = module_info # to make /static available
-#         factory_name = factory.__name__.lower()
+        factory.module_info = module_info # to make /static available
+        factory_name = factory.__name__.lower()
         
-#         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])
+        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)
+        defineChecker(factory, checker)
 
+        # can't use grok.template
+        if util.class_annotation(factory, 'grok.template',
+                                 None):
+            raise GrokError(
+                "%s may not use grok.template, use quarry.template instead."
+                % factory.__name__, factory)
 
-#         # find templates
-#         template_name = util.class_annotation(factory, 'grok.template',
-#                                               factory_name)
-#         template = templates.get(template_name)
+        # can't use grok.viewletmanager
+        if util.class_annotation(factory, 'grok.viewletmanager',
+                                 None):
+            raise GrokError(
+                "!!!%s may not use grok.viewletmanager, use quarry.viewletmanager instead."
+                % factory.__name__, factory)
 
-#         if factory_name != template_name:
-#             # grok.template is being used
-#             if templates.get(factory_name):
-#                 raise GrokError("Multiple possible templates for view %r. It "
-#                                 "uses grok.template('%s'), but there is also "
-#                                 "a template called '%s'."
-#                                 % (factory, template_name, factory_name),
-#                                 factory)
 
-#         factory_template = getattr(factory,'template', None)
+        # find templates
+        template_name = util.class_annotation(factory, 'quarry.template',
+                                              factory_name)
+        template = templates.get(template_name)
+
+        if factory_name != template_name:
+            # quarry.template is being used
+            if templates.get(factory_name):
+                raise GrokError("Multiple possible templates for view %r. It "
+                                "uses quarry.template('%s'), but there is also "
+                                "a template called '%s'."
+                                % (factory, template_name, factory_name),
+                                factory)
+            # no conflicts, lets try and load the template
+            # using quarry.template('with.dotted.name')
+            try:
+                factory.template = resolve(template_name)
+                # accept string and unicode objects, useful if .__doc__ is referenced
+                if isinstance(factory.template, (str, unicode)):
+                    factory.template = grok.PageTemplate(factory.template)
+            except ImportError:
+                # verify this is a dotted name
+                if template_name.find('.') >=0:
+                    raise GrokError(
+                        "'%s' is not importable. Check the path and"
+                        "be sure it's a grok.PageTemplate,"
+                        "grok.PageTemplateFile, string, or unicode object"
+                        % template_name, factory)
+
+
+        factory_template = getattr(factory,'template', None)
         
-#         if template:
-#             if (getattr(factory, 'render', None) and not
-#                 util.check_subclass(factory, components.GrokForm) and not
-#                 util.check_subclass(factory, components.Viewlet)):
-#                 # we do not accept render and template both for a view
-#                 # (unless it's a form, they happen to have render.)
-#                 # Forms currently not implemented in viewlets.
-#                 raise GrokError(
-#                     "Multiple possible ways to render view %r. "
-#                     "It has both a 'render' method as well as "
-#                     "an associated template." % factory, factory)
+        if template:
+            if (getattr(factory, 'render', None) and not
+                util.check_subclass(factory, components.GrokForm) and not
+                util.check_subclass(factory, components.Viewlet)):
+                # we do not accept render and template both for a view
+                # (unless it's a form, they happen to have render.)
+                # Forms currently not implemented in viewlets.
+                raise GrokError(
+                    "Multiple possible ways to render view %r. "
+                    "It has both a 'render' method as well as "
+                    "an associated template." % factory, factory)
 
-#             templates.markAssociated(template_name)
-#             factory.template = template
-#         elif factory_template and isinstance(factory_template, (components.PageTemplate, components.PageTemplateFile)):
-#             pass
-#         else:
-#             if not getattr(factory, 'render', None):
-#                 # we do not accept a view without any way to render it
-#                 raise GrokError("View %r has no associated template or "
-#                                 "'render' method." % factory, factory)
+            templates.markAssociated(template_name)
+            factory.template = template
+        elif factory_template and isinstance(factory_template, (components.PageTemplate, components.PageTemplateFile)):
+            pass
+        else:
+            if not getattr(factory, 'render', None):
+                # we do not accept a view without any way to render it
+                raise GrokError("View %r has no associated template or "
+                                "'render' method." % factory, factory)
 
         
-#         # 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
+        # New directive
+        viewletmanager = grok.util.class_annotation(factory, 'quarry.viewletmanager', [])
+
+        layer = util.class_annotation(factory, 'quarry.layer',
+                                            None) or module_info.getAnnotation('quarry.layer',
+                                             None) or IDefaultBrowserLayer
        
-#         component.provideAdapter(factory,
-#                                  adapts=(None, # TODO: Make configurable
-#                                          layer,
-#                                          IBrowserView,
-#                                          viewletmanager),
-#                                  provides=IViewlet,
-#                                  name=name)
+        component.provideAdapter(factory,
+                                 adapts=(None, # TODO: Make configurable
+                                         layer,
+                                         IBrowserView,
+                                         viewletmanager),
+                                 provides=IViewlet,
+                                 name=name)
 



More information about the Checkins mailing list