[Checkins] SVN: grok/branches/snowsprint-viewlets2/src/grok/ Refactor viewlet support. It's still not sufficiently tested, but it's

Martijn Faassen faassen at infrae.com
Thu Jan 24 08:26:16 EST 2008


Log message for revision 83164:
  Refactor viewlet support. It's still not sufficiently tested, but it's
  a lot cleaner than it was before.
  

Changed:
  U   grok/branches/snowsprint-viewlets2/src/grok/meta.py
  U   grok/branches/snowsprint-viewlets2/src/grok/templatereg.py

-=-
Modified: grok/branches/snowsprint-viewlets2/src/grok/meta.py
===================================================================
--- grok/branches/snowsprint-viewlets2/src/grok/meta.py	2008-01-24 13:06:13 UTC (rev 83163)
+++ grok/branches/snowsprint-viewlets2/src/grok/meta.py	2008-01-24 13:26:16 UTC (rev 83164)
@@ -248,7 +248,7 @@
             config.action(
                 discriminator=None,
                 callable=templates.checkTemplates,
-                args=(module_info, factory, factory.__name__.lower())
+                args=(module_info, factory)
             )
 
         # safety belt: make sure that the programmer didn't use
@@ -878,103 +878,54 @@
     component_class = grok.ViewletManager
 
     def grok(self, name, factory, module_info, config, **kw):
+        factory.module_info = module_info
+        
+        name = get_name(factory)
+        view_context = get_context(module_info, 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
-
-        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 = determine_class_directive('grok.view', factory,
+                                         module_info, default=IBrowserView)
         view_layer = determine_class_directive('grok.layer', factory,
                                                module_info,
                                                default=IDefaultBrowserLayer)
 
-        # TODO - manager is registered for IBrowserView instead of the real view
         config.action(
             discriminator = ('viewletManager', view_context, view_layer,
                              view, name),
             callable = component.provideAdapter,
-            args = (factory, (interface.Interface, view_layer, view),
+            args = (factory, (view_context, view_layer, view),
                     IViewletManager, name)
             )
 
-        permission = get_default_permission(factory)
-        config.action(
-            discriminator=('protectName', factory, '__call__'),
-            callable=make_checker,
-            args=(factory, factory, permission),
-            )
-
         return True
 
 class ViewletGrokker(martian.ClassGrokker):
     component_class = grok.Viewlet
 
     def grok(self, name, factory, module_info, config, **kw):
-        # Try to set up permissions (copied from the View grokker)
-
         factory.module_info = module_info # to make /static available
-        factory_name = factory.__name__.lower()
 
+        view_context = get_context(module_info, factory)
+        
         # find templates
-        template_name = util.class_annotation(factory, 'grok.template',
-                                              factory_name)
         templates = module_info.getAnnotation('grok.templates', None)
-        template = templates.get(template_name)
-
-        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)
-
-        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)
-
-        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',
-                                             None) or IDefaultBrowserLayer
-
+        if templates is not None:
+            config.action(
+                discriminator=None,
+                callable=templates.checkTemplates,
+                args=(module_info, factory))
+    
+        view = determine_class_directive('grok.view', factory,
+                                         module_info, default=IBrowserView)
+        view_layer = determine_class_directive('grok.layer', factory,
+                                               module_info,
+                                               default=IDefaultBrowserLayer)
+        viewletmanager = determine_class_directive('grok.viewletmanager',
+                                                   factory, module_info,
+                                                   None)
+        if viewletmanager is None:
+            raise GrokError("XXX This is a temporary grok error")
+    
         config.action(
             discriminator = ('viewlet', view_context, view_layer,
                              view, viewletmanager, name),
@@ -989,5 +940,5 @@
             callable=make_checker,
             args=(factory, factory, permission, ['update', 'render']),
             )
-
+        
         return True

Modified: grok/branches/snowsprint-viewlets2/src/grok/templatereg.py
===================================================================
--- grok/branches/snowsprint-viewlets2/src/grok/templatereg.py	2008-01-24 13:06:13 UTC (rev 83163)
+++ grok/branches/snowsprint-viewlets2/src/grok/templatereg.py	2008-01-24 13:26:16 UTC (rev 83164)
@@ -81,7 +81,8 @@
                 module_info.dotted_name, ', '.join(unassociated)))
             warnings.warn(msg, UserWarning, 2)
 
-    def checkTemplates(self, module_info, factory, factory_name):
+    def checkTemplates(self, module_info, factory):
+        factory_name = factory.__name__.lower()
         template_name = util.class_annotation(factory, 'grok.template',
                                               factory_name)
 



More information about the Checkins mailing list