Daniel Nouri
2012-01-17 8ea3f363aa136798b128f75dac0432d36bbb8aa5
Fix bug with registration of identical views with same 'accept'.
2 files modified
38 ■■■■ changed files
pyramid/config/views.py 9 ●●●● patch | view | raw | blame | history
pyramid/tests/test_config/test_views.py 29 ●●●● patch | view | raw | blame | history
pyramid/config/views.py
@@ -513,8 +513,13 @@
            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
pyramid/tests/test_config/test_views.py
@@ -621,6 +621,24 @@
        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 @@
        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)])