diff options
Diffstat (limited to 'repoze')
| -rw-r--r-- | repoze/bfg/tests/test_zcml.py | 18 | ||||
| -rw-r--r-- | repoze/bfg/zcml.py | 27 |
2 files changed, 41 insertions, 4 deletions
diff --git a/repoze/bfg/tests/test_zcml.py b/repoze/bfg/tests/test_zcml.py index e54bd108f..398159801 100644 --- a/repoze/bfg/tests/test_zcml.py +++ b/repoze/bfg/tests/test_zcml.py @@ -1321,6 +1321,24 @@ class TestDeriveView(unittest.TestCase): self.assertEqual(next, True) self.assertEqual(predicates, [True, True]) + def test_view_with_wrapper_viewname(self): + from webob import Response + from zope.component import getSiteManager + from repoze.bfg.interfaces import IView + def inner_view(context, request): + return Response('OK') + def outer_view(context, request): + return Response('outer ' + request.wrapped_body) + sm = getSiteManager() + sm.registerAdapter(outer_view, (None, None), IView, 'owrap') + result = self._callFUT(inner_view, wrapper_viewname='owrap') + self.failIf(result is inner_view) + self.assertEqual(inner_view.__module__, result.__module__) + self.assertEqual(inner_view.__doc__, result.__doc__) + request = DummyRequest() + response = result(None, request) + self.assertEqual(response.body, 'outer OK') + class TestConnectRouteFunction(unittest.TestCase): def setUp(self): cleanUp() diff --git a/repoze/bfg/zcml.py b/repoze/bfg/zcml.py index 3a2a24819..657105e34 100644 --- a/repoze/bfg/zcml.py +++ b/repoze/bfg/zcml.py @@ -58,7 +58,7 @@ from repoze.bfg.view import NotFound from repoze.bfg.view import MultiView from repoze.bfg.view import map_view from repoze.bfg.view import decorate_view - +from repoze.bfg.view import render_view_to_response import martian @@ -84,6 +84,7 @@ def view( containment=None, attr=None, template=None, + wrapper=None, cacheable=True, # not used, here for b/w compat < 0.8 ): @@ -174,7 +175,8 @@ def view( template = '%s:%s' % (package_name(_context.resolve('.')), template) def register(): - derived_view = derive_view(view, permission, predicates, attr, template) + derived_view = derive_view(view, permission, predicates, attr, template, + wrapper) r_for_ = for_ r_request_type = request_type if r_for_ is None: @@ -244,13 +246,25 @@ def forbidden(_context, view): view_utility(_context, view, IForbiddenView) def derive_view(original_view, permission=None, predicates=(), attr=None, - template=None): + template=None, wrapper_viewname=None): mapped_view = map_view(original_view, attr, template) - secured_view = secure_view(mapped_view, permission) + owrapped_view = owrap_view(mapped_view, wrapper_viewname) + secured_view = secure_view(owrapped_view, permission) debug_view = authdebug_view(secured_view, permission) derived_view = predicate_wrap(debug_view, predicates) return derived_view +def owrap_view(view, wrapper_viewname): + if not wrapper_viewname: + return view + def _owrapped_view(context, request): + response = view(context, request) + request.wrapped_response = response + request.wrapped_body = response.body + return render_view_to_response(context, request, wrapper_viewname) + decorate_view(_owrapped_view, view) + return _owrapped_view + def predicate_wrap(view, predicates): if not predicates: return view @@ -627,6 +641,11 @@ class IViewDirective(Interface): description=u'', required=False) + wrapper = TextLine( + title = u'The *name* of the view that acts as a wrapper for this view.', + description = u'', + required=False) + request_type = TextLine( title=u"The request type string or dotted name interface for the view", description=(u"The view will be called if the interface represented by " |
