diff options
| author | Tom Christie | 2014-12-16 16:14:08 +0000 | 
|---|---|---|
| committer | Tom Christie | 2014-12-16 16:14:08 +0000 | 
| commit | 4e91ec61339838426e246e20ef062c963a78c4e1 (patch) | |
| tree | 9ab9de7b2c14d0da60efe0e9dbc6f359d07e4516 /rest_framework/versioning.py | |
| parent | 7cfa0e0306456d4058f9d86f62a1b8f00e83dc41 (diff) | |
| download | django-rest-framework-4e91ec61339838426e246e20ef062c963a78c4e1.tar.bz2 | |
Added NamespaceVersioning
Diffstat (limited to 'rest_framework/versioning.py')
| -rw-r--r-- | rest_framework/versioning.py | 31 | 
1 files changed, 29 insertions, 2 deletions
| diff --git a/rest_framework/versioning.py b/rest_framework/versioning.py index 2ca8efff..42df8b2c 100644 --- a/rest_framework/versioning.py +++ b/rest_framework/versioning.py @@ -1,6 +1,7 @@  # coding: utf-8  from __future__ import unicode_literals  from rest_framework.reverse import _reverse +from rest_framework.templatetags.rest_framework import replace_query_param  from rest_framework.utils.mediatypes import _MediaType  import re @@ -30,7 +31,7 @@ class QueryParameterVersioning(BaseVersioning):      def reverse(self, viewname, args=None, kwargs=None, request=None, format=None, **extra):          url = super(QueryParameterVersioning, self).reverse( -            viewname, args, kwargs, request, format, **kwargs +            viewname, args, kwargs, request, format, **extra          )          if request.version is not None:              return replace_query_param(url, self.version_param, request.version) @@ -92,5 +93,31 @@ class URLPathVersioning(BaseVersioning):              kwargs[self.version_param] = request.version          return super(URLPathVersioning, self).reverse( -            viewname, args, kwargs, request, format, **kwargs +            viewname, args, kwargs, request, format, **extra +        ) + + +class NamespaceVersioning(BaseVersioning): +    """ +    To the client this is the same style as `URLPathVersioning`. +    The difference is in the backend - this implementation uses +    Django's URL namespaces to determine the version. + +    GET /1.0/something/ HTTP/1.1 +    Host: example.com +    Accept: application/json +    """ +    default_version = None + +    def determine_version(self, request, *args, **kwargs): +        resolver_match = getattr(request, 'resolver_match', None) +        if (resolver_match is None or not resolver_match.namespace): +            return self.default_version +        return resolver_match.namespace + +    def reverse(self, viewname, args=None, kwargs=None, request=None, format=None, **extra): +        if request.version is not None: +            viewname = request.version + ':' + viewname +        return super(NamespaceVersioning, self).reverse( +            viewname, args, kwargs, request, format, **extra          ) | 
