Fix bug with registration of identical views with same 'accept'.
| | |
| | | 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 |
| | |
| | | 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 |
| | |
| | | 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)]) |
| | | |