#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 django-updates+unsubscr...@googlegroups.com.
To post to this group, send email to django-updates@googlegroups.com.
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