aboutsummaryrefslogtreecommitdiffstats
path: root/rest_framework
diff options
context:
space:
mode:
Diffstat (limited to 'rest_framework')
-rw-r--r--rest_framework/authentication.py3
-rw-r--r--rest_framework/decorators.py4
-rw-r--r--rest_framework/exceptions.py1
-rw-r--r--rest_framework/filters.py1
-rw-r--r--rest_framework/generics.py2
-rw-r--r--rest_framework/negotiation.py1
-rw-r--r--rest_framework/pagination.py1
-rw-r--r--rest_framework/parsers.py2
-rw-r--r--rest_framework/permissions.py2
-rw-r--r--rest_framework/relations.py2
-rw-r--r--rest_framework/request.py2
-rw-r--r--rest_framework/response.py2
-rw-r--r--rest_framework/reverse.py1
-rw-r--r--rest_framework/serializers.py1
-rw-r--r--rest_framework/settings.py1
-rw-r--r--rest_framework/status.py1
-rw-r--r--rest_framework/templatetags/rest_framework.py2
-rw-r--r--rest_framework/tests/authentication.py2
-rw-r--r--rest_framework/tests/breadcrumbs.py1
-rw-r--r--rest_framework/tests/decorators.py1
-rw-r--r--rest_framework/tests/description.py1
-rw-r--r--rest_framework/tests/fields.py2
-rw-r--r--rest_framework/tests/files.py5
-rw-r--r--rest_framework/tests/filterset.py1
-rw-r--r--rest_framework/tests/genericrelations.py1
-rw-r--r--rest_framework/tests/htmlrenderer.py1
-rw-r--r--rest_framework/tests/hyperlinkedserializers.py1
-rw-r--r--rest_framework/tests/models.py31
-rw-r--r--rest_framework/tests/modelviews.py90
-rw-r--r--rest_framework/tests/negotiation.py1
-rw-r--r--rest_framework/tests/pagination.py1
-rw-r--r--rest_framework/tests/parsers.py134
-rw-r--r--rest_framework/tests/relations.py2
-rw-r--r--rest_framework/tests/relations_hyperlink.py1
-rw-r--r--rest_framework/tests/relations_pk.py2
-rw-r--r--rest_framework/tests/request.py3
-rw-r--r--rest_framework/tests/response.py1
-rw-r--r--rest_framework/tests/reverse.py1
-rw-r--r--rest_framework/tests/serializer.py5
-rw-r--r--rest_framework/tests/settings.py1
-rw-r--r--rest_framework/tests/status.py1
-rw-r--r--rest_framework/tests/testcases.py1
-rw-r--r--rest_framework/tests/tests.py1
-rw-r--r--rest_framework/tests/throttling.py3
-rw-r--r--rest_framework/tests/urlpatterns.py4
-rw-r--r--rest_framework/tests/utils.py1
-rw-r--r--rest_framework/tests/views.py3
-rw-r--r--rest_framework/throttling.py3
-rw-r--r--rest_framework/urlpatterns.py3
-rw-r--r--rest_framework/urls.py1
-rw-r--r--rest_framework/utils/__init__.py1
-rw-r--r--rest_framework/utils/breadcrumbs.py1
-rw-r--r--rest_framework/utils/encoders.py7
-rw-r--r--rest_framework/utils/mediatypes.py2
-rw-r--r--rest_framework/views.py4
55 files changed, 58 insertions, 296 deletions
diff --git a/rest_framework/authentication.py b/rest_framework/authentication.py
index c15568db..14b2136b 100644
--- a/rest_framework/authentication.py
+++ b/rest_framework/authentication.py
@@ -2,14 +2,11 @@
Provides a set of pluggable authentication policies.
"""
from __future__ import unicode_literals
-
from django.contrib.auth import authenticate
from django.utils.encoding import DjangoUnicodeDecodeError
from rest_framework import exceptions, HTTP_HEADER_ENCODING
from rest_framework.compat import CsrfViewMiddleware
-from rest_framework.compat import smart_text
from rest_framework.authtoken.models import Token
-from rest_framework.settings import api_settings
import base64
diff --git a/rest_framework/decorators.py b/rest_framework/decorators.py
index 7a4103e1..8250cd3b 100644
--- a/rest_framework/decorators.py
+++ b/rest_framework/decorators.py
@@ -1,3 +1,5 @@
+from __future__ import unicode_literals
+from rest_framework.compat import six
from rest_framework.views import APIView
import types
@@ -12,7 +14,7 @@ def api_view(http_method_names):
def decorator(func):
WrappedAPIView = type(
- 'WrappedAPIView',
+ six.PY3 and 'WrappedAPIView' or b'WrappedAPIView',
(APIView,),
{'__doc__': func.__doc__}
)
diff --git a/rest_framework/exceptions.py b/rest_framework/exceptions.py
index d635351c..0c96ecdd 100644
--- a/rest_framework/exceptions.py
+++ b/rest_framework/exceptions.py
@@ -4,6 +4,7 @@ Handled exceptions raised by REST framework.
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 rest_framework import status
diff --git a/rest_framework/filters.py b/rest_framework/filters.py
index f7b5a1bc..6fea46fa 100644
--- a/rest_framework/filters.py
+++ b/rest_framework/filters.py
@@ -1,3 +1,4 @@
+from __future__ import unicode_literals
from rest_framework.compat import django_filters
FilterSet = django_filters and django_filters.FilterSet or None
diff --git a/rest_framework/generics.py b/rest_framework/generics.py
index 19f2b704..9e931917 100644
--- a/rest_framework/generics.py
+++ b/rest_framework/generics.py
@@ -1,7 +1,7 @@
"""
Generic views that provide commonly needed behaviour.
"""
-
+from __future__ import unicode_literals
from rest_framework import views, mixins
from rest_framework.settings import api_settings
from django.views.generic.detail import SingleObjectMixin
diff --git a/rest_framework/negotiation.py b/rest_framework/negotiation.py
index 0a7b6db6..0694d35f 100644
--- a/rest_framework/negotiation.py
+++ b/rest_framework/negotiation.py
@@ -1,3 +1,4 @@
+from __future__ import unicode_literals
from django.http import Http404
from rest_framework import exceptions
from rest_framework.settings import api_settings
diff --git a/rest_framework/pagination.py b/rest_framework/pagination.py
index 92d41e0e..03a7a30f 100644
--- a/rest_framework/pagination.py
+++ b/rest_framework/pagination.py
@@ -1,3 +1,4 @@
+from __future__ import unicode_literals
from rest_framework import serializers
from rest_framework.templatetags.rest_framework import replace_query_param
diff --git a/rest_framework/parsers.py b/rest_framework/parsers.py
index b601156b..26009cdf 100644
--- a/rest_framework/parsers.py
+++ b/rest_framework/parsers.py
@@ -4,7 +4,7 @@ Parsers are used to parse the content of incoming HTTP requests.
They give us a generic way of being able to handle various media types
on the request, such as form content or json encoded data.
"""
-
+from __future__ import unicode_literals
from django.http import QueryDict
from django.http.multipartparser import MultiPartParser as DjangoMultiPartParser
from django.http.multipartparser import MultiPartParserError
diff --git a/rest_framework/permissions.py b/rest_framework/permissions.py
index 655b78a3..3222dbf2 100644
--- a/rest_framework/permissions.py
+++ b/rest_framework/permissions.py
@@ -1,7 +1,7 @@
"""
Provides a set of pluggable permission policies.
"""
-
+from __future__ import unicode_literals
SAFE_METHODS = ['GET', 'HEAD', 'OPTIONS']
diff --git a/rest_framework/relations.py b/rest_framework/relations.py
index a946d961..ae4ef6b3 100644
--- a/rest_framework/relations.py
+++ b/rest_framework/relations.py
@@ -1,6 +1,4 @@
-
from __future__ import unicode_literals
-
from django.core.exceptions import ObjectDoesNotExist, ValidationError
from django.core.urlresolvers import resolve, get_script_prefix
from django import forms
diff --git a/rest_framework/request.py b/rest_framework/request.py
index 597892ef..16f47d16 100644
--- a/rest_framework/request.py
+++ b/rest_framework/request.py
@@ -9,7 +9,7 @@ The wrapped request then offers a richer API, in particular :
- full support of PUT method, including support for file uploads
- form overloading of HTTP method, content type and content
"""
-
+from __future__ import unicode_literals
from django.http.multipartparser import parse_header
from rest_framework import HTTP_HEADER_ENCODING
from rest_framework import exceptions
diff --git a/rest_framework/response.py b/rest_framework/response.py
index 0a484c4a..5e1bf46e 100644
--- a/rest_framework/response.py
+++ b/rest_framework/response.py
@@ -1,6 +1,6 @@
+from __future__ import unicode_literals
from django.core.handlers.wsgi import STATUS_CODE_TEXT
from django.template.response import SimpleTemplateResponse
-
from rest_framework.compat import six
diff --git a/rest_framework/reverse.py b/rest_framework/reverse.py
index c9db02f0..a51b07f5 100644
--- a/rest_framework/reverse.py
+++ b/rest_framework/reverse.py
@@ -1,6 +1,7 @@
"""
Provide reverse functions that return fully qualified URLs
"""
+from __future__ import unicode_literals
from django.core.urlresolvers import reverse as django_reverse
from django.utils.functional import lazy
diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py
index c5b3494c..b635d20d 100644
--- a/rest_framework/serializers.py
+++ b/rest_framework/serializers.py
@@ -1,3 +1,4 @@
+from __future__ import unicode_literals
import copy
import datetime
import types
diff --git a/rest_framework/settings.py b/rest_framework/settings.py
index b3ca0134..b7aa0bbe 100644
--- a/rest_framework/settings.py
+++ b/rest_framework/settings.py
@@ -17,6 +17,7 @@ This module provides the `api_setting` object, that is used to access
REST framework settings, checking for user settings first, then falling
back to the defaults.
"""
+from __future__ import unicode_literals
from django.conf import settings
from django.utils import importlib
from rest_framework.compat import six
diff --git a/rest_framework/status.py b/rest_framework/status.py
index a1eb48da..b9f249f9 100644
--- a/rest_framework/status.py
+++ b/rest_framework/status.py
@@ -4,6 +4,7 @@ Descriptive HTTP status codes, for code readability.
See RFC 2616 - http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
And RFC 6585 - http://tools.ietf.org/html/rfc6585
"""
+from __future__ import unicode_literals
HTTP_100_CONTINUE = 100
HTTP_101_SWITCHING_PROTOCOLS = 101
diff --git a/rest_framework/templatetags/rest_framework.py b/rest_framework/templatetags/rest_framework.py
index cbafbe0e..a1db65bc 100644
--- a/rest_framework/templatetags/rest_framework.py
+++ b/rest_framework/templatetags/rest_framework.py
@@ -1,5 +1,4 @@
from __future__ import unicode_literals, absolute_import
-
from django import template
from django.core.urlresolvers import reverse
from django.http import QueryDict
@@ -8,7 +7,6 @@ from django.utils.safestring import SafeData, mark_safe
from rest_framework.compat import urlparse
from rest_framework.compat import force_text
from rest_framework.compat import six
-
import re
import string
diff --git a/rest_framework/tests/authentication.py b/rest_framework/tests/authentication.py
index 7dde6d22..c9df1733 100644
--- a/rest_framework/tests/authentication.py
+++ b/rest_framework/tests/authentication.py
@@ -1,5 +1,4 @@
from __future__ import unicode_literals
-
from django.contrib.auth.models import User
from django.http import HttpResponse
from django.test import Client, TestCase
@@ -9,7 +8,6 @@ from rest_framework.authtoken.models import Token
from rest_framework.authentication import TokenAuthentication, BasicAuthentication, SessionAuthentication
from rest_framework.compat import patterns
from rest_framework.views import APIView
-
import json
import base64
diff --git a/rest_framework/tests/breadcrumbs.py b/rest_framework/tests/breadcrumbs.py
index df891683..d9ed647e 100644
--- a/rest_framework/tests/breadcrumbs.py
+++ b/rest_framework/tests/breadcrumbs.py
@@ -1,3 +1,4 @@
+from __future__ import unicode_literals
from django.test import TestCase
from rest_framework.compat import patterns, url
from rest_framework.utils.breadcrumbs import get_breadcrumbs
diff --git a/rest_framework/tests/decorators.py b/rest_framework/tests/decorators.py
index 82f912e9..a11af3a5 100644
--- a/rest_framework/tests/decorators.py
+++ b/rest_framework/tests/decorators.py
@@ -1,3 +1,4 @@
+from __future__ import unicode_literals
from django.test import TestCase
from rest_framework import status
from rest_framework.response import Response
diff --git a/rest_framework/tests/description.py b/rest_framework/tests/description.py
index d958b840..20963a9c 100644
--- a/rest_framework/tests/description.py
+++ b/rest_framework/tests/description.py
@@ -1,3 +1,4 @@
+from __future__ import unicode_literals
from django.test import TestCase
from rest_framework.views import APIView
from rest_framework.compat import apply_markdown
diff --git a/rest_framework/tests/fields.py b/rest_framework/tests/fields.py
index 8068272d..b7587bf1 100644
--- a/rest_framework/tests/fields.py
+++ b/rest_framework/tests/fields.py
@@ -1,7 +1,7 @@
"""
General serializer field tests.
"""
-
+from __future__ import unicode_literals
from django.db import models
from django.test import TestCase
from rest_framework import serializers
diff --git a/rest_framework/tests/files.py b/rest_framework/tests/files.py
index 0434f900..ce00ea6b 100644
--- a/rest_framework/tests/files.py
+++ b/rest_framework/tests/files.py
@@ -1,10 +1,9 @@
-import datetime
-
+from __future__ import unicode_literals
from django.test import TestCase
-
from rest_framework import serializers
from rest_framework.compat import BytesIO
from rest_framework.compat import six
+import datetime
class UploadedFile(object):
diff --git a/rest_framework/tests/filterset.py b/rest_framework/tests/filterset.py
index af2e6c2e..daea6e53 100644
--- a/rest_framework/tests/filterset.py
+++ b/rest_framework/tests/filterset.py
@@ -1,3 +1,4 @@
+from __future__ import unicode_literals
import datetime
from decimal import Decimal
from django.test import TestCase
diff --git a/rest_framework/tests/genericrelations.py b/rest_framework/tests/genericrelations.py
index 91a98604..88d4efa3 100644
--- a/rest_framework/tests/genericrelations.py
+++ b/rest_framework/tests/genericrelations.py
@@ -1,5 +1,4 @@
from __future__ import unicode_literals
-
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.generic import GenericRelation, GenericForeignKey
from django.db import models
diff --git a/rest_framework/tests/htmlrenderer.py b/rest_framework/tests/htmlrenderer.py
index 34caa208..702e8024 100644
--- a/rest_framework/tests/htmlrenderer.py
+++ b/rest_framework/tests/htmlrenderer.py
@@ -1,3 +1,4 @@
+from __future__ import unicode_literals
from django.core.exceptions import PermissionDenied
from django.http import Http404
from django.test import TestCase
diff --git a/rest_framework/tests/hyperlinkedserializers.py b/rest_framework/tests/hyperlinkedserializers.py
index c6a8224b..bc9b8769 100644
--- a/rest_framework/tests/hyperlinkedserializers.py
+++ b/rest_framework/tests/hyperlinkedserializers.py
@@ -1,3 +1,4 @@
+from __future__ import unicode_literals
import json
from django.test import TestCase
from django.test.client import RequestFactory
diff --git a/rest_framework/tests/models.py b/rest_framework/tests/models.py
index 9ab15328..f2117538 100644
--- a/rest_framework/tests/models.py
+++ b/rest_framework/tests/models.py
@@ -1,35 +1,6 @@
+from __future__ import unicode_literals
from django.db import models
-from django.contrib.contenttypes.models import ContentType
-from django.contrib.contenttypes.generic import GenericForeignKey, GenericRelation
-# from django.contrib.auth.models import Group
-
-
-# class CustomUser(models.Model):
-# """
-# A custom user model, which uses a 'through' table for the foreign key
-# """
-# username = models.CharField(max_length=255, unique=True)
-# groups = models.ManyToManyField(
-# to=Group, blank=True, null=True, through='UserGroupMap'
-# )
-
-# @models.permalink
-# def get_absolute_url(self):
-# return ('custom_user', (), {
-# 'pk': self.id
-# })
-
-
-# class UserGroupMap(models.Model):
-# user = models.ForeignKey(to=CustomUser)
-# group = models.ForeignKey(to=Group)
-
-# @models.permalink
-# def get_absolute_url(self):
-# return ('user_group_map', (), {
-# 'pk': self.id
-# })
def foobar():
return 'foobar'
diff --git a/rest_framework/tests/modelviews.py b/rest_framework/tests/modelviews.py
deleted file mode 100644
index f12e3b97..00000000
--- a/rest_framework/tests/modelviews.py
+++ /dev/null
@@ -1,90 +0,0 @@
-# from rest_framework.compat import patterns, url
-# from django.forms import ModelForm
-# from django.contrib.auth.models import Group, User
-# from rest_framework.resources import ModelResource
-# from rest_framework.views import ListOrCreateModelView, InstanceModelView
-# from rest_framework.tests.models import CustomUser
-# from rest_framework.tests.testcases import TestModelsTestCase
-
-
-# class GroupResource(ModelResource):
-# model = Group
-
-
-# class UserForm(ModelForm):
-# class Meta:
-# model = User
-# exclude = ('last_login', 'date_joined')
-
-
-# class UserResource(ModelResource):
-# model = User
-# form = UserForm
-
-
-# class CustomUserResource(ModelResource):
-# model = CustomUser
-
-# urlpatterns = patterns('',
-# url(r'^users/$', ListOrCreateModelView.as_view(resource=UserResource), name='users'),
-# url(r'^users/(?P<id>[0-9]+)/$', InstanceModelView.as_view(resource=UserResource)),
-# url(r'^customusers/$', ListOrCreateModelView.as_view(resource=CustomUserResource), name='customusers'),
-# url(r'^customusers/(?P<id>[0-9]+)/$', InstanceModelView.as_view(resource=CustomUserResource)),
-# url(r'^groups/$', ListOrCreateModelView.as_view(resource=GroupResource), name='groups'),
-# url(r'^groups/(?P<id>[0-9]+)/$', InstanceModelView.as_view(resource=GroupResource)),
-# )
-
-
-# class ModelViewTests(TestModelsTestCase):
-# """Test the model views rest_framework provides"""
-# urls = 'rest_framework.tests.modelviews'
-
-# def test_creation(self):
-# """Ensure that a model object can be created"""
-# self.assertEqual(0, Group.objects.count())
-
-# response = self.client.post('/groups/', {'name': 'foo'})
-
-# self.assertEqual(response.status_code, 201)
-# self.assertEqual(1, Group.objects.count())
-# self.assertEqual('foo', Group.objects.all()[0].name)
-
-# def test_creation_with_m2m_relation(self):
-# """Ensure that a model object with a m2m relation can be created"""
-# group = Group(name='foo')
-# group.save()
-# self.assertEqual(0, User.objects.count())
-
-# response = self.client.post('/users/', {'username': 'bar', 'password': 'baz', 'groups': [group.id]})
-
-# self.assertEqual(response.status_code, 201)
-# self.assertEqual(1, User.objects.count())
-
-# user = User.objects.all()[0]
-# self.assertEqual('bar', user.username)
-# self.assertEqual('baz', user.password)
-# self.assertEqual(1, user.groups.count())
-
-# group = user.groups.all()[0]
-# self.assertEqual('foo', group.name)
-
-# def test_creation_with_m2m_relation_through(self):
-# """
-# Ensure that a model object with a m2m relation can be created where that
-# relation uses a through table
-# """
-# group = Group(name='foo')
-# group.save()
-# self.assertEqual(0, User.objects.count())
-
-# response = self.client.post('/customusers/', {'username': 'bar', 'groups': [group.id]})
-
-# self.assertEqual(response.status_code, 201)
-# self.assertEqual(1, CustomUser.objects.count())
-
-# user = CustomUser.objects.all()[0]
-# self.assertEqual('bar', user.username)
-# self.assertEqual(1, user.groups.count())
-
-# group = user.groups.all()[0]
-# self.assertEqual('foo', group.name)
diff --git a/rest_framework/tests/negotiation.py b/rest_framework/tests/negotiation.py
index 7706908b..5769dd5f 100644
--- a/rest_framework/tests/negotiation.py
+++ b/rest_framework/tests/negotiation.py
@@ -1,3 +1,4 @@
+from __future__ import unicode_literals
from django.test import TestCase
from django.test.client import RequestFactory
from rest_framework.negotiation import DefaultContentNegotiation
diff --git a/rest_framework/tests/pagination.py b/rest_framework/tests/pagination.py
index 697dfb5b..b85ce144 100644
--- a/rest_framework/tests/pagination.py
+++ b/rest_framework/tests/pagination.py
@@ -1,3 +1,4 @@
+from __future__ import unicode_literals
import datetime
from decimal import Decimal
from django.core.paginator import Paginator
diff --git a/rest_framework/tests/parsers.py b/rest_framework/tests/parsers.py
index ffa39b1f..c03df08f 100644
--- a/rest_framework/tests/parsers.py
+++ b/rest_framework/tests/parsers.py
@@ -1,136 +1,4 @@
-# """
-# ..
-# >>> from rest_framework.parsers import FormParser
-# >>> from django.test.client import RequestFactory
-# >>> from rest_framework.views import View
-# >>> from StringIO import StringIO
-# >>> from urllib import urlencode
-# >>> req = RequestFactory().get('/')
-# >>> some_view = View()
-# >>> some_view.request = req # Make as if this request had been dispatched
-#
-# FormParser
-# ============
-#
-# Data flatening
-# ----------------
-#
-# Here is some example data, which would eventually be sent along with a post request :
-#
-# >>> inpt = urlencode([
-# ... ('key1', 'bla1'),
-# ... ('key2', 'blo1'), ('key2', 'blo2'),
-# ... ])
-#
-# Default behaviour for :class:`parsers.FormParser`, is to return a single value for each parameter :
-#
-# >>> (data, files) = FormParser(some_view).parse(StringIO(inpt))
-# >>> data == {'key1': 'bla1', 'key2': 'blo1'}
-# True
-#
-# However, you can customize this behaviour by subclassing :class:`parsers.FormParser`, and overriding :meth:`parsers.FormParser.is_a_list` :
-#
-# >>> class MyFormParser(FormParser):
-# ...
-# ... def is_a_list(self, key, val_list):
-# ... return len(val_list) > 1
-#
-# This new parser only flattens the lists of parameters that contain a single value.
-#
-# >>> (data, files) = MyFormParser(some_view).parse(StringIO(inpt))
-# >>> data == {'key1': 'bla1', 'key2': ['blo1', 'blo2']}
-# True
-#
-# .. note:: The same functionality is available for :class:`parsers.MultiPartParser`.
-#
-# Submitting an empty list
-# --------------------------
-#
-# When submitting an empty select multiple, like this one ::
-#
-# <select multiple="multiple" name="key2"></select>
-#
-# The browsers usually strip the parameter completely. A hack to avoid this, and therefore being able to submit an empty select multiple, is to submit a value that tells the server that the list is empty ::
-#
-# <select multiple="multiple" name="key2"><option value="_empty"></select>
-#
-# :class:`parsers.FormParser` provides the server-side implementation for this hack. Considering the following posted data :
-#
-# >>> inpt = urlencode([
-# ... ('key1', 'blo1'), ('key1', '_empty'),
-# ... ('key2', '_empty'),
-# ... ])
-#
-# :class:`parsers.FormParser` strips the values ``_empty`` from all the lists.
-#
-# >>> (data, files) = MyFormParser(some_view).parse(StringIO(inpt))
-# >>> data == {'key1': 'blo1'}
-# True
-#
-# Oh ... but wait a second, the parameter ``key2`` isn't even supposed to be a list, so the parser just stripped it.
-#
-# >>> class MyFormParser(FormParser):
-# ...
-# ... def is_a_list(self, key, val_list):
-# ... return key == 'key2'
-# ...
-# >>> (data, files) = MyFormParser(some_view).parse(StringIO(inpt))
-# >>> data == {'key1': 'blo1', 'key2': []}
-# True
-#
-# Better like that. Note that you can configure something else than ``_empty`` for the empty value by setting :attr:`parsers.FormParser.EMPTY_VALUE`.
-# """
-# import httplib, mimetypes
-# from tempfile import TemporaryFile
-# from django.test import TestCase
-# from django.test.client import RequestFactory
-# from rest_framework.parsers import MultiPartParser
-# from rest_framework.views import View
-# from StringIO import StringIO
-#
-# def encode_multipart_formdata(fields, files):
-# """For testing multipart parser.
-# fields is a sequence of (name, value) elements for regular form fields.
-# files is a sequence of (name, filename, value) elements for data to be uploaded as files
-# Return (content_type, body)."""
-# BOUNDARY = '----------ThIs_Is_tHe_bouNdaRY_$'
-# CRLF = '\r\n'
-# L = []
-# for (key, value) in fields:
-# L.append('--' + BOUNDARY)
-# L.append('Content-Disposition: form-data; name="%s"' % key)
-# L.append('')
-# L.append(value)
-# for (key, filename, value) in files:
-# L.append('--' + BOUNDARY)
-# L.append('Content-Disposition: form-data; name="%s"; filename="%s"' % (key, filename))
-# L.append('Content-Type: %s' % get_content_type(filename))
-# L.append('')
-# L.append(value)
-# L.append('--' + BOUNDARY + '--')
-# L.append('')
-# body = CRLF.join(L)
-# content_type = 'multipart/form-data; boundary=%s' % BOUNDARY
-# return content_type, body
-#
-# def get_content_type(filename):
-# return mimetypes.guess_type(filename)[0] or 'application/octet-stream'
-#
-#class TestMultiPartParser(TestCase):
-# def setUp(self):
-# self.req = RequestFactory()
-# self.content_type, self.body = encode_multipart_formdata([('key1', 'val1'), ('key1', 'val2')],
-# [('file1', 'pic.jpg', 'blablabla'), ('file1', 't.txt', 'blobloblo')])
-#
-# def test_multipartparser(self):
-# """Ensure that MultiPartParser can parse multipart/form-data that contains a mix of several files and parameters."""
-# post_req = RequestFactory().post('/', self.body, content_type=self.content_type)
-# view = View()
-# view.request = post_req
-# (data, files) = MultiPartParser(view).parse(StringIO(self.body))
-# self.assertEqual(data['key1'], 'val1')
-# self.assertEqual(files['file1'].read(), 'blablabla')
-
+from __future__ import unicode_literals
from rest_framework.compat import StringIO
from django import forms
from django.test import TestCase
diff --git a/rest_framework/tests/relations.py b/rest_framework/tests/relations.py
index edc85f9e..5fc32038 100644
--- a/rest_framework/tests/relations.py
+++ b/rest_framework/tests/relations.py
@@ -1,7 +1,7 @@
"""
General tests for relational fields.
"""
-
+from __future__ import unicode_literals
from django.db import models
from django.test import TestCase
from rest_framework import serializers
diff --git a/rest_framework/tests/relations_hyperlink.py b/rest_framework/tests/relations_hyperlink.py
index 76e31476..4fbf0b63 100644
--- a/rest_framework/tests/relations_hyperlink.py
+++ b/rest_framework/tests/relations_hyperlink.py
@@ -1,5 +1,4 @@
from __future__ import unicode_literals
-
from django.test import TestCase
from rest_framework import serializers
from rest_framework.compat import patterns, url
diff --git a/rest_framework/tests/relations_pk.py b/rest_framework/tests/relations_pk.py
index ca7ac17e..ffd1127e 100644
--- a/rest_framework/tests/relations_pk.py
+++ b/rest_framework/tests/relations_pk.py
@@ -1,6 +1,4 @@
from __future__ import unicode_literals
-
-from django.db import models
from django.test import TestCase
from rest_framework import serializers
from rest_framework.tests.models import ManyToManyTarget, ManyToManySource, ForeignKeyTarget, ForeignKeySource, NullableForeignKeySource, OneToOneTarget, NullableOneToOneSource
diff --git a/rest_framework/tests/request.py b/rest_framework/tests/request.py
index 92b1bfd8..9d4fdc7b 100644
--- a/rest_framework/tests/request.py
+++ b/rest_framework/tests/request.py
@@ -1,7 +1,7 @@
"""
Tests for content parsing, and form-overloaded content parsing.
"""
-import json
+from __future__ import unicode_literals
from django.contrib.auth.models import User
from django.contrib.auth import authenticate, login, logout
from django.contrib.sessions.middleware import SessionMiddleware
@@ -21,6 +21,7 @@ from rest_framework.response import Response
from rest_framework.settings import api_settings
from rest_framework.views import APIView
from rest_framework.compat import six
+import json
factory = RequestFactory()
diff --git a/rest_framework/tests/response.py b/rest_framework/tests/response.py
index 453488d0..3e1da905 100644
--- a/rest_framework/tests/response.py
+++ b/rest_framework/tests/response.py
@@ -1,3 +1,4 @@
+from __future__ import unicode_literals
from django.test import TestCase
from rest_framework.compat import patterns, url, include
from rest_framework.response import Response
diff --git a/rest_framework/tests/reverse.py b/rest_framework/tests/reverse.py
index 8c86e1fb..4ad4d684 100644
--- a/rest_framework/tests/reverse.py
+++ b/rest_framework/tests/reverse.py
@@ -1,3 +1,4 @@
+from __future__ import unicode_literals
from django.test import TestCase
from django.test.client import RequestFactory
from rest_framework.compat import patterns, url
diff --git a/rest_framework/tests/serializer.py b/rest_framework/tests/serializer.py
index 1f46cfc7..dda388aa 100644
--- a/rest_framework/tests/serializer.py
+++ b/rest_framework/tests/serializer.py
@@ -1,13 +1,12 @@
from __future__ import unicode_literals
-
-import datetime
-import pickle
from django.utils.datastructures import MultiValueDict
from django.test import TestCase
from rest_framework import serializers
from rest_framework.tests.models import (HasPositiveIntegerAsChoice, Album, ActionItem, Anchor, BasicModel,
BlankFieldModel, BlogPost, Book, CallableDefaultValueModel, DefaultValueModel,
ManyToManyModel, Person, ReadOnlyManyToManyModel, Photo)
+import datetime
+import pickle
class SubComment(object):
diff --git a/rest_framework/tests/settings.py b/rest_framework/tests/settings.py
index 0293fdc3..857375c2 100644
--- a/rest_framework/tests/settings.py
+++ b/rest_framework/tests/settings.py
@@ -1,4 +1,5 @@
"""Tests for the settings module"""
+from __future__ import unicode_literals
from django.test import TestCase
from rest_framework.settings import APISettings, DEFAULTS, IMPORT_STRINGS
diff --git a/rest_framework/tests/status.py b/rest_framework/tests/status.py
index 30df5cef..c0d11b5f 100644
--- a/rest_framework/tests/status.py
+++ b/rest_framework/tests/status.py
@@ -1,4 +1,5 @@
"""Tests for the status module"""
+from __future__ import unicode_literals
from django.test import TestCase
from rest_framework import status
diff --git a/rest_framework/tests/testcases.py b/rest_framework/tests/testcases.py
index 97f492ff..f8c2579e 100644
--- a/rest_framework/tests/testcases.py
+++ b/rest_framework/tests/testcases.py
@@ -1,4 +1,5 @@
# http://djangosnippets.org/snippets/1011/
+from __future__ import unicode_literals
from django.conf import settings
from django.core.management import call_command
from django.db.models import loading
diff --git a/rest_framework/tests/tests.py b/rest_framework/tests/tests.py
index adeaf6da..08f88e11 100644
--- a/rest_framework/tests/tests.py
+++ b/rest_framework/tests/tests.py
@@ -2,6 +2,7 @@
Force import of all modules in this package in order to get the standard test
runner to pick up the tests. Yowzers.
"""
+from __future__ import unicode_literals
import os
modules = [filename.rsplit('.', 1)[0]
diff --git a/rest_framework/tests/throttling.py b/rest_framework/tests/throttling.py
index 4b98b941..4616f325 100644
--- a/rest_framework/tests/throttling.py
+++ b/rest_framework/tests/throttling.py
@@ -1,11 +1,10 @@
"""
Tests for the throttling implementations in the permissions module.
"""
-
+from __future__ import unicode_literals
from django.test import TestCase
from django.contrib.auth.models import User
from django.core.cache import cache
-
from django.test.client import RequestFactory
from rest_framework.views import APIView
from rest_framework.throttling import UserRateThrottle
diff --git a/rest_framework/tests/urlpatterns.py b/rest_framework/tests/urlpatterns.py
index 43e8ef69..41245ad1 100644
--- a/rest_framework/tests/urlpatterns.py
+++ b/rest_framework/tests/urlpatterns.py
@@ -1,10 +1,8 @@
+from __future__ import unicode_literals
from collections import namedtuple
-
from django.core import urlresolvers
-
from django.test import TestCase
from django.test.client import RequestFactory
-
from rest_framework.compat import patterns, url, include
from rest_framework.urlpatterns import format_suffix_patterns
diff --git a/rest_framework/tests/utils.py b/rest_framework/tests/utils.py
index 4e6faac4..224c4f9d 100644
--- a/rest_framework/tests/utils.py
+++ b/rest_framework/tests/utils.py
@@ -1,3 +1,4 @@
+from __future__ import unicode_literals
from django.test.client import RequestFactory, FakePayload
from django.test.client import MULTIPART_CONTENT
from rest_framework.compat import urlparse
diff --git a/rest_framework/tests/views.py b/rest_framework/tests/views.py
index f2432516..7063c3fb 100644
--- a/rest_framework/tests/views.py
+++ b/rest_framework/tests/views.py
@@ -1,6 +1,4 @@
from __future__ import unicode_literals
-
-import copy
from django.test import TestCase
from django.test.client import RequestFactory
from rest_framework import status
@@ -8,6 +6,7 @@ from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework.settings import api_settings
from rest_framework.views import APIView
+import copy
factory = RequestFactory()
diff --git a/rest_framework/throttling.py b/rest_framework/throttling.py
index 8fe64248..810cad63 100644
--- a/rest_framework/throttling.py
+++ b/rest_framework/throttling.py
@@ -1,7 +1,8 @@
-import time
+from __future__ import unicode_literals
from django.core.cache import cache
from rest_framework import exceptions
from rest_framework.settings import api_settings
+import time
class BaseThrottle(object):
diff --git a/rest_framework/urlpatterns.py b/rest_framework/urlpatterns.py
index 47789026..d9143bb4 100644
--- a/rest_framework/urlpatterns.py
+++ b/rest_framework/urlpatterns.py
@@ -1,6 +1,7 @@
+from __future__ import unicode_literals
+from django.core.urlresolvers import RegexURLResolver
from rest_framework.compat import url, include
from rest_framework.settings import api_settings
-from django.core.urlresolvers import RegexURLResolver
def apply_suffix_patterns(urlpatterns, suffix_pattern, suffix_required):
diff --git a/rest_framework/urls.py b/rest_framework/urls.py
index fbe4bc07..9c4719f1 100644
--- a/rest_framework/urls.py
+++ b/rest_framework/urls.py
@@ -12,6 +12,7 @@ your authentication settings include `SessionAuthentication`.
url(r'^auth', include('rest_framework.urls', namespace='rest_framework'))
)
"""
+from __future__ import unicode_literals
from rest_framework.compat import patterns, url
diff --git a/rest_framework/utils/__init__.py b/rest_framework/utils/__init__.py
index 1603f972..3bab3b5f 100644
--- a/rest_framework/utils/__init__.py
+++ b/rest_framework/utils/__init__.py
@@ -1,3 +1,4 @@
+from __future__ import unicode_literals
from django.utils.xmlutils import SimplerXMLGenerator
from rest_framework.compat import StringIO
from rest_framework.compat import six
diff --git a/rest_framework/utils/breadcrumbs.py b/rest_framework/utils/breadcrumbs.py
index 80e39d46..af21ac79 100644
--- a/rest_framework/utils/breadcrumbs.py
+++ b/rest_framework/utils/breadcrumbs.py
@@ -1,3 +1,4 @@
+from __future__ import unicode_literals
from django.core.urlresolvers import resolve, get_script_prefix
diff --git a/rest_framework/utils/encoders.py b/rest_framework/utils/encoders.py
index 7afe100a..b6de18a8 100644
--- a/rest_framework/utils/encoders.py
+++ b/rest_framework/utils/encoders.py
@@ -1,13 +1,14 @@
"""
Helper classes for parsers.
"""
+from __future__ import unicode_literals
+from django.utils.datastructures import SortedDict
+from rest_framework.compat import timezone
+from rest_framework.serializers import DictWithMetadata, SortedDictWithMetadata
import datetime
import decimal
import types
import json
-from django.utils.datastructures import SortedDict
-from rest_framework.compat import timezone
-from rest_framework.serializers import DictWithMetadata, SortedDictWithMetadata
class JSONEncoder(json.JSONEncoder):
diff --git a/rest_framework/utils/mediatypes.py b/rest_framework/utils/mediatypes.py
index aea1b629..c09c2933 100644
--- a/rest_framework/utils/mediatypes.py
+++ b/rest_framework/utils/mediatypes.py
@@ -3,7 +3,7 @@ Handling of media types, as found in HTTP Content-Type and Accept headers.
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 rest_framework import HTTP_HEADER_ENCODING
diff --git a/rest_framework/views.py b/rest_framework/views.py
index ac9b3385..ef2b5f92 100644
--- a/rest_framework/views.py
+++ b/rest_framework/views.py
@@ -1,8 +1,7 @@
"""
Provides an APIView class that is used as the base of all class-based views.
"""
-
-import re
+from __future__ import unicode_literals
from django.core.exceptions import PermissionDenied
from django.http import Http404
from django.utils.html import escape
@@ -13,6 +12,7 @@ from rest_framework.compat import View, apply_markdown
from rest_framework.response import Response
from rest_framework.request import Request
from rest_framework.settings import api_settings
+import re
def _remove_trailing_string(content, trailing):