mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-05-05 16:33:44 +03:00
Namespace versioning with nested namespaces (#4219)
Support nested namespaces with namespaced versioning.
This commit is contained in:
parent
ea92d50582
commit
bc3485ab7d
|
@ -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):
|
||||||
|
|
||||||
|
|
||||||
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):
|
||||||
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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user