summaryrefslogtreecommitdiff
path: root/repoze/bfg/zcml.py
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2008-07-14 07:31:31 +0000
committerChris McDonough <chrism@agendaless.com>2008-07-14 07:31:31 +0000
commit85427fa0479aefd59bd55dca397b9a36277edade (patch)
treecafad1ccb7d3f4c9a0b953adba78cd8caae70e93 /repoze/bfg/zcml.py
parent9fcb68e1563e22eed1fd7cbbd10993cff30242f8 (diff)
downloadpyramid-85427fa0479aefd59bd55dca397b9a36277edade.tar.gz
pyramid-85427fa0479aefd59bd55dca397b9a36277edade.tar.bz2
pyramid-85427fa0479aefd59bd55dca397b9a36277edade.zip
Less magical templated view model: make custom template views responsible for
knowing their template's name.
Diffstat (limited to 'repoze/bfg/zcml.py')
-rw-r--r--repoze/bfg/zcml.py89
1 files changed, 47 insertions, 42 deletions
diff --git a/repoze/bfg/zcml.py b/repoze/bfg/zcml.py
index bc136055a..a1a2497b5 100644
--- a/repoze/bfg/zcml.py
+++ b/repoze/bfg/zcml.py
@@ -1,62 +1,68 @@
import os
-from zope.schema import TextLine
-from zope.configuration.fields import Path
-from zope.interface import Interface
from zope.component.zcml import handler
from zope.component.interface import provideInterface
from zope.configuration.exceptions import ConfigurationError
from zope.configuration.fields import GlobalObject
+from zope.configuration.fields import Path
+
+from zope.schema import TextLine
+from zope.interface import Interface
+from zope.interface import implements
+
from zope.security.zcml import Permission
from repoze.bfg.interfaces import IRequest
from repoze.bfg.interfaces import IViewFactory
+from repoze.bfg.interfaces import IView
+
+from repoze.bfg.template import Z3CPTTemplateFactory
+from repoze.bfg.view import TemplateView
-from repoze.bfg.template import ViewPageTemplateFile
-from repoze.bfg.template import PageTemplateFile
+class TemplateViewFactory(object):
+ """ Pickleable template view factory """
-class ViewBase:
- def __init__(self, context, request):
- self.context = context
- self.request = request
+ implements(IViewFactory)
- def __call__(self, *arg, **kw):
- return self.index(*arg, **kw)
+ def __init__(self, template):
+ self.template = template
-def page(_context,
+ def __call__(self, context, request):
+ factory = TemplateView(context, request)
+ factory.template = self.template
+ return factory
+
+def view(_context,
permission,
- for_,
+ for_=None,
+ factory=None,
name="",
template=None,
- class_=None,
):
# XXX we do nothing yet with permission
- if not (class_ or template):
- raise ConfigurationError("Must specify a class or a template")
+ if template and factory:
+ raise ConfigurationError('A template must not be specified if a '
+ 'factory is also specified')
- if template:
- template = os.path.abspath(str(_context.path(template)))
- if not os.path.isfile(template):
- raise ConfigurationError("No such file", template)
-
- template_inst = PageTemplateFile(template)
-
- def view_factory(context, request):
- if template:
- if class_ is None:
- base = ViewBase
- else:
- base = class_
- class ViewClass(base):
- __name__ = name
- index = ViewPageTemplateFile(template_inst)
- return ViewClass(context, request)
-
- else:
- return class_(context, request)
+ if not (template or factory):
+ raise ConfigurationError(
+ 'One of template or factory must be specified')
+
+ if template:
+ template_abs = os.path.abspath(str(_context.path(template)))
+ if not os.path.exists(template_abs):
+ raise ConfigurationError('No template file named %s' % template_abs)
+ utility = Z3CPTTemplateFactory(template_abs)
+ _context.action(
+ discriminator = ('utility', IView, template_abs),
+ callable = handler,
+ args = ('registerUtility', utility, IView, template_abs),
+ )
+ factory = TemplateViewFactory(template_abs)
+
if for_ is not None:
_context.action(
discriminator = None,
@@ -68,11 +74,11 @@ def page(_context,
discriminator = ('view', for_, name, IRequest, IViewFactory),
callable = handler,
args = ('registerAdapter',
- view_factory, (for_, IRequest), IViewFactory, name,
+ factory, (for_, IRequest), IViewFactory, name,
_context.info),
)
-class IPageDirective(Interface):
+class IViewDirective(Interface):
"""
The page directive is used to create views that provide a single
url or page.
@@ -92,7 +98,7 @@ class IPageDirective(Interface):
required=True
)
- class_ = GlobalObject(
+ factory = GlobalObject(
title=u"Class",
description=u"A class that provides a __call__ used by the view.",
required=False,
@@ -108,9 +114,8 @@ class IPageDirective(Interface):
template = Path(
title=u"The name of a template that implements the page.",
- description=u"""
- Refers to a file containing a page template (should end in
- extension '.pt' or '.html').""",
+ description=u"""Refers to a file containing a z3c.pt page template""",
required=False
)
+