Skip to content

Commit a25aac7

Browse files
jornvanwierJorn van Wierauvipy
authored
fix URLPathVersioning reverse fallback (#7247)
* fix URLPathVersioning reverse fallback * add test for URLPathVersioning reverse fallback * Update tests/test_versioning.py --------- Co-authored-by: Jorn van Wier <[email protected]> Co-authored-by: Asif Saif Uddin <[email protected]>
1 parent 332e956 commit a25aac7

File tree

2 files changed

+14
-2
lines changed

2 files changed

+14
-2
lines changed

rest_framework/versioning.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,10 @@ def determine_version(self, request, *args, **kwargs):
8181

8282
def reverse(self, viewname, args=None, kwargs=None, request=None, format=None, **extra):
8383
if request.version is not None:
84-
kwargs = {} if (kwargs is None) else kwargs
85-
kwargs[self.version_param] = request.version
84+
kwargs = {
85+
self.version_param: request.version,
86+
**(kwargs or {})
87+
}
8688

8789
return super().reverse(
8890
viewname, args, kwargs, request, format, **extra

tests/test_versioning.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,8 @@ class TestURLReversing(URLPatternsTestCase, APITestCase):
152152
path('v1/', include((included, 'v1'), namespace='v1')),
153153
path('another/', dummy_view, name='another'),
154154
re_path(r'^(?P<version>[v1|v2]+)/another/$', dummy_view, name='another'),
155+
re_path(r'^(?P<foo>.+)/unversioned/$', dummy_view, name='unversioned'),
156+
155157
]
156158

157159
def test_reverse_unversioned(self):
@@ -198,6 +200,14 @@ def test_reverse_url_path_versioning(self):
198200
response = view(request)
199201
assert response.data == {'url': 'http://testserver/another/'}
200202

203+
# Test fallback when kwargs is not None
204+
request = factory.get('/v1/endpoint/')
205+
request.versioning_scheme = scheme()
206+
request.version = 'v1'
207+
208+
reversed_url = reverse('unversioned', request=request, kwargs={'foo': 'bar'})
209+
assert reversed_url == 'http://testserver/bar/unversioned/'
210+
201211
def test_reverse_namespace_versioning(self):
202212
class FakeResolverMatch(ResolverMatch):
203213
namespace = 'v1'

0 commit comments

Comments
 (0)