aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework
diff options
context:
space:
mode:
authorJosé Padilla2015-02-04 23:34:20 -0400
committerJosé Padilla2015-02-04 23:34:20 -0400
commit720d154c832794e42e23c3ba2fe7b835d4baf386 (patch)
tree565ba041aa657c76b33aed5f829c8164e8922da9 /rest_framework
parent48fa77c09e2198c7877a724a46230caedcc7b529 (diff)
parentf98f842827c6e79bbaa196482e3c3c549e8999c8 (diff)
downloaddjango-rest-framework-720d154c832794e42e23c3ba2fe7b835d4baf386.tar.bz2
Merge remote-tracking branch 'upstream/version-3.1' into version-3.1
Diffstat (limited to 'rest_framework')
-rw-r--r--rest_framework/authentication.py7
-rw-r--r--rest_framework/relations.py19
-rw-r--r--rest_framework/reverse.py2
-rw-r--r--rest_framework/versioning.py5
4 files changed, 24 insertions, 9 deletions
diff --git a/rest_framework/authentication.py b/rest_framework/authentication.py
index 11db0585..a75cd30c 100644
--- a/rest_framework/authentication.py
+++ b/rest_framework/authentication.py
@@ -86,8 +86,13 @@ class BasicAuthentication(BaseAuthentication):
Authenticate the userid and password against username and password.
"""
user = authenticate(username=userid, password=password)
- if user is None or not user.is_active:
+
+ if user is None:
raise exceptions.AuthenticationFailed(_('Invalid username/password.'))
+
+ if not user.is_active:
+ raise exceptions.AuthenticationFailed(_('User inactive or deleted.'))
+
return (user, None)
def authenticate_header(self, request):
diff --git a/rest_framework/relations.py b/rest_framework/relations.py
index 66857a41..0b7c9d86 100644
--- a/rest_framework/relations.py
+++ b/rest_framework/relations.py
@@ -1,7 +1,7 @@
# coding: utf-8
from __future__ import unicode_literals
from django.core.exceptions import ObjectDoesNotExist, ImproperlyConfigured
-from django.core.urlresolvers import resolve, get_script_prefix, NoReverseMatch, Resolver404
+from django.core.urlresolvers import get_script_prefix, resolve, NoReverseMatch, Resolver404
from django.db.models.query import QuerySet
from django.utils import six
from django.utils.encoding import smart_text
@@ -167,11 +167,10 @@ class HyperlinkedRelatedField(RelatedField):
self.lookup_url_kwarg = kwargs.pop('lookup_url_kwarg', self.lookup_field)
self.format = kwargs.pop('format', None)
- # We include these simply for dependency injection in tests.
- # We can't add them as class attributes or they would expect an
+ # We include this simply for dependency injection in tests.
+ # We can't add it as a class attributes or it would expect an
# implicit `self` argument to be passed.
self.reverse = reverse
- self.resolve = resolve
super(HyperlinkedRelatedField, self).__init__(**kwargs)
@@ -205,6 +204,7 @@ class HyperlinkedRelatedField(RelatedField):
return self.reverse(view_name, kwargs=kwargs, request=request, format=format)
def to_internal_value(self, data):
+ request = self.context.get('request', None)
try:
http_prefix = data.startswith(('http:', 'https:'))
except AttributeError:
@@ -218,11 +218,18 @@ class HyperlinkedRelatedField(RelatedField):
data = '/' + data[len(prefix):]
try:
- match = self.resolve(data)
+ match = resolve(data)
except Resolver404:
self.fail('no_match')
- if match.view_name != self.view_name:
+ try:
+ expected_viewname = request.versioning_scheme.get_versioned_viewname(
+ self.view_name, request
+ )
+ except AttributeError:
+ expected_viewname = self.view_name
+
+ if match.view_name != expected_viewname:
self.fail('incorrect_match')
try:
diff --git a/rest_framework/reverse.py b/rest_framework/reverse.py
index 8fcca55b..a251d99d 100644
--- a/rest_framework/reverse.py
+++ b/rest_framework/reverse.py
@@ -1,5 +1,5 @@
"""
-Provide reverse functions that return fully qualified URLs
+Provide urlresolver functions that return fully qualified URLs or view names
"""
from __future__ import unicode_literals
from django.core.urlresolvers import reverse as django_reverse
diff --git a/rest_framework/versioning.py b/rest_framework/versioning.py
index a07b629f..51b886f3 100644
--- a/rest_framework/versioning.py
+++ b/rest_framework/versioning.py
@@ -122,11 +122,14 @@ class NamespaceVersioning(BaseVersioning):
def reverse(self, viewname, args=None, kwargs=None, request=None, format=None, **extra):
if request.version is not None:
- viewname = request.version + ':' + viewname
+ viewname = self.get_versioned_viewname(viewname, request)
return super(NamespaceVersioning, self).reverse(
viewname, args, kwargs, request, format, **extra
)
+ def get_versioned_viewname(self, viewname, request):
+ return request.version + ':' + viewname
+
class HostNameVersioning(BaseVersioning):
"""