summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@plope.com>2012-01-19 03:45:47 -0500
committerChris McDonough <chrism@plope.com>2012-01-19 03:45:47 -0500
commite168597099f052e1e76aaee826ce7b949ef2f791 (patch)
tree4f026f42ea2d8c35533cb8fbaa70a14746cdd347
parent077f3d1d0b28d9f565cc07a3ad11f4a8bb359054 (diff)
parentf4b7fd8db3c3c729d625f037cd48f1839332519d (diff)
downloadpyramid-e168597099f052e1e76aaee826ce7b949ef2f791.tar.gz
pyramid-e168597099f052e1e76aaee826ce7b949ef2f791.tar.bz2
pyramid-e168597099f052e1e76aaee826ce7b949ef2f791.zip
Merge branch 'dnouri-master'
-rw-r--r--pyramid/config/views.py9
-rw-r--r--pyramid/tests/test_config/test_views.py31
2 files changed, 36 insertions, 4 deletions
diff --git a/pyramid/config/views.py b/pyramid/config/views.py
index 3cca1c7c5..89a0d77c5 100644
--- a/pyramid/config/views.py
+++ b/pyramid/config/views.py
@@ -513,8 +513,13 @@ class MultiView(object):
self.views.sort(key=operator.itemgetter(0))
else:
subset = self.media_views.setdefault(accept, [])
- subset.append((order, view, phash))
- subset.sort()
+ for i, (s, v, h) in enumerate(list(subset)):
+ if phash == h:
+ subset[i] = (order, view, phash)
+ return
+ else:
+ subset.append((order, view, phash))
+ subset.sort()
accepts = set(self.accepts)
accepts.add(accept)
self.accepts = list(accepts) # dedupe
diff --git a/pyramid/tests/test_config/test_views.py b/pyramid/tests/test_config/test_views.py
index aa4c03db6..f1fe03c25 100644
--- a/pyramid/tests/test_config/test_views.py
+++ b/pyramid/tests/test_config/test_views.py
@@ -621,6 +621,25 @@ class TestViewsConfigurationMixin(unittest.TestCase):
request.accept = DummyAccept('text/html', 'text/html')
self.assertEqual(wrapper(None, request), 'OK2')
+ def test_add_views_with_accept_multiview_replaces_existing(self):
+ from pyramid.renderers import null_renderer
+ def view(context, request):
+ return 'OK'
+ def view2(context, request):
+ return 'OK2'
+ def view3(context, request):
+ return 'OK3'
+ config = self._makeOne(autocommit=True)
+ config.add_view(view=view, renderer=null_renderer)
+ config.add_view(view=view2, accept='text/html', renderer=null_renderer)
+ config.add_view(view=view3, accept='text/html', renderer=null_renderer)
+ wrapper = self._getViewCallable(config)
+ self.assertEqual(len(wrapper.media_views['text/html']), 1)
+ self.assertEqual(wrapper(None, None), 'OK')
+ request = DummyRequest()
+ request.accept = DummyAccept('text/html', 'text/html')
+ self.assertEqual(wrapper(None, request), 'OK3')
+
def test_add_view_exc_with_accept_multiview_replaces_existing_view(self):
from pyramid.renderers import null_renderer
from zope.interface import implementedBy
@@ -1960,9 +1979,9 @@ class TestMultiView(unittest.TestCase):
self.assertEqual(mv.views, [(99, 'view2', None), (100, 'view', None)])
mv.add('view3', 100, 'text/html')
self.assertEqual(mv.media_views['text/html'], [(100, 'view3', None)])
- mv.add('view4', 99, 'text/html')
+ mv.add('view4', 99, 'text/html', 'abc')
self.assertEqual(mv.media_views['text/html'],
- [(99, 'view4', None), (100, 'view3', None)])
+ [(99, 'view4', 'abc'), (100, 'view3', None)])
mv.add('view5', 100, 'text/xml')
self.assertEqual(mv.media_views['text/xml'], [(100, 'view5', None)])
self.assertEqual(set(mv.accepts), set(['text/xml', 'text/html']))
@@ -1985,6 +2004,14 @@ class TestMultiView(unittest.TestCase):
self.assertEqual(mv.views, [(100, 'view', 'abc'),
(100, 'view', 'def')])
+ def test_add_with_phash_override_accept(self):
+ mv = self._makeOne()
+ mv.add('view2', 100, accept='text/html', phash='abc')
+ mv.add('view3', 100, accept='text/html', phash='abc')
+ mv.add('view4', 99, accept='text/html', phash='def')
+ self.assertEqual(mv.media_views['text/html'],
+ [(99, 'view4', 'def'), (100, 'view3', 'abc')])
+
def test_multiple_with_functions_as_views(self):
# this failed on py3 at one point, because functions aren't orderable
# and we were sorting the views via a plain sort() rather than