From 0540f4ab25d68394ce3a237c511185959102b4b3 Mon Sep 17 00:00:00 2001 From: Jorn van Wier Date: Thu, 26 Mar 2020 13:33:46 +0100 Subject: [PATCH 1/3] fix URLPathVersioning reverse fallback --- rest_framework/versioning.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/rest_framework/versioning.py b/rest_framework/versioning.py index 8c35a1a58f..e25d36f4aa 100644 --- a/rest_framework/versioning.py +++ b/rest_framework/versioning.py @@ -81,8 +81,10 @@ def determine_version(self, request, *args, **kwargs): def reverse(self, viewname, args=None, kwargs=None, request=None, format=None, **extra): if request.version is not None: - kwargs = {} if (kwargs is None) else kwargs - kwargs[self.version_param] = request.version + kwargs = { + self.version_param: request.version, + **(kwargs or {}) + } return super().reverse( viewname, args, kwargs, request, format, **extra From ae02a9bb210aecce1b1c84d60ee9a8a8968f6ab4 Mon Sep 17 00:00:00 2001 From: Jorn van Wier Date: Thu, 2 Apr 2020 11:38:57 +0200 Subject: [PATCH 2/3] add test for URLPathVersioning reverse fallback --- tests/test_versioning.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/test_versioning.py b/tests/test_versioning.py index d4e269df30..2a61552400 100644 --- a/tests/test_versioning.py +++ b/tests/test_versioning.py @@ -151,6 +151,7 @@ class TestURLReversing(URLPatternsTestCase, APITestCase): urlpatterns = [ url(r'^v1/', include((included, 'v1'), namespace='v1')), url(r'^another/$', dummy_view, name='another'), + url(r'^(?P.+)/unversioned/$', dummy_view, name='unversioned'), url(r'^(?P[v1|v2]+)/another/$', dummy_view, name='another'), ] @@ -198,6 +199,14 @@ def test_reverse_url_path_versioning(self): response = view(request) assert response.data == {'url': 'http://testserver/another/'} + # Test fallback when kwargs is not None + request = factory.get('/v1/endpoint/') + request.versioning_scheme = scheme() + request.version = 'v1' + + reversed_url = reverse('unversioned', request=request, kwargs={'foo': 'bar'}) + assert reversed_url == 'http://testserver/bar/unversioned/' + def test_reverse_namespace_versioning(self): class FakeResolverMatch: namespace = 'v1' From 0e41f35b41264345557856e3ec778c2f6fb584b2 Mon Sep 17 00:00:00 2001 From: Asif Saif Uddin Date: Sun, 2 Apr 2023 15:14:11 +0600 Subject: [PATCH 3/3] Update tests/test_versioning.py --- tests/test_versioning.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/test_versioning.py b/tests/test_versioning.py index 71ac3d8bff..33ad459f1c 100644 --- a/tests/test_versioning.py +++ b/tests/test_versioning.py @@ -149,7 +149,6 @@ class TestURLReversing(URLPatternsTestCase, APITestCase): ] urlpatterns = [ - path('v1/', include((included, 'v1'), namespace='v1')), path('another/', dummy_view, name='another'), re_path(r'^(?P[v1|v2]+)/another/$', dummy_view, name='another'),