From 09343c18743ac669a848a5da60061d1fd2db2a70 Mon Sep 17 00:00:00 2001 From: Ryan P Kilby Date: Sat, 18 Nov 2017 20:26:28 -0500 Subject: [PATCH] Convert drf to expect 'rest_framework' namespace --- rest_framework/relations.py | 3 ++- rest_framework/routers.py | 3 --- rest_framework/versioning.py | 7 +++++++ tests/test_routers.py | 10 +++++++--- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/rest_framework/relations.py b/rest_framework/relations.py index c87b9299a..fc66d8704 100644 --- a/rest_framework/relations.py +++ b/rest_framework/relations.py @@ -339,7 +339,8 @@ class HyperlinkedRelatedField(RelatedField): self.view_name, request ) except AttributeError: - expected_viewname = self.view_name + # by default, expect the 'rest_framework' namespace + expected_viewname = 'rest_framework:' + self.view_name if match.view_name != expected_viewname: self.fail('incorrect_match') diff --git a/rest_framework/routers.py b/rest_framework/routers.py index 9007788f8..beb3c2911 100644 --- a/rest_framework/routers.py +++ b/rest_framework/routers.py @@ -305,10 +305,7 @@ class APIRootView(views.APIView): def get(self, request, *args, **kwargs): # Return a plain {"name": "hyperlink"} response. ret = OrderedDict() - namespace = request.resolver_match.namespace for key, url_name in self.api_root_dict.items(): - if namespace: - url_name = namespace + ':' + url_name try: ret[key] = reverse( url_name, diff --git a/rest_framework/versioning.py b/rest_framework/versioning.py index 5c9a7ade1..384f1eb75 100644 --- a/rest_framework/versioning.py +++ b/rest_framework/versioning.py @@ -135,6 +135,13 @@ class NamespaceVersioning(BaseVersioning): ) def get_versioned_viewname(self, viewname, request): + """ + The incoming `viewname` should be prefixed with the 'rest_framework' + application namespace. We want to replace this with the version + instance namespace. + """ + if viewname.startswith('rest_framework:'): + viewname = viewname[len('rest_framework:'):] return request.version + ':' + viewname diff --git a/tests/test_routers.py b/tests/test_routers.py index 36255f48f..f39b9c694 100644 --- a/tests/test_routers.py +++ b/tests/test_routers.py @@ -146,12 +146,16 @@ class TestSimpleRouter(TestCase): class TestRootView(URLPatternsTestCase, TestCase): urlpatterns = [ url(r'^non-namespaced/', include(namespaced_router.urls)), - url(r'^namespaced/', include((namespaced_router.urls, 'namespaced'), namespace='namespaced')), + url(r'^namespaced1/', include((namespaced_router.urls, 'namespaced1'), namespace='namespaced1')), + url(r'^namespaced2/', include((namespaced_router.urls, 'namespaced2'), namespace='namespaced2')), ] def test_retrieve_namespaced_root(self): - response = self.client.get('/namespaced/') - assert response.data == {"example": "http://testserver/namespaced/example/"} + response = self.client.get('/namespaced1/') + assert response.data == {"example": "http://testserver/namespaced1/example/"} + + response = self.client.get('/namespaced2/') + assert response.data == {"example": "http://testserver/namespaced2/example/"} def test_retrieve_non_namespaced_root(self): response = self.client.get('/non-namespaced/')