summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@plope.com>2012-01-19 04:24:00 -0500
committerChris McDonough <chrism@plope.com>2012-01-19 04:24:00 -0500
commit134388a0157728b1f96daa09fb8bdfde6a1de209 (patch)
tree5c0f20b3ee80d524e4225f8e218cca288ecd1c14
parent9619d0f8b0b4d4aca0e9f68ba1890de2b2860396 (diff)
downloadpyramid-134388a0157728b1f96daa09fb8bdfde6a1de209.tar.gz
pyramid-134388a0157728b1f96daa09fb8bdfde6a1de209.tar.bz2
pyramid-134388a0157728b1f96daa09fb8bdfde6a1de209.zip
- 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.
-rw-r--r--CHANGES.txt5
-rw-r--r--pyramid/config/views.py9
-rw-r--r--pyramid/tests/test_config/test_views.py43
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'