#27597: UrlResolver doesn't check all possibilities
----------------------------------------+------------------------
               Reporter:  Adrien mille  |          Owner:  nobody
                   Type:  Bug           |         Status:  new
              Component:  Core (URLs)   |        Version:  1.10
               Severity:  Normal        |       Keywords:
           Triage Stage:  Unreviewed    |      Has patch:  0
    Needs documentation:  0             |    Needs tests:  0
Patch needs improvement:  0             |  Easy pickings:  0
                  UI/UX:  0             |
----------------------------------------+------------------------
 The UrlResolver doesn't check possibilities through multiple namespaces ;
 It'll look out for the viewname in a namespace to test all possibilities.
 But the resolver won't go backward to other namespaces to list additional
 possibilities that might match. I've few difficulties to define that issue
 so I join this test case to reproduce it.

 {{{
 from django.test import TestCase
 from django.conf.urls import url, include
 from django.shortcuts import reverse


 def my_view(**kwargs):
     pass


 class UrlConf(object):
     # those are url patterns and views that I can re-used multiple times
     common_url_patterns = [
         # this is a page like any others
         url(r'^$', my_view, name='page'),
         # here is a namespace to let's say group actions together
         # I clearly set a namespace to make it more logical
         url(r'^actions/', include([
             url(r'^action/$', my_view, name='action')
         ], namespace='actions'))
     ]

     urlpatterns = [
         # this is a part of my app into a namespace, nothing special about
 it
         url(r'^root/', include([
             # depending of what are my keyword arguments
             # I will use one of these two followings possibilities
             url(r'^without-context/', include(common_url_patterns),
 kwargs={'additional_arg': -21}),
             url(r'^with-context/(?P<var>[0-9]+)/',
 include(common_url_patterns))
             # you may ask why I'm not using nested optional argument
             # this is because I explicitly defined kwargs arguments for my
 view in one cases
             # but not in the other, so I cannot solve it that way
         ], namespace='root'))
     ]


 class TestUrlResolver(TestCase):
     def _test_reverse_for(self, viewname, kwargs, expected):
         self.assertEqual(reverse(viewname, kwargs=kwargs,
 urlconf=UrlConf), expected)

     def test_page_without_var(self):
         self._test_reverse_for('root:page', None, '/root/without-
 context/')

     def test_page_with_var(self):
         self._test_reverse_for('root:page', {'var': 42}, '/root/with-
 context/42/')

     def test_action_without_var(self):
         self._test_reverse_for('root:actions:action', None, '/root
 /without-context/actions/action/')

     def test_action_with_var(self):
         self._test_reverse_for('root:actions:action', {'var': 42}, '/root
 /with-context/42/actions/action/')
 }}}

--
Ticket URL: <https://code.djangoproject.com/ticket/27597>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/054.0671f4f21ff7206b586fdf72c0f3463e%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to