Commit bc3485ab by Tom Christie Committed by GitHub

Namespace versioning with nested namespaces (#4219)

Support nested namespaces with namespaced versioning.
parent ea92d505
...@@ -112,16 +112,19 @@ class NamespaceVersioning(BaseVersioning): ...@@ -112,16 +112,19 @@ class NamespaceVersioning(BaseVersioning):
Host: example.com Host: example.com
Accept: application/json Accept: application/json
""" """
invalid_version_message = _('Invalid version in URL path.') invalid_version_message = _('Invalid version in URL path. Does not match any version namespace.')
def determine_version(self, request, *args, **kwargs): def determine_version(self, request, *args, **kwargs):
resolver_match = getattr(request, 'resolver_match', None) resolver_match = getattr(request, 'resolver_match', None)
if (resolver_match is None or not resolver_match.namespace): if (resolver_match is None or not resolver_match.namespace):
return self.default_version return self.default_version
version = resolver_match.namespace
if not self.is_allowed_version(version): # Allow for possibly nested namespaces.
raise exceptions.NotFound(self.invalid_version_message) possible_versions = resolver_match.namespace.split(':')
for version in possible_versions:
if self.is_allowed_version(version):
return version return version
raise exceptions.NotFound(self.invalid_version_message)
def reverse(self, viewname, args=None, kwargs=None, request=None, format=None, **extra): def reverse(self, viewname, args=None, kwargs=None, request=None, format=None, **extra):
if request.version is not None: if request.version is not None:
......
...@@ -296,8 +296,12 @@ class TestHyperlinkedRelatedField(URLPatternsTestCase): ...@@ -296,8 +296,12 @@ class TestHyperlinkedRelatedField(URLPatternsTestCase):
class TestNamespaceVersioningHyperlinkedRelatedFieldScheme(URLPatternsTestCase): class TestNamespaceVersioningHyperlinkedRelatedFieldScheme(URLPatternsTestCase):
nested = [
url(r'^namespaced/(?P<pk>\d+)/$', dummy_pk_view, name='nested'),
]
included = [ included = [
url(r'^namespaced/(?P<pk>\d+)/$', dummy_pk_view, name='namespaced'), url(r'^namespaced/(?P<pk>\d+)/$', dummy_pk_view, name='namespaced'),
url(r'^nested/', include(nested, namespace='nested-namespace'))
] ]
urlpatterns = [ urlpatterns = [
...@@ -325,6 +329,10 @@ class TestNamespaceVersioningHyperlinkedRelatedFieldScheme(URLPatternsTestCase): ...@@ -325,6 +329,10 @@ class TestNamespaceVersioningHyperlinkedRelatedFieldScheme(URLPatternsTestCase):
field = self._create_field('namespaced', 'v2') field = self._create_field('namespaced', 'v2')
assert field.to_representation(PKOnlyObject(5)) == 'http://testserver/v2/namespaced/5/' assert field.to_representation(PKOnlyObject(5)) == 'http://testserver/v2/namespaced/5/'
def test_api_url_is_properly_reversed_with_nested(self):
field = self._create_field('nested', 'v1:nested-namespace')
assert field.to_representation(PKOnlyObject(3)) == 'http://testserver/v1/nested/namespaced/3/'
def test_non_api_url_is_properly_reversed_regardless_of_the_version(self): def test_non_api_url_is_properly_reversed_regardless_of_the_version(self):
""" """
Regression test for #2711 Regression test for #2711
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment