Commit 09e59f26 by Tymur Maryokhin

Removed custom python_2_unicode_compatible. Closes #2183

parent f8fdfe5a
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 ...@@ -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): ...@@ -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. ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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: ...@@ -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 ...@@ -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 ...@@ -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): ...@@ -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): ...@@ -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 @@ ...@@ -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): ...@@ -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): ...@@ -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 ...@@ -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
......
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