mirror of
https://github.com/django/django.git
synced 2024-12-30 21:16:26 +00:00
015a9b928a
When reversing, only outer parameters are used if captured parameters are
nested. Added tests to check the edge cases and documentation for the
behavior with an example to avoid it.
Backport of 23a5d64f40
from master
88 lines
4.9 KiB
Python
88 lines
4.9 KiB
Python
import warnings
|
|
|
|
from django.conf.urls import include, patterns, url
|
|
from django.utils.deprecation import RemovedInDjango20Warning
|
|
|
|
from .views import (
|
|
absolute_kwargs_view, defaults_view, empty_view, empty_view_partial,
|
|
empty_view_wrapped, nested_view,
|
|
)
|
|
|
|
other_patterns = [
|
|
url(r'non_path_include/$', empty_view, name='non_path_include'),
|
|
url(r'nested_path/$', nested_view),
|
|
]
|
|
|
|
# test deprecated patterns() function. convert to list of urls() in Django 2.0
|
|
with warnings.catch_warnings():
|
|
warnings.filterwarnings('ignore', category=RemovedInDjango20Warning)
|
|
|
|
urlpatterns = patterns('',
|
|
url(r'^places/([0-9]+)/$', empty_view, name='places'),
|
|
url(r'^places?/$', empty_view, name="places?"),
|
|
url(r'^places+/$', empty_view, name="places+"),
|
|
url(r'^places*/$', empty_view, name="places*"),
|
|
url(r'^(?:places/)?$', empty_view, name="places2?"),
|
|
url(r'^(?:places/)+$', empty_view, name="places2+"),
|
|
url(r'^(?:places/)*$', empty_view, name="places2*"),
|
|
url(r'^places/([0-9]+|[a-z_]+)/', empty_view, name="places3"),
|
|
url(r'^places/(?P<id>[0-9]+)/$', empty_view, name="places4"),
|
|
url(r'^people/(?P<name>\w+)/$', empty_view, name="people"),
|
|
url(r'^people/(?:name/)', empty_view, name="people2"),
|
|
url(r'^people/(?:name/(\w+)/)?', empty_view, name="people2a"),
|
|
url(r'^people/(?P<name>\w+)-(?P=name)/$', empty_view, name="people_backref"),
|
|
url(r'^optional/(?P<name>.*)/(?:.+/)?', empty_view, name="optional"),
|
|
url(r'^optional/(?P<arg1>\d+)/(?:(?P<arg2>\d+)/)?', absolute_kwargs_view, name="named_optional"),
|
|
url(r'^optional/(?P<arg1>\d+)/(?:(?P<arg2>\d+)/)?$', absolute_kwargs_view, name="named_optional_terminated"),
|
|
url(r'^nested/noncapture/(?:(?P<p>\w+))$', empty_view, name='nested-noncapture'),
|
|
url(r'^nested/capture/((\w+)/)?$', empty_view, name='nested-capture'),
|
|
url(r'^nested/capture/mixed/((?P<p>\w+))$', empty_view, name='nested-mixedcapture'),
|
|
url(r'^nested/capture/named/(?P<outer>(?P<inner>\w+)/)?$', empty_view, name='nested-namedcapture'),
|
|
url(r'^hardcoded/$', empty_view, name="hardcoded"),
|
|
url(r'^hardcoded/doc\.pdf$', empty_view, name="hardcoded2"),
|
|
url(r'^people/(?P<state>\w\w)/(?P<name>\w+)/$', empty_view, name="people3"),
|
|
url(r'^people/(?P<state>\w\w)/(?P<name>[0-9])/$', empty_view, name="people4"),
|
|
url(r'^people/((?P<state>\w\w)/test)?/(\w+)/$', empty_view, name="people6"),
|
|
url(r'^character_set/[abcdef0-9]/$', empty_view, name="range"),
|
|
url(r'^character_set/[\w]/$', empty_view, name="range2"),
|
|
url(r'^price/\$([0-9]+)/$', empty_view, name="price"),
|
|
url(r'^price/[$]([0-9]+)/$', empty_view, name="price2"),
|
|
url(r'^price/[\$]([0-9]+)/$', empty_view, name="price3"),
|
|
url(r'^product/(?P<product>\w+)\+\(\$(?P<price>[0-9]+(\.[0-9]+)?)\)/$', empty_view, name="product"),
|
|
url(r'^headlines/(?P<year>[0-9]+)\.(?P<month>[0-9]+)\.(?P<day>[0-9]+)/$', empty_view, name="headlines"),
|
|
url(r'^windows_path/(?P<drive_name>[A-Z]):\\(?P<path>.+)/$', empty_view, name="windows"),
|
|
url(r'^special_chars/(?P<chars>.+)/$', empty_view, name="special"),
|
|
url(r'^(?P<name>.+)/[0-9]+/$', empty_view, name="mixed"),
|
|
url(r'^repeats/a{1,2}/$', empty_view, name="repeats"),
|
|
url(r'^repeats/a{2,4}/$', empty_view, name="repeats2"),
|
|
url(r'^repeats/a{2}/$', empty_view, name="repeats3"),
|
|
url(r'^(?i)CaseInsensitive/(\w+)', empty_view, name="insensitive"),
|
|
url(r'^test/1/?', empty_view, name="test"),
|
|
url(r'^(?i)test/2/?$', empty_view, name="test2"),
|
|
url(r'^outer/(?P<outer>[0-9]+)/', include('urlpatterns_reverse.included_urls')),
|
|
url(r'^outer-no-kwargs/([0-9]+)/', include('urlpatterns_reverse.included_no_kwargs_urls')),
|
|
url('', include('urlpatterns_reverse.extra_urls')),
|
|
|
|
# Partials should be fine.
|
|
url(r'^partial/', empty_view_partial, name="partial"),
|
|
url(r'^partial_wrapped/', empty_view_wrapped, name="partial_wrapped"),
|
|
|
|
# This is non-reversible, but we shouldn't blow up when parsing it.
|
|
url(r'^(?:foo|bar)(\w+)/$', empty_view, name="disjunction"),
|
|
|
|
# Regression views for #9038. See tests for more details
|
|
url(r'arg_view/$', 'urlpatterns_reverse.views.kwargs_view'),
|
|
url(r'arg_view/(?P<arg1>[0-9]+)/$', 'urlpatterns_reverse.views.kwargs_view'),
|
|
url(r'absolute_arg_view/(?P<arg1>[0-9]+)/$', absolute_kwargs_view),
|
|
url(r'absolute_arg_view/$', absolute_kwargs_view),
|
|
|
|
# Tests for #13154. Mixed syntax to test both ways of defining URLs.
|
|
url(r'defaults_view1/(?P<arg1>[0-9]+)/', defaults_view, {'arg2': 1}, name='defaults'),
|
|
(r'defaults_view2/(?P<arg1>[0-9]+)/', defaults_view, {'arg2': 2}, 'defaults'),
|
|
|
|
url('^includes/', include(other_patterns)),
|
|
|
|
# Security tests
|
|
url('(.+)/security/$', empty_view, name='security'),
|
|
)
|