From 8f2db27ffe8376c313d09e5c3608d326bb4f0e25 Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Sun, 2 Jan 2011 20:19:57 -0500 Subject: - 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``. --- pyramid/config.py | 6 ++++-- pyramid/tests/test_config.py | 47 ++++++++++++++++++++++++++++++++++++++++++++ 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() -- cgit v1.2.3