[Checkins] SVN: grok/branches/grokcore.xxx/devel/grokcore.view/src/grokcore/view/meta.py move templates and resource related components and grokkers to grokcore.view; missing file

Godefroid Chapelle gotcha at bubblenet.be
Thu Jul 17 13:00:27 EDT 2008


Log message for revision 88460:
  move templates and resource related components and grokkers to grokcore.view; missing file

Changed:
  A   grok/branches/grokcore.xxx/devel/grokcore.view/src/grokcore/view/meta.py

-=-
Added: grok/branches/grokcore.xxx/devel/grokcore.view/src/grokcore/view/meta.py
===================================================================
--- grok/branches/grokcore.xxx/devel/grokcore.view/src/grokcore/view/meta.py	                        (rev 0)
+++ grok/branches/grokcore.xxx/devel/grokcore.view/src/grokcore/view/meta.py	2008-07-17 17:00:27 UTC (rev 88460)
@@ -0,0 +1,187 @@
+import os
+
+import martian
+from martian import util
+from martian.error import GrokError
+
+from zope import component, interface
+from zope.publisher.interfaces.browser import IDefaultBrowserLayer
+
+import grokcore.component
+
+from grokcore.view import components
+from grokcore.view import formlib
+from grokcore.view import templatereg
+from grokcore.view.util import default_view_name
+
+
+class ViewGrokkerBase(martian.ClassGrokker):
+    martian.directive(grokcore.component.context)
+    martian.directive(grokcore.view.layer, default=IDefaultBrowserLayer)
+    martian.directive(grokcore.component.name, get_default=default_view_name)
+    martian.directive(grokcore.view.require, name='permission')
+
+    def grok(self, name, factory, module_info, **kw):
+        # Need to store the module info object on the view class so that it
+        # can look up the 'static' resource directory.
+        factory.module_info = module_info
+        return super(ViewGrokkerBase, self).grok(name, factory, module_info,
+            **kw)
+
+    def execute(self, factory, config, context, layer, name, permission, **kw):
+        if util.check_subclass(factory, components.GrokForm):
+            # setup form_fields from context class if we've encountered a form
+            if getattr(factory, 'form_fields', None) is None:
+                factory.form_fields = formlib.get_auto_fields(context)
+
+            if not getattr(factory.render, 'base_method', False):
+                raise GrokError(
+                    "It is not allowed to specify a custom 'render' "
+                    "method for form %r. Forms either use the default "
+                    "template or a custom-supplied one." % factory,
+                    factory)
+
+        # find templates
+        templates = factory.module_info.getAnnotation('grok.templates', None)
+        if templates is not None:
+            config.action(
+                discriminator=None,
+                callable=self.checkTemplates,
+                args=(templates, factory.module_info, factory))
+
+        # safety belt: make sure that the programmer didn't use
+        # @grok.require on any of the view's methods.
+        methods = util.methods_from_class(factory)
+        for method in methods:
+            if grokcore.view.require.bind().get(method) is not None:
+                raise GrokError('The @grok.require decorator is used for '
+                                'method %r in view %r. It may only be used '
+                                'for XML-RPC methods.'
+                                % (method.__name__, factory), factory)
+
+        # __view_name__ is needed to support IAbsoluteURL on views
+        factory.__view_name__ = name
+        adapts = (context, layer)
+
+        config.action(
+            discriminator=('adapter', adapts, interface.Interface, name),
+            callable=component.provideAdapter,
+            args=(factory, adapts, interface.Interface, name),
+            )
+
+        self.protectName(config, factory, permission)
+
+        return True
+
+    def checkTemplates(self, templates, module_info, factory):
+
+        def has_render(factory):
+            return (getattr(factory, 'render', None) and
+                    not util.check_subclass(factory, components.GrokForm))
+
+        def has_no_render(factory):
+            return not getattr(factory, 'render', None)
+        templates.checkTemplates(module_info, factory, 'view',
+                                 has_render, has_no_render)
+
+    def protectName(self, config, factory, permission):
+        raise NotImplementedError
+
+
+class TemplateGrokker(martian.GlobalGrokker):
+    # this needs to happen before any other grokkers execute that use
+    # the template registry
+    martian.priority(1001)
+
+    def grok(self, name, module, module_info, config, **kw):
+        module.__grok_templates__ = templatereg.TemplateRegistry()
+        return True
+
+
+class ModulePageTemplateGrokker(martian.InstanceGrokker):
+    martian.component(grokcore.view.components.BaseTemplate)
+    # this needs to happen before any other grokkers execute that actually
+    # use the templates
+    martian.priority(1000)
+
+    def grok(self, name, instance, module_info, config, **kw):
+        templates = module_info.getAnnotation('grok.templates', None)
+        if templates is None:
+            return False
+        config.action(
+            discriminator=None,
+            callable=templates.register,
+            args=(name, instance))
+        config.action(
+            discriminator=None,
+            callable=instance._annotateGrokInfo,
+            args=(name, module_info.dotted_name))
+        return True
+
+
+class FilesystemPageTemplateGrokker(martian.GlobalGrokker):
+    # do this early on, but after ModulePageTemplateGrokker, as
+    # findFilesystem depends on module-level templates to be
+    # already grokked for error reporting
+    martian.priority(999)
+
+    def grok(self, name, module, module_info, config, **kw):
+        templates = module_info.getAnnotation('grok.templates', None)
+        if templates is None:
+            return False
+        config.action(
+            discriminator=None,
+            callable=templates.findFilesystem,
+            args=(module_info, ))
+        return True
+
+
+class UnassociatedTemplatesGrokker(martian.GlobalGrokker):
+    martian.priority(-1001)
+
+    def grok(self, name, module, module_info, config, **kw):
+        templates = module_info.getAnnotation('grok.templates', None)
+        if templates is None:
+            return False
+
+        config.action(
+            discriminator=None,
+            callable=templates.checkUnassociated,
+            args=(module_info, ))
+        return True
+
+
+class StaticResourcesGrokker(martian.GlobalGrokker):
+
+    def grok(self, name, module, module_info, config, **kw):
+        # we're only interested in static resources if this module
+        # happens to be a package
+        if not module_info.isPackage():
+            return False
+
+        resource_path = module_info.getResourcePath('static')
+        if os.path.isdir(resource_path):
+            static_module = module_info.getSubModuleInfo('static')
+            if static_module is not None:
+                if static_module.isPackage():
+                    raise GrokError(
+                        "The 'static' resource directory must not "
+                        "be a python package.",
+                        module_info.getModule())
+                else:
+                    raise GrokError(
+                        "A package can not contain both a 'static' "
+                        "resource directory and a module named "
+                        "'static.py'", module_info.getModule())
+
+        resource_factory = components.DirectoryResourceFactory(
+            resource_path, module_info.dotted_name)
+        adapts = (IDefaultBrowserLayer, )
+        provides = interface.Interface
+        name = module_info.dotted_name
+        config.action(
+            discriminator=('adapter', adapts, provides, name),
+            callable=component.provideAdapter,
+            args=(resource_factory, adapts, provides, name),
+            )
+        return True



More information about the Checkins mailing list