From 134388a0157728b1f96daa09fb8bdfde6a1de209 Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Thu, 19 Jan 2012 04:24:00 -0500 Subject: - When using a dotted name for a ``view`` argument to ``Configurator.add_view`` that pointed to a class with a ``view_defaults`` decorator, the view defaults would not be applied. See https://github.com/Pylons/pyramid/issues/396 . Fixes #396. --- CHANGES.txt | 5 ++++ pyramid/config/views.py | 9 ++++--- pyramid/tests/test_config/test_views.py | 43 +++++++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+), 4 deletions(-) diff --git a/CHANGES.txt b/CHANGES.txt index ba90c3bad..bfafaaae3 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -21,6 +21,11 @@ Bug Fixes a different view that had the same predicate arguments. See https://github.com/Pylons/pyramid/pull/404 for more information. +- When using a dotted name for a ``view`` argument to + ``Configurator.add_view`` that pointed to a class with a ``view_defaults`` + decorator, the view defaults would not be applied. See + https://github.com/Pylons/pyramid/issues/396 . + 1.3a5 (2012-01-09) ================== diff --git a/pyramid/config/views.py b/pyramid/config/views.py index 89a0d77c5..8d7885bd2 100644 --- a/pyramid/config/views.py +++ b/pyramid/config/views.py @@ -567,17 +567,18 @@ class MultiView(object): raise PredicateMismatch(self.name) def viewdefaults(wrapped): - def wrapper(*arg, **kw): + def wrapper(self, *arg, **kw): defaults = {} - if len(arg) > 1: - view = arg[1] + if arg: + view = arg[0] else: view = kw.get('view') + view = self.maybe_dotted(view) if inspect.isclass(view): defaults = getattr(view, '__view_defaults__', {}).copy() defaults.update(kw) defaults['_backframes'] = 3 # for action_method - return wrapped(*arg, **defaults) + return wrapped(self, *arg, **defaults) return wraps(wrapped)(wrapper) class ViewsConfiguratorMixin(object): diff --git a/pyramid/tests/test_config/test_views.py b/pyramid/tests/test_config/test_views.py index dd96579b7..aa941c0cf 100644 --- a/pyramid/tests/test_config/test_views.py +++ b/pyramid/tests/test_config/test_views.py @@ -1474,6 +1474,40 @@ class TestViewsConfigurationMixin(unittest.TestCase): context = DummyContext() request = self._makeRequest(config) self.assertRaises(PredicateMismatch, wrapper, context, request) + + def test_add_view_with_view_defaults_viewname_is_dottedname_kwarg(self): + from pyramid.renderers import null_renderer + from pyramid.exceptions import PredicateMismatch + from zope.interface import directlyProvides + config = self._makeOne(autocommit=True) + config.add_view( + view='pyramid.tests.test_config.test_views.DummyViewDefaultsClass', + renderer=null_renderer) + wrapper = self._getViewCallable(config) + context = DummyContext() + directlyProvides(context, IDummy) + request = self._makeRequest(config) + self.assertEqual(wrapper(context, request), 'OK') + context = DummyContext() + request = self._makeRequest(config) + self.assertRaises(PredicateMismatch, wrapper, context, request) + + def test_add_view_with_view_defaults_viewname_is_dottedname_nonkwarg(self): + from pyramid.renderers import null_renderer + from pyramid.exceptions import PredicateMismatch + from zope.interface import directlyProvides + config = self._makeOne(autocommit=True) + config.add_view( + 'pyramid.tests.test_config.test_views.DummyViewDefaultsClass', + renderer=null_renderer) + wrapper = self._getViewCallable(config) + context = DummyContext() + directlyProvides(context, IDummy) + request = self._makeRequest(config) + self.assertEqual(wrapper(context, request), 'OK') + context = DummyContext() + request = self._makeRequest(config) + self.assertRaises(PredicateMismatch, wrapper, context, request) def test_add_view_with_view_config_and_view_defaults_doesnt_conflict(self): from pyramid.renderers import null_renderer @@ -3745,3 +3779,12 @@ class DummyStaticURLInfo: def add(self, config, name, spec, **kw): self.added.append((config, name, spec, kw)) + +class DummyViewDefaultsClass(object): + __view_defaults__ = { + 'containment':'pyramid.tests.test_config.IDummy' + } + def __init__(self, request): + pass + def __call__(self): + return 'OK' -- cgit v1.2.3