mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-06-06 22:53:24 +03:00
Removed custom python_2_unicode_compatible. Closes #2183
This commit is contained in:
parent
f8fdfe5a93
commit
09e59f2686
|
@ -1,7 +1,9 @@
|
||||||
import binascii
|
import binascii
|
||||||
import os
|
import os
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
from django.utils.encoding import python_2_unicode_compatible
|
||||||
|
|
||||||
|
|
||||||
# Prior to Django 1.5, the AUTH_USER_MODEL setting does not exist.
|
# Prior to Django 1.5, the AUTH_USER_MODEL setting does not exist.
|
||||||
|
@ -11,6 +13,7 @@ from django.db import models
|
||||||
AUTH_USER_MODEL = getattr(settings, 'AUTH_USER_MODEL', 'auth.User')
|
AUTH_USER_MODEL = getattr(settings, 'AUTH_USER_MODEL', 'auth.User')
|
||||||
|
|
||||||
|
|
||||||
|
@python_2_unicode_compatible
|
||||||
class Token(models.Model):
|
class Token(models.Model):
|
||||||
"""
|
"""
|
||||||
The default authorization token model.
|
The default authorization token model.
|
||||||
|
@ -35,5 +38,5 @@ class Token(models.Model):
|
||||||
def generate_key(self):
|
def generate_key(self):
|
||||||
return binascii.hexlify(os.urandom(20)).decode()
|
return binascii.hexlify(os.urandom(20)).decode()
|
||||||
|
|
||||||
def __unicode__(self):
|
def __str__(self):
|
||||||
return self.key
|
return self.key
|
||||||
|
|
|
@ -6,11 +6,12 @@ versions of django/python, and compatibility wrappers around optional packages.
|
||||||
# flake8: noqa
|
# flake8: noqa
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
import inspect
|
||||||
|
|
||||||
from django.core.exceptions import ImproperlyConfigured
|
from django.core.exceptions import ImproperlyConfigured
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.utils import six
|
from django.utils import six
|
||||||
import django
|
import django
|
||||||
import inspect
|
|
||||||
|
|
||||||
|
|
||||||
# Handle django.utils.encoding rename in 1.5 onwards.
|
# Handle django.utils.encoding rename in 1.5 onwards.
|
||||||
|
@ -49,7 +50,6 @@ try:
|
||||||
except ImportError:
|
except ImportError:
|
||||||
django_filters = None
|
django_filters = None
|
||||||
|
|
||||||
|
|
||||||
if django.VERSION >= (1, 6):
|
if django.VERSION >= (1, 6):
|
||||||
def clean_manytomany_helptext(text):
|
def clean_manytomany_helptext(text):
|
||||||
return text
|
return text
|
||||||
|
@ -123,7 +123,6 @@ else:
|
||||||
return [m.upper() for m in self.http_method_names if hasattr(self, m)]
|
return [m.upper() for m in self.http_method_names if hasattr(self, m)]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# MinValueValidator, MaxValueValidator et al. only accept `message` in 1.8+
|
# MinValueValidator, MaxValueValidator et al. only accept `message` in 1.8+
|
||||||
if django.VERSION >= (1, 8):
|
if django.VERSION >= (1, 8):
|
||||||
from django.core.validators import MinValueValidator, MaxValueValidator
|
from django.core.validators import MinValueValidator, MaxValueValidator
|
||||||
|
@ -187,6 +186,7 @@ if 'patch' not in View.http_method_names:
|
||||||
# RequestFactory only provides `generic` from 1.5 onwards
|
# RequestFactory only provides `generic` from 1.5 onwards
|
||||||
from django.test.client import RequestFactory as DjangoRequestFactory
|
from django.test.client import RequestFactory as DjangoRequestFactory
|
||||||
from django.test.client import FakePayload
|
from django.test.client import FakePayload
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# In 1.5 the test client uses force_bytes
|
# In 1.5 the test client uses force_bytes
|
||||||
from django.utils.encoding import force_bytes as force_bytes_or_smart_bytes
|
from django.utils.encoding import force_bytes as force_bytes_or_smart_bytes
|
||||||
|
@ -194,21 +194,22 @@ except ImportError:
|
||||||
# In 1.4 the test client just uses smart_str
|
# In 1.4 the test client just uses smart_str
|
||||||
from django.utils.encoding import smart_str as force_bytes_or_smart_bytes
|
from django.utils.encoding import smart_str as force_bytes_or_smart_bytes
|
||||||
|
|
||||||
|
|
||||||
class RequestFactory(DjangoRequestFactory):
|
class RequestFactory(DjangoRequestFactory):
|
||||||
def generic(self, method, path,
|
def generic(self, method, path,
|
||||||
data='', content_type='application/octet-stream', **extra):
|
data='', content_type='application/octet-stream', **extra):
|
||||||
parsed = urlparse.urlparse(path)
|
parsed = urlparse.urlparse(path)
|
||||||
data = force_bytes_or_smart_bytes(data, settings.DEFAULT_CHARSET)
|
data = force_bytes_or_smart_bytes(data, settings.DEFAULT_CHARSET)
|
||||||
r = {
|
r = {
|
||||||
'PATH_INFO': self._get_path(parsed),
|
'PATH_INFO': self._get_path(parsed),
|
||||||
'QUERY_STRING': force_text(parsed[4]),
|
'QUERY_STRING': force_text(parsed[4]),
|
||||||
'REQUEST_METHOD': six.text_type(method),
|
'REQUEST_METHOD': six.text_type(method),
|
||||||
}
|
}
|
||||||
if data:
|
if data:
|
||||||
r.update({
|
r.update({
|
||||||
'CONTENT_LENGTH': len(data),
|
'CONTENT_LENGTH': len(data),
|
||||||
'CONTENT_TYPE': six.text_type(content_type),
|
'CONTENT_TYPE': six.text_type(content_type),
|
||||||
'wsgi.input': FakePayload(data),
|
'wsgi.input': FakePayload(data),
|
||||||
})
|
})
|
||||||
elif django.VERSION <= (1, 4):
|
elif django.VERSION <= (1, 4):
|
||||||
# For 1.3 we need an empty WSGI payload
|
# For 1.3 we need an empty WSGI payload
|
||||||
|
@ -287,10 +288,12 @@ try:
|
||||||
import provider as oauth2_provider
|
import provider as oauth2_provider
|
||||||
from provider import scope as oauth2_provider_scope
|
from provider import scope as oauth2_provider_scope
|
||||||
from provider import constants as oauth2_constants
|
from provider import constants as oauth2_constants
|
||||||
|
|
||||||
if oauth2_provider.__version__ in ('0.2.3', '0.2.4'):
|
if oauth2_provider.__version__ in ('0.2.3', '0.2.4'):
|
||||||
# 0.2.3 and 0.2.4 are supported version that do not support
|
# 0.2.3 and 0.2.4 are supported version that do not support
|
||||||
# timezone aware datetimes
|
# timezone aware datetimes
|
||||||
import datetime
|
import datetime
|
||||||
|
|
||||||
provider_now = datetime.datetime.now
|
provider_now = datetime.datetime.now
|
||||||
else:
|
else:
|
||||||
# Any other supported version does use timezone aware datetimes
|
# Any other supported version does use timezone aware datetimes
|
||||||
|
@ -301,7 +304,7 @@ except ImportError:
|
||||||
oauth2_constants = None
|
oauth2_constants = None
|
||||||
provider_now = None
|
provider_now = None
|
||||||
|
|
||||||
# `seperators` argument to `json.dumps()` differs between 2.x and 3.x
|
# `separators` argument to `json.dumps()` differs between 2.x and 3.x
|
||||||
# See: http://bugs.python.org/issue22767
|
# See: http://bugs.python.org/issue22767
|
||||||
if six.PY3:
|
if six.PY3:
|
||||||
SHORT_SEPARATORS = (',', ':')
|
SHORT_SEPARATORS = (',', ':')
|
||||||
|
@ -316,30 +319,9 @@ from django.utils.functional import Promise
|
||||||
|
|
||||||
if six.PY3:
|
if six.PY3:
|
||||||
def is_non_str_iterable(obj):
|
def is_non_str_iterable(obj):
|
||||||
if (isinstance(obj, str) or
|
if isinstance(obj, str) or (isinstance(obj, Promise) and obj._delegate_text):
|
||||||
(isinstance(obj, Promise) and obj._delegate_text)):
|
|
||||||
return False
|
return False
|
||||||
return hasattr(obj, '__iter__')
|
return hasattr(obj, '__iter__')
|
||||||
else:
|
else:
|
||||||
def is_non_str_iterable(obj):
|
def is_non_str_iterable(obj):
|
||||||
return hasattr(obj, '__iter__')
|
return hasattr(obj, '__iter__')
|
||||||
|
|
||||||
|
|
||||||
try:
|
|
||||||
from django.utils.encoding import python_2_unicode_compatible
|
|
||||||
except ImportError:
|
|
||||||
def python_2_unicode_compatible(klass):
|
|
||||||
"""
|
|
||||||
A decorator that defines __unicode__ and __str__ methods under Python 2.
|
|
||||||
Under Python 3 it does nothing.
|
|
||||||
|
|
||||||
To support Python 2 and 3 with a single code base, define a __str__ method
|
|
||||||
returning text and apply this decorator to the class.
|
|
||||||
"""
|
|
||||||
if '__str__' not in klass.__dict__:
|
|
||||||
raise ValueError("@python_2_unicode_compatible cannot be applied "
|
|
||||||
"to %s because it doesn't define __str__()." %
|
|
||||||
klass.__name__)
|
|
||||||
klass.__unicode__ = klass.__str__
|
|
||||||
klass.__str__ = lambda self: self.__unicode__().encode('utf-8')
|
|
||||||
return klass
|
|
||||||
|
|
|
@ -5,6 +5,7 @@ See http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7
|
||||||
"""
|
"""
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
from django.http.multipartparser import parse_header
|
from django.http.multipartparser import parse_header
|
||||||
|
from django.utils.encoding import python_2_unicode_compatible
|
||||||
from rest_framework import HTTP_HEADER_ENCODING
|
from rest_framework import HTTP_HEADER_ENCODING
|
||||||
|
|
||||||
|
|
||||||
|
@ -43,6 +44,7 @@ def order_by_precedence(media_type_lst):
|
||||||
return [media_types for media_types in ret if media_types]
|
return [media_types for media_types in ret if media_types]
|
||||||
|
|
||||||
|
|
||||||
|
@python_2_unicode_compatible
|
||||||
class _MediaType(object):
|
class _MediaType(object):
|
||||||
def __init__(self, media_type_str):
|
def __init__(self, media_type_str):
|
||||||
if media_type_str is None:
|
if media_type_str is None:
|
||||||
|
@ -79,9 +81,6 @@ class _MediaType(object):
|
||||||
return 3
|
return 3
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.__unicode__().encode('utf-8')
|
|
||||||
|
|
||||||
def __unicode__(self):
|
|
||||||
ret = "%s/%s" % (self.main_type, self.sub_type)
|
ret = "%s/%s" % (self.main_type, self.sub_type)
|
||||||
for key, val in self.params.items():
|
for key, val in self.params.items():
|
||||||
ret += "; %s=%s" % (key, val)
|
ret += "; %s=%s" % (key, val)
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
|
from django.utils.encoding import python_2_unicode_compatible
|
||||||
from rest_framework.compat import apply_markdown, smart_text
|
from rest_framework.compat import apply_markdown, smart_text
|
||||||
from rest_framework.views import APIView
|
from rest_framework.views import APIView
|
||||||
from .description import ViewWithNonASCIICharactersInDocstring
|
from .description import ViewWithNonASCIICharactersInDocstring
|
||||||
|
@ -107,6 +108,7 @@ class TestViewNamesAndDescriptions(TestCase):
|
||||||
"""
|
"""
|
||||||
# use a mock object instead of gettext_lazy to ensure that we can't end
|
# use a mock object instead of gettext_lazy to ensure that we can't end
|
||||||
# up with a test case string in our l10n catalog
|
# up with a test case string in our l10n catalog
|
||||||
|
@python_2_unicode_compatible
|
||||||
class MockLazyStr(object):
|
class MockLazyStr(object):
|
||||||
def __init__(self, string):
|
def __init__(self, string):
|
||||||
self.s = string
|
self.s = string
|
||||||
|
@ -114,9 +116,6 @@ class TestViewNamesAndDescriptions(TestCase):
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.s
|
return self.s
|
||||||
|
|
||||||
def __unicode__(self):
|
|
||||||
return self.s
|
|
||||||
|
|
||||||
class MockView(APIView):
|
class MockView(APIView):
|
||||||
__doc__ = MockLazyStr("a gettext string")
|
__doc__ = MockLazyStr("a gettext string")
|
||||||
|
|
||||||
|
|
|
@ -3,8 +3,8 @@ from django.contrib.contenttypes.models import ContentType
|
||||||
from django.contrib.contenttypes.generic import GenericRelation, GenericForeignKey
|
from django.contrib.contenttypes.generic import GenericRelation, GenericForeignKey
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
|
from django.utils.encoding import python_2_unicode_compatible
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from rest_framework.compat import python_2_unicode_compatible
|
|
||||||
|
|
||||||
|
|
||||||
@python_2_unicode_compatible
|
@python_2_unicode_compatible
|
||||||
|
|
Loading…
Reference in New Issue
Block a user