summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Nouri <daniel.nouri@gmail.com>2012-01-17 18:13:01 +0100
committerDaniel Nouri <daniel.nouri@gmail.com>2012-01-17 18:13:01 +0100
commit8ea3f363aa136798b128f75dac0432d36bbb8aa5 (patch)
tree727e186a60155de8416f0d885698d66509c21f1c
parentabb4e18f4026d90557d95dccd79303514b7c05db (diff)
downloadpyramid-8ea3f363aa136798b128f75dac0432d36bbb8aa5.tar.gz
pyramid-8ea3f363aa136798b128f75dac0432d36bbb8aa5.tar.bz2
pyramid-8ea3f363aa136798b128f75dac0432d36bbb8aa5.zip
Fix bug with registration of identical views with same 'accept'.
-rw-r--r--pyramid/config/views.py9
-rw-r--r--pyramid/tests/test_config/test_views.py29
2 files changed, 32 insertions, 6 deletions
diff --git a/pyramid/config/views.py b/pyramid/config/views.py
index 3cca1c7c5..d9507136f 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 and order == s:
+ 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..5ec63beab 100644
--- a/pyramid/tests/test_config/test_views.py
+++ b/pyramid/tests/test_config/test_views.py
@@ -621,6 +621,24 @@ 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(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
@@ -1963,12 +1981,15 @@ class TestMultiView(unittest.TestCase):
mv.add('view4', 99, 'text/html')
self.assertEqual(mv.media_views['text/html'],
[(99, 'view4', None), (100, 'view3', None)])
- mv.add('view5', 100, 'text/xml')
- self.assertEqual(mv.media_views['text/xml'], [(100, 'view5', None)])
+ mv.add('view5', 100, 'text/html')
+ self.assertEqual(mv.media_views['text/html'],
+ [(99, 'view4', None), (100, 'view5', None)])
+ mv.add('view6', 100, 'text/xml')
+ self.assertEqual(mv.media_views['text/xml'], [(100, 'view6', None)])
self.assertEqual(set(mv.accepts), set(['text/xml', 'text/html']))
self.assertEqual(mv.views, [(99, 'view2', None), (100, 'view', None)])
- mv.add('view6', 98, 'text/*')
- self.assertEqual(mv.views, [(98, 'view6', None),
+ mv.add('view7', 98, 'text/*')
+ self.assertEqual(mv.views, [(98, 'view7', None),
(99, 'view2', None),
(100, 'view', None)])