Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
D
django-rest-framework
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
django-rest-framework
Commits
54eea7f1
Commit
54eea7f1
authored
Mar 23, 2015
by
Tom Christie
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master' of
https://github.com/tomchristie/django-rest-framework
parents
35a0cbb9
a90dbe3b
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
78 additions
and
2 deletions
+78
-2
rest_framework/reverse.py
+8
-1
tests/test_reverse.py
+27
-0
tests/test_versioning.py
+43
-1
No files found.
rest_framework/reverse.py
View file @
54eea7f1
...
...
@@ -3,6 +3,7 @@ Provide urlresolver functions that return fully qualified URLs or view names
"""
from
__future__
import
unicode_literals
from
django.core.urlresolvers
import
reverse
as
django_reverse
from
django.core.urlresolvers
import
NoReverseMatch
from
django.utils
import
six
from
django.utils.functional
import
lazy
...
...
@@ -15,7 +16,13 @@ def reverse(viewname, args=None, kwargs=None, request=None, format=None, **extra
"""
scheme
=
getattr
(
request
,
'versioning_scheme'
,
None
)
if
scheme
is
not
None
:
return
scheme
.
reverse
(
viewname
,
args
,
kwargs
,
request
,
format
,
**
extra
)
try
:
return
scheme
.
reverse
(
viewname
,
args
,
kwargs
,
request
,
format
,
**
extra
)
except
NoReverseMatch
:
# In case the versioning scheme reversal fails, fallback to the
# default implementation
pass
return
_reverse
(
viewname
,
args
,
kwargs
,
request
,
format
,
**
extra
)
...
...
tests/test_reverse.py
View file @
54eea7f1
from
__future__
import
unicode_literals
from
django.conf.urls
import
patterns
,
url
from
django.core.urlresolvers
import
NoReverseMatch
from
django.test
import
TestCase
from
rest_framework.reverse
import
reverse
from
rest_framework.test
import
APIRequestFactory
...
...
@@ -16,6 +17,18 @@ urlpatterns = patterns(
)
class
MockVersioningScheme
(
object
):
def
__init__
(
self
,
raise_error
=
False
):
self
.
raise_error
=
raise_error
def
reverse
(
self
,
*
args
,
**
kwargs
):
if
self
.
raise_error
:
raise
NoReverseMatch
()
return
'http://scheme-reversed/view'
class
ReverseTests
(
TestCase
):
"""
Tests for fully qualified URLs when using `reverse`.
...
...
@@ -26,3 +39,17 @@ class ReverseTests(TestCase):
request
=
factory
.
get
(
'/view'
)
url
=
reverse
(
'view'
,
request
=
request
)
self
.
assertEqual
(
url
,
'http://testserver/view'
)
def
test_reverse_with_versioning_scheme
(
self
):
request
=
factory
.
get
(
'/view'
)
request
.
versioning_scheme
=
MockVersioningScheme
()
url
=
reverse
(
'view'
,
request
=
request
)
self
.
assertEqual
(
url
,
'http://scheme-reversed/view'
)
def
test_reverse_with_versioning_scheme_fallback_to_default_on_error
(
self
):
request
=
factory
.
get
(
'/view'
)
request
.
versioning_scheme
=
MockVersioningScheme
(
raise_error
=
True
)
url
=
reverse
(
'view'
,
request
=
request
)
self
.
assertEqual
(
url
,
'http://testserver/view'
)
tests/test_versioning.py
View file @
54eea7f1
...
...
@@ -7,6 +7,7 @@ from rest_framework.response import Response
from
rest_framework.reverse
import
reverse
from
rest_framework.test
import
APIRequestFactory
,
APITestCase
from
rest_framework.versioning
import
NamespaceVersioning
from
rest_framework.relations
import
PKOnlyObject
import
pytest
...
...
@@ -234,7 +235,7 @@ class TestInvalidVersion:
class
TestHyperlinkedRelatedField
(
UsingURLPatterns
,
APITestCase
):
included
=
[
url
(
r'^namespaced/(?P<pk>\d+)/$'
,
dummy_view
,
name
=
'namespaced'
),
url
(
r'^namespaced/(?P<pk>\d+)/$'
,
dummy_
pk_
view
,
name
=
'namespaced'
),
]
urlpatterns
=
[
...
...
@@ -262,3 +263,44 @@ class TestHyperlinkedRelatedField(UsingURLPatterns, APITestCase):
assert
self
.
field
.
to_internal_value
(
'/v1/namespaced/3/'
)
==
'object 3'
with
pytest
.
raises
(
serializers
.
ValidationError
):
self
.
field
.
to_internal_value
(
'/v2/namespaced/3/'
)
class
TestNamespaceVersioningHyperlinkedRelatedFieldScheme
(
UsingURLPatterns
,
APITestCase
):
included
=
[
url
(
r'^namespaced/(?P<pk>\d+)/$'
,
dummy_pk_view
,
name
=
'namespaced'
),
]
urlpatterns
=
[
url
(
r'^v1/'
,
include
(
included
,
namespace
=
'v1'
)),
url
(
r'^v2/'
,
include
(
included
,
namespace
=
'v2'
)),
url
(
r'^non-api/(?P<pk>\d+)/$'
,
dummy_pk_view
,
name
=
'non-api-view'
)
]
def
_create_field
(
self
,
view_name
,
version
):
request
=
factory
.
get
(
"/"
)
request
.
versioning_scheme
=
NamespaceVersioning
()
request
.
version
=
version
field
=
serializers
.
HyperlinkedRelatedField
(
view_name
=
view_name
,
read_only
=
True
)
field
.
_context
=
{
'request'
:
request
}
return
field
def
test_api_url_is_properly_reversed_with_v1
(
self
):
field
=
self
.
_create_field
(
'namespaced'
,
'v1'
)
assert
field
.
to_representation
(
PKOnlyObject
(
3
))
==
'http://testserver/v1/namespaced/3/'
def
test_api_url_is_properly_reversed_with_v2
(
self
):
field
=
self
.
_create_field
(
'namespaced'
,
'v2'
)
assert
field
.
to_representation
(
PKOnlyObject
(
5
))
==
'http://testserver/v2/namespaced/5/'
def
test_non_api_url_is_properly_reversed_regardless_of_the_version
(
self
):
"""
Regression test for #2711
"""
field
=
self
.
_create_field
(
'non-api-view'
,
'v1'
)
assert
field
.
to_representation
(
PKOnlyObject
(
10
))
==
'http://testserver/non-api/10/'
field
=
self
.
_create_field
(
'non-api-view'
,
'v2'
)
assert
field
.
to_representation
(
PKOnlyObject
(
10
))
==
'http://testserver/non-api/10/'
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment