diff options
Diffstat (limited to 'rest_framework')
| -rw-r--r-- | rest_framework/authtoken/models.py | 5 | ||||
| -rw-r--r-- | rest_framework/compat.py | 107 | ||||
| -rw-r--r-- | rest_framework/exceptions.py | 2 | ||||
| -rw-r--r-- | rest_framework/fields.py | 4 | ||||
| -rw-r--r-- | rest_framework/metadata.py | 7 | ||||
| -rw-r--r-- | rest_framework/parsers.py | 4 | ||||
| -rw-r--r-- | rest_framework/relations.py | 3 | ||||
| -rw-r--r-- | rest_framework/renderers.py | 6 | ||||
| -rw-r--r-- | rest_framework/request.py | 2 | ||||
| -rw-r--r-- | rest_framework/templatetags/rest_framework.py | 4 | ||||
| -rw-r--r-- | rest_framework/utils/encoders.py | 3 | ||||
| -rw-r--r-- | rest_framework/utils/mediatypes.py | 5 | ||||
| -rw-r--r-- | rest_framework/utils/representation.py | 2 | ||||
| -rw-r--r-- | rest_framework/views.py | 3 | 
14 files changed, 43 insertions, 114 deletions
| diff --git a/rest_framework/authtoken/models.py b/rest_framework/authtoken/models.py index db21d44c..a1a9315f 100644 --- a/rest_framework/authtoken/models.py +++ b/rest_framework/authtoken/models.py @@ -1,7 +1,9 @@  import binascii  import os +  from django.conf import settings  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. @@ -11,6 +13,7 @@ from django.db import models  AUTH_USER_MODEL = getattr(settings, 'AUTH_USER_MODEL', 'auth.User') +@python_2_unicode_compatible  class Token(models.Model):      """      The default authorization token model. @@ -35,5 +38,5 @@ class Token(models.Model):      def generate_key(self):          return binascii.hexlify(os.urandom(20)).decode() -    def __unicode__(self): +    def __str__(self):          return self.key diff --git a/rest_framework/compat.py b/rest_framework/compat.py index 5bd85e74..71520b92 100644 --- a/rest_framework/compat.py +++ b/rest_framework/compat.py @@ -6,24 +6,14 @@ versions of django/python, and compatibility wrappers around optional packages.  # flake8: noqa  from __future__ import unicode_literals +import inspect +  from django.core.exceptions import ImproperlyConfigured +from django.utils.encoding import force_text +from django.utils.six.moves.urllib import parse as urlparse  from django.conf import settings  from django.utils import six  import django -import inspect - - -# Handle django.utils.encoding rename in 1.5 onwards. -# smart_unicode -> smart_text -# force_unicode -> force_text -try: -    from django.utils.encoding import smart_text -except ImportError: -    from django.utils.encoding import smart_unicode as smart_text -try: -    from django.utils.encoding import force_text -except ImportError: -    from django.utils.encoding import force_unicode as force_text  # OrderedDict only available in Python 2.7. @@ -32,7 +22,7 @@ except ImportError:  # For Django <= 1.6 and Python 2.6 fall back to OrderedDict.  try:      from collections import OrderedDict -except: +except ImportError:      from django.utils.datastructures import SortedDict as OrderedDict @@ -49,7 +39,6 @@ try:  except ImportError:      django_filters = None -  if django.VERSION >= (1, 6):      def clean_manytomany_helptext(text):          return text @@ -72,30 +61,6 @@ if 'guardian' in settings.INSTALLED_APPS:          pass -# cStringIO only if it's available, otherwise StringIO -try: -    import cStringIO.StringIO as StringIO -except ImportError: -    StringIO = six.StringIO - -BytesIO = six.BytesIO - - -# urlparse compat import (Required because it changed in python 3.x) -try: -    from urllib import parse as urlparse -except ImportError: -    import urlparse - -# UserDict moves in Python 3 -try: -    from UserDict import UserDict -    from UserDict import DictMixin -except ImportError: -    from collections import UserDict -    from collections import MutableMapping as DictMixin - -  def get_model_name(model_cls):      try:          return model_cls._meta.model_name @@ -104,14 +69,6 @@ def get_model_name(model_cls):          return model_cls._meta.module_name -def get_concrete_model(model_cls): -    try: -        return model_cls._meta.concrete_model -    except AttributeError: -        # 1.3 does not include concrete model -        return model_cls - -  # View._allowed_methods only present from 1.5 onwards  if django.VERSION >= (1, 5):      from django.views.generic import View @@ -123,7 +80,6 @@ else:              return [m.upper() for m in self.http_method_names if hasattr(self, m)] -  # MinValueValidator, MaxValueValidator et al. only accept `message` in 1.8+  if django.VERSION >= (1, 8):      from django.core.validators import MinValueValidator, MaxValueValidator @@ -187,6 +143,7 @@ if 'patch' not in View.http_method_names:  # RequestFactory only provides `generic` from 1.5 onwards  from django.test.client import RequestFactory as DjangoRequestFactory  from django.test.client import FakePayload +  try:      # In 1.5 the test client uses force_bytes      from django.utils.encoding import force_bytes as force_bytes_or_smart_bytes @@ -194,26 +151,22 @@ except ImportError:      # In 1.4 the test client just uses smart_str      from django.utils.encoding import smart_str as force_bytes_or_smart_bytes +  class RequestFactory(DjangoRequestFactory):      def generic(self, method, path,              data='', content_type='application/octet-stream', **extra):          parsed = urlparse.urlparse(path)          data = force_bytes_or_smart_bytes(data, settings.DEFAULT_CHARSET)          r = { -            'PATH_INFO':      self._get_path(parsed), -            'QUERY_STRING':   force_text(parsed[4]), +            'PATH_INFO': self._get_path(parsed), +            'QUERY_STRING': force_text(parsed[4]),              'REQUEST_METHOD': six.text_type(method),          }          if data:              r.update({                  'CONTENT_LENGTH': len(data), -                'CONTENT_TYPE':   six.text_type(content_type), -                'wsgi.input':     FakePayload(data), -            }) -        elif django.VERSION <= (1, 4): -            # For 1.3 we need an empty WSGI payload -            r.update({ -                'wsgi.input': FakePayload('') +                'CONTENT_TYPE': six.text_type(content_type), +                'wsgi.input': FakePayload(data),              })          r.update(extra)          return self.request(**r) @@ -287,10 +240,12 @@ try:      import provider as oauth2_provider      from provider import scope as oauth2_provider_scope      from provider import constants as oauth2_constants +      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          # timezone aware datetimes          import datetime +          provider_now = datetime.datetime.now      else:          # Any other supported version does use timezone aware datetimes @@ -301,7 +256,7 @@ except ImportError:      oauth2_constants = 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  if six.PY3:      SHORT_SEPARATORS = (',', ':') @@ -309,37 +264,3 @@ if six.PY3:  else:      SHORT_SEPARATORS = (b',', b':')      LONG_SEPARATORS = (b', ', b': ') - - -# Handle lazy strings across Py2/Py3 -from django.utils.functional import Promise - -if six.PY3: -    def is_non_str_iterable(obj): -        if (isinstance(obj, str) or -            (isinstance(obj, Promise) and obj._delegate_text)): -            return False -        return hasattr(obj, '__iter__') -else: -    def is_non_str_iterable(obj): -        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 diff --git a/rest_framework/exceptions.py b/rest_framework/exceptions.py index 906de3b0..be41d08d 100644 --- a/rest_framework/exceptions.py +++ b/rest_framework/exceptions.py @@ -5,11 +5,11 @@ In addition Django's built in 403 and 404 exceptions are handled.  (`django.http.Http404` and `django.core.exceptions.PermissionDenied`)  """  from __future__ import unicode_literals +from django.utils.encoding import force_text  from django.utils.translation import ugettext_lazy as _  from django.utils.translation import ungettext_lazy  from rest_framework import status -from rest_framework.compat import force_text  import math diff --git a/rest_framework/fields.py b/rest_framework/fields.py index ca9c479f..37adbe16 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -5,11 +5,11 @@ from django.core.validators import RegexValidator  from django.forms import ImageField as DjangoImageField  from django.utils import six, timezone  from django.utils.dateparse import parse_date, parse_datetime, parse_time -from django.utils.encoding import is_protected_type +from django.utils.encoding import is_protected_type, smart_text  from django.utils.translation import ugettext_lazy as _  from rest_framework import ISO_8601  from rest_framework.compat import ( -    smart_text, EmailValidator, MinValueValidator, MaxValueValidator, +    EmailValidator, MinValueValidator, MaxValueValidator,      MinLengthValidator, MaxLengthValidator, URLValidator, OrderedDict  )  from rest_framework.exceptions import ValidationError diff --git a/rest_framework/metadata.py b/rest_framework/metadata.py index de829d00..3b058fab 100644 --- a/rest_framework/metadata.py +++ b/rest_framework/metadata.py @@ -1,17 +1,18 @@  """ -The metadata API is used to allow cusomization of how `OPTIONS` requests +The metadata API is used to allow customization of how `OPTIONS` requests  are handled. We currently provide a single default implementation that returns  some fairly ad-hoc information about the view. -Future implementations might use JSON schema or other definations in order +Future implementations might use JSON schema or other definitions in order  to return this information in a more standardized way.  """  from __future__ import unicode_literals  from django.core.exceptions import PermissionDenied  from django.http import Http404 +from django.utils.encoding import force_text  from rest_framework import exceptions, serializers -from rest_framework.compat import force_text, OrderedDict +from rest_framework.compat import OrderedDict  from rest_framework.request import clone_request  from rest_framework.utils.field_mapping import ClassLookupDict diff --git a/rest_framework/parsers.py b/rest_framework/parsers.py index d229abec..3e3395c0 100644 --- a/rest_framework/parsers.py +++ b/rest_framework/parsers.py @@ -12,7 +12,9 @@ from django.http import QueryDict  from django.http.multipartparser import MultiPartParser as DjangoMultiPartParser  from django.http.multipartparser import MultiPartParserError, parse_header, ChunkIter  from django.utils import six -from rest_framework.compat import etree, yaml, force_text, urlparse +from django.utils.six.moves.urllib import parse as urlparse +from django.utils.encoding import force_text +from rest_framework.compat import etree, yaml  from rest_framework.exceptions import ParseError  from rest_framework import renderers  import json diff --git a/rest_framework/relations.py b/rest_framework/relations.py index d1ea497a..d0cd3154 100644 --- a/rest_framework/relations.py +++ b/rest_framework/relations.py @@ -1,4 +1,4 @@ -from rest_framework.compat import smart_text, urlparse +from django.utils.encoding import smart_text  from rest_framework.fields import get_attribute, empty, Field  from rest_framework.reverse import reverse  from rest_framework.utils import html @@ -6,6 +6,7 @@ from django.core.exceptions import ObjectDoesNotExist, ImproperlyConfigured  from django.core.urlresolvers import resolve, get_script_prefix, NoReverseMatch, Resolver404  from django.db.models.query import QuerySet  from django.utils import six +from django.utils.six.moves.urllib import parse as urlparse  from django.utils.translation import ugettext_lazy as _ diff --git a/rest_framework/renderers.py b/rest_framework/renderers.py index 31d3ef5f..4ffd46e3 100644 --- a/rest_framework/renderers.py +++ b/rest_framework/renderers.py @@ -16,11 +16,11 @@ from django.http.multipartparser import parse_header  from django.template import Context, RequestContext, loader, Template  from django.test.client import encode_multipart  from django.utils import six +from django.utils.encoding import smart_text  from django.utils.xmlutils import SimplerXMLGenerator +from django.utils.six.moves import StringIO  from rest_framework import exceptions, serializers, status, VERSION -from rest_framework.compat import ( -    SHORT_SEPARATORS, LONG_SEPARATORS, StringIO, smart_text, yaml -) +from rest_framework.compat import SHORT_SEPARATORS, LONG_SEPARATORS, yaml  from rest_framework.exceptions import ParseError  from rest_framework.settings import api_settings  from rest_framework.request import is_form_media_type, override_method diff --git a/rest_framework/request.py b/rest_framework/request.py index d7e74674..20e049ed 100644 --- a/rest_framework/request.py +++ b/rest_framework/request.py @@ -14,9 +14,9 @@ from django.http import QueryDict  from django.http.multipartparser import parse_header  from django.utils.datastructures import MultiValueDict  from django.utils.datastructures import MergeDict as DjangoMergeDict +from django.utils.six import BytesIO  from rest_framework import HTTP_HEADER_ENCODING  from rest_framework import exceptions -from rest_framework.compat import BytesIO  from rest_framework.settings import api_settings  import warnings diff --git a/rest_framework/templatetags/rest_framework.py b/rest_framework/templatetags/rest_framework.py index f1825a24..69e03af4 100644 --- a/rest_framework/templatetags/rest_framework.py +++ b/rest_framework/templatetags/rest_framework.py @@ -3,11 +3,11 @@ from django import template  from django.core.urlresolvers import reverse, NoReverseMatch  from django.http import QueryDict  from django.utils import six -from django.utils.encoding import iri_to_uri +from django.utils.six.moves.urllib import parse as urlparse +from django.utils.encoding import iri_to_uri, force_text  from django.utils.html import escape  from django.utils.safestring import SafeData, mark_safe  from django.utils.html import smart_urlquote -from rest_framework.compat import urlparse, force_text  from rest_framework.renderers import HTMLFormRenderer  import re diff --git a/rest_framework/utils/encoders.py b/rest_framework/utils/encoders.py index 4d6bb3a3..adc83e57 100644 --- a/rest_framework/utils/encoders.py +++ b/rest_framework/utils/encoders.py @@ -4,8 +4,9 @@ Helper classes for parsers.  from __future__ import unicode_literals  from django.db.models.query import QuerySet  from django.utils import six, timezone +from django.utils.encoding import force_text  from django.utils.functional import Promise -from rest_framework.compat import force_text, OrderedDict +from rest_framework.compat import OrderedDict  import datetime  import decimal  import types diff --git a/rest_framework/utils/mediatypes.py b/rest_framework/utils/mediatypes.py index 87b3cc6a..de2931c2 100644 --- a/rest_framework/utils/mediatypes.py +++ b/rest_framework/utils/mediatypes.py @@ -5,6 +5,7 @@ See http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7  """  from __future__ import unicode_literals  from django.http.multipartparser import parse_header +from django.utils.encoding import python_2_unicode_compatible  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] +@python_2_unicode_compatible  class _MediaType(object):      def __init__(self, media_type_str):          if media_type_str is None: @@ -79,9 +81,6 @@ class _MediaType(object):          return 3      def __str__(self): -        return self.__unicode__().encode('utf-8') - -    def __unicode__(self):          ret = "%s/%s" % (self.main_type, self.sub_type)          for key, val in self.params.items():              ret += "; %s=%s" % (key, val) diff --git a/rest_framework/utils/representation.py b/rest_framework/utils/representation.py index 2a7c4675..3f17a8b9 100644 --- a/rest_framework/utils/representation.py +++ b/rest_framework/utils/representation.py @@ -3,8 +3,8 @@ Helper functions for creating user-friendly representations  of serializer classes and serializer fields.  """  from django.db import models +from django.utils.encoding import force_text  from django.utils.functional import Promise -from rest_framework.compat import force_text  import re diff --git a/rest_framework/views.py b/rest_framework/views.py index 292431c8..bc870417 100644 --- a/rest_framework/views.py +++ b/rest_framework/views.py @@ -5,9 +5,10 @@ from __future__ import unicode_literals  from django.core.exceptions import PermissionDenied  from django.http import Http404 +from django.utils.encoding import smart_text  from django.views.decorators.csrf import csrf_exempt  from rest_framework import status, exceptions -from rest_framework.compat import smart_text, HttpResponseBase, View +from rest_framework.compat import HttpResponseBase, View  from rest_framework.request import Request  from rest_framework.response import Response  from rest_framework.settings import api_settings | 
