diff options
| author | Chris McDonough <chrism@agendaless.com> | 2008-07-14 08:54:26 +0000 |
|---|---|---|
| committer | Chris McDonough <chrism@agendaless.com> | 2008-07-14 08:54:26 +0000 |
| commit | c0c663bd97e4c7fe1d9971fc8070791a148f106f (patch) | |
| tree | 2ea114deb5b2cc32d9b535666707b4957f2dbef8 /repoze/bfg/zcml.py | |
| parent | 85427fa0479aefd59bd55dca397b9a36277edade (diff) | |
| download | pyramid-c0c663bd97e4c7fe1d9971fc8070791a148f106f.tar.gz pyramid-c0c663bd97e4c7fe1d9971fc8070791a148f106f.tar.bz2 pyramid-c0c663bd97e4c7fe1d9971fc8070791a148f106f.zip | |
And, just to maximally confuse Paul, come full circle, and don't require that the template be spelled on the class, while still allowing us to pickle the registry actions.
Diffstat (limited to 'repoze/bfg/zcml.py')
| -rw-r--r-- | repoze/bfg/zcml.py | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/repoze/bfg/zcml.py b/repoze/bfg/zcml.py index a1a2497b5..dc05cca18 100644 --- a/repoze/bfg/zcml.py +++ b/repoze/bfg/zcml.py @@ -1,4 +1,6 @@ +import inspect import os +import new from zope.component.zcml import handler from zope.component.interface import provideInterface @@ -24,11 +26,24 @@ class TemplateViewFactory(object): implements(IViewFactory) - def __init__(self, template): + def __init__(self, template, base=None): + if base is not None: + if not inspect.isclass(base): + raise ValueError('Factory must be a class to be used ' + 'with a template, but %s was supplied' % base) self.template = template + self.base = base def __call__(self, context, request): - factory = TemplateView(context, request) + if self.base and self.base is not TemplateView: + if issubclass(self.base, TemplateView): + bases = (self.base,) + else: + bases = (self.base, TemplateView) + name = 'DynamicTemplateView_For_%s' % self.base.__name__ + factory = new.classobj(name, bases, {}) + else: + factory = TemplateView(context, request) factory.template = self.template return factory @@ -42,14 +57,9 @@ def view(_context, # XXX we do nothing yet with permission - if template and factory: - raise ConfigurationError('A template must not be specified if a ' - 'factory is also specified') - if not (template or factory): raise ConfigurationError( - 'One of template or factory must be specified') - + 'One of template or factory (or both) must be specified') if template: template_abs = os.path.abspath(str(_context.path(template))) @@ -61,7 +71,7 @@ def view(_context, callable = handler, args = ('registerUtility', utility, IView, template_abs), ) - factory = TemplateViewFactory(template_abs) + factory = TemplateViewFactory(template_abs, factory) if for_ is not None: _context.action( |
