summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@plope.com>2011-01-02 20:19:57 -0500
committerChris McDonough <chrism@plope.com>2011-01-02 20:19:57 -0500
commit8f2db27ffe8376c313d09e5c3608d326bb4f0e25 (patch)
tree0aac7a915306b6efc27ffcd7da0023323abf04aa
parent1d9ade4f8bf93dd88f38daba868e7a619919a98e (diff)
downloadpyramid-8f2db27ffe8376c313d09e5c3608d326bb4f0e25.tar.gz
pyramid-8f2db27ffe8376c313d09e5c3608d326bb4f0e25.tar.bz2
pyramid-8f2db27ffe8376c313d09e5c3608d326bb4f0e25.zip
- Allow view callables to specify their preferred view mapper by respecting a
``__view_mapper__`` attribute. This setting can still be overridden by configuration-specified ``view_mapper`` argument to ``add_view``.
-rw-r--r--pyramid/config.py6
-rw-r--r--pyramid/tests/test_config.py47
2 files changed, 51 insertions, 2 deletions
diff --git a/pyramid/config.py b/pyramid/config.py
index 78cb13b65..338be2a98 100644
--- a/pyramid/config.py
+++ b/pyramid/config.py
@@ -2793,9 +2793,11 @@ class ViewDeriver(object):
def mapped_view(self, view):
mapper = self.kw.get('view_mapper')
if mapper is None:
- mapper = self.registry.queryUtility(IViewMapperFactory)
+ mapper = getattr(view, '__view_mapper__', None)
if mapper is None:
- mapper = DefaultViewMapper
+ mapper = self.registry.queryUtility(IViewMapperFactory)
+ if mapper is None:
+ mapper = DefaultViewMapper
mapped_view = mapper(**self.kw)(view)
return mapped_view
diff --git a/pyramid/tests/test_config.py b/pyramid/tests/test_config.py
index 52760d6d7..1632a4e5c 100644
--- a/pyramid/tests/test_config.py
+++ b/pyramid/tests/test_config.py
@@ -3790,6 +3790,53 @@ class TestViewDeriver(unittest.TestCase):
context = testing.DummyResource()
self.assertEqual(result(context, request), {'a':'1'})
+ def test_with_view_mapper_config_specified(self):
+ class mapper(object):
+ def __init__(self, **kw):
+ self.kw = kw
+ def __call__(self, view):
+ def wrapped(context, request):
+ return 'OK'
+ return wrapped
+ def view(context, request):
+ return 'NOTOK'
+ deriver = self._makeOne(view_mapper=mapper)
+ result = deriver(view)
+ self.failIf(result is view)
+ self.assertEqual(result(None, None), 'OK')
+
+ def test_with_view_mapper_view_specified(self):
+ def mapper(**kw):
+ def inner(view):
+ def superinner(context, request):
+ self.assertEqual(request, None)
+ return 'OK'
+ return superinner
+ return inner
+ def view(context, request):
+ return 'NOTOK'
+ view.__view_mapper__ = mapper
+ deriver = self._makeOne()
+ result = deriver(view)
+ self.failIf(result is view)
+ self.assertEqual(result(None, None), 'OK')
+
+ def test_with_view_mapper_default_mapper_specified(self):
+ def mapper(**kw):
+ def inner(view):
+ def superinner(context, request):
+ self.assertEqual(request, None)
+ return 'OK'
+ return superinner
+ return inner
+ self.config.set_view_mapper(mapper)
+ def view(context, request):
+ return 'NOTOK'
+ deriver = self._makeOne()
+ result = deriver(view)
+ self.failIf(result is view)
+ self.assertEqual(result(None, None), 'OK')
+
class TestDefaultViewMapper(unittest.TestCase):
def setUp(self):
self.config = testing.setUp()