[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