mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-08-04 20:40:14 +03:00
Merge 9be01a6e4d
into 299a8347e8
This commit is contained in:
commit
8a2fc8fd50
|
@ -2,8 +2,11 @@
|
||||||
Provide reverse functions that return fully qualified URLs
|
Provide reverse functions that return fully qualified URLs
|
||||||
"""
|
"""
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
from django.core.urlresolvers import reverse as django_reverse
|
from django.core.urlresolvers import reverse as django_reverse, NoReverseMatch
|
||||||
from django.utils.functional import lazy
|
from django.utils.functional import lazy
|
||||||
|
from django.core.urlresolvers import resolve
|
||||||
|
from django.http import Http404
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def reverse(viewname, args=None, kwargs=None, request=None, format=None, **extra):
|
def reverse(viewname, args=None, kwargs=None, request=None, format=None, **extra):
|
||||||
|
@ -14,9 +17,31 @@ def reverse(viewname, args=None, kwargs=None, request=None, format=None, **extra
|
||||||
if format is not None:
|
if format is not None:
|
||||||
kwargs = kwargs or {}
|
kwargs = kwargs or {}
|
||||||
kwargs['format'] = format
|
kwargs['format'] = format
|
||||||
url = django_reverse(viewname, args=args, kwargs=kwargs, **extra)
|
|
||||||
|
try:
|
||||||
|
viewname_to_try = viewname
|
||||||
|
if request:
|
||||||
|
try:
|
||||||
|
namespace = request.resolver_match.namespace
|
||||||
|
except AttributeError:
|
||||||
|
try:
|
||||||
|
namespace = resolve(request.path).namespace
|
||||||
|
except Http404:
|
||||||
|
namespace=None
|
||||||
|
|
||||||
|
if namespace and ':' not in viewname:
|
||||||
|
viewname_to_try = '{namespace}:{viewname}'.format(namespace=namespace,
|
||||||
|
viewname=viewname)
|
||||||
|
|
||||||
|
url = django_reverse(viewname_to_try, args=args, kwargs=kwargs,
|
||||||
|
**extra)
|
||||||
|
except NoReverseMatch:
|
||||||
|
url = django_reverse(viewname, args=args, kwargs=kwargs,
|
||||||
|
**extra)
|
||||||
|
|
||||||
if request:
|
if request:
|
||||||
return request.build_absolute_uri(url)
|
return request.build_absolute_uri(url)
|
||||||
|
|
||||||
return url
|
return url
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from rest_framework.compat import patterns, url
|
from rest_framework.compat import patterns, url, include
|
||||||
from rest_framework.reverse import reverse
|
from rest_framework.reverse import reverse
|
||||||
from rest_framework.test import APIRequestFactory
|
from rest_framework.test import APIRequestFactory
|
||||||
|
|
||||||
|
@ -10,8 +10,24 @@ factory = APIRequestFactory()
|
||||||
def null_view(request):
|
def null_view(request):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
urlpatterns = patterns('',
|
|
||||||
|
v0_urlpatterns = patterns('',
|
||||||
url(r'^view$', null_view, name='view'),
|
url(r'^view$', null_view, name='view'),
|
||||||
|
url(r'^other-view', null_view, name="other-view"),
|
||||||
|
)
|
||||||
|
|
||||||
|
v1_urlpatterns = patterns('',
|
||||||
|
url(r'^view$', null_view, name='view'),
|
||||||
|
)
|
||||||
|
|
||||||
|
v2_urlpatterns = patterns('',
|
||||||
|
url(r'^view$', null_view, name='view'),
|
||||||
|
)
|
||||||
|
|
||||||
|
urlpatterns = patterns('',
|
||||||
|
url(r'', include(v0_urlpatterns)), # Un-versioned.
|
||||||
|
url(r'v1/', include(v1_urlpatterns, namespace='v1')),
|
||||||
|
url(r'v2/', include(v2_urlpatterns, namespace='v2')),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -25,3 +41,38 @@ class ReverseTests(TestCase):
|
||||||
request = factory.get('/view')
|
request = factory.get('/view')
|
||||||
url = reverse('view', request=request)
|
url = reverse('view', request=request)
|
||||||
self.assertEqual(url, 'http://testserver/view')
|
self.assertEqual(url, 'http://testserver/view')
|
||||||
|
|
||||||
|
|
||||||
|
def test_namespaced_request_to_non_namespaced_view(self):
|
||||||
|
"""
|
||||||
|
Main test for #1143.
|
||||||
|
|
||||||
|
(Code moved unchanged to v2 will reverse to v2.)
|
||||||
|
"""
|
||||||
|
request = factory.get('/v2/view')
|
||||||
|
url = reverse('view', request=request)
|
||||||
|
self.assertEqual(url, 'http://testserver/v2/view')
|
||||||
|
|
||||||
|
def test_namespaced_request_to_non_namespaced_view_not_in_namespace(self):
|
||||||
|
request = factory.get('/v2/view')
|
||||||
|
url = reverse('other-view', request=request)
|
||||||
|
self.assertEqual(url, 'http://testserver/other-view')
|
||||||
|
|
||||||
|
|
||||||
|
# Additional tests for #1143
|
||||||
|
# Covering cases mentioned
|
||||||
|
# https://github.com/tomchristie/django-rest-framework/pull/1143#issuecomment-30031591
|
||||||
|
def test_non_namespaced_request_to_namespaced_view(self):
|
||||||
|
request = factory.get('/view')
|
||||||
|
url = reverse('v2:view', request=request)
|
||||||
|
self.assertEqual(url, 'http://testserver/v2/view')
|
||||||
|
|
||||||
|
def test_namespaced_request_to_same_namespaced_view(self):
|
||||||
|
request = factory.get('/v2/view')
|
||||||
|
url = reverse('v2:view', request=request)
|
||||||
|
self.assertEqual(url, 'http://testserver/v2/view')
|
||||||
|
|
||||||
|
def test_namespaced_request_to_different_namespaced_view(self):
|
||||||
|
request = factory.get('/v2/view')
|
||||||
|
url = reverse('v1:view', request=request)
|
||||||
|
self.assertEqual(url, 'http://testserver/v1/view')
|
Loading…
Reference in New Issue
Block a user