Merge branch 'drop-django-16' oft https://github.com/carltongibson/django-rest-framework into carltongibson-drop-django-16

Conflicts:
	docs/topics/release-notes.md
This commit is contained in:
Tom Christie 2015-09-28 11:17:48 +01:00
commit 2d0b54e263
19 changed files with 33 additions and 70 deletions

View File

@ -13,11 +13,6 @@ env:
- TOX_ENV=py33-django17 - TOX_ENV=py33-django17
- TOX_ENV=py32-django17 - TOX_ENV=py32-django17
- TOX_ENV=py27-django17 - TOX_ENV=py27-django17
- TOX_ENV=py34-django16
- TOX_ENV=py33-django16
- TOX_ENV=py32-django16
- TOX_ENV=py27-django16
- TOX_ENV=py26-django16
- TOX_ENV=py27-djangomaster - TOX_ENV=py27-djangomaster
- TOX_ENV=py34-djangomaster - TOX_ENV=py34-djangomaster
- TOX_ENV=py35-djangomaster - TOX_ENV=py35-djangomaster

View File

@ -36,8 +36,8 @@ There is a live example API for testing purposes, [available here][sandbox].
# Requirements # Requirements
* Python (2.6.5+, 2.7, 3.2, 3.3, 3.4) * Python (2.7, 3.2, 3.3, 3.4)
* Django (1.6.3+, 1.7, 1.8) * Django (1.7, 1.8)
# Installation # Installation

View File

@ -44,7 +44,7 @@ You can determine your currently installed version using `pip freeze`:
**Date**: NOT YET RELEASED **Date**: NOT YET RELEASED
* Removed support for Django Version 1.5 ([#3421][gh3421]) * Removed support for Django Versions 1.5 & 1.6 ([#3421][gh3421], [#3429][gh3429])
## 3.2.x series ## 3.2.x series
@ -544,3 +544,4 @@ For older release notes, [please see the version 2.x documentation][old-release-
<!-- 3.3.0 --> <!-- 3.3.0 -->
[gh3421]: https://github.com/tomchristie/django-rest-framework/pulls/3421 [gh3421]: https://github.com/tomchristie/django-rest-framework/pulls/3421
[gh3429]: https://github.com/tomchristie/django-rest-framework/pull/3429

View File

@ -57,24 +57,6 @@ def distinct(queryset, base):
return queryset.distinct() return queryset.distinct()
# OrderedDict only available in Python 2.7.
# This will always be the case in Django 1.7 and above, as these versions
# no longer support Python 2.6.
# For Django <= 1.6 and Python 2.6 fall back to SortedDict.
try:
from collections import OrderedDict
except ImportError:
from django.utils.datastructures import SortedDict as OrderedDict
# unittest.SkipUnless only available in Python 2.7.
try:
import unittest
unittest.skipUnless
except (ImportError, AttributeError):
from django.utils import unittest
# contrib.postgres only supported from 1.8 onwards. # contrib.postgres only supported from 1.8 onwards.
try: try:
from django.contrib.postgres import fields as postgres_fields from django.contrib.postgres import fields as postgres_fields
@ -82,24 +64,6 @@ except ImportError:
postgres_fields = None postgres_fields = None
# Apps only exists from 1.7 onwards.
try:
from django.apps import apps
get_model = apps.get_model
except ImportError:
from django.db.models import get_model
# Import path changes from 1.7 onwards.
try:
from django.contrib.contenttypes.fields import (
GenericForeignKey, GenericRelation
)
except ImportError:
from django.contrib.contenttypes.generic import (
GenericForeignKey, GenericRelation
)
# django-filter is optional # django-filter is optional
try: try:
import django_filters import django_filters

View File

@ -7,6 +7,7 @@ import decimal
import inspect import inspect
import re import re
import uuid import uuid
from collections import OrderedDict
from django.conf import settings from django.conf import settings
from django.core.exceptions import ValidationError as DjangoValidationError from django.core.exceptions import ValidationError as DjangoValidationError
@ -26,8 +27,8 @@ from django.utils.translation import ugettext_lazy as _
from rest_framework import ISO_8601 from rest_framework import ISO_8601
from rest_framework.compat import ( from rest_framework.compat import (
MaxLengthValidator, MaxValueValidator, MinLengthValidator, MaxLengthValidator, MaxValueValidator, MinLengthValidator,
MinValueValidator, OrderedDict, duration_string, parse_duration, MinValueValidator, duration_string, parse_duration, unicode_repr,
unicode_repr, unicode_to_repr unicode_to_repr
) )
from rest_framework.exceptions import ValidationError from rest_framework.exceptions import ValidationError
from rest_framework.settings import api_settings from rest_framework.settings import api_settings

View File

@ -8,12 +8,13 @@ to return this information in a more standardized way.
""" """
from __future__ import unicode_literals from __future__ import unicode_literals
from collections import OrderedDict
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from django.http import Http404 from django.http import Http404
from django.utils.encoding import force_text from django.utils.encoding import force_text
from rest_framework import exceptions, serializers from rest_framework import exceptions, serializers
from rest_framework.compat import OrderedDict
from rest_framework.request import clone_request from rest_framework.request import clone_request
from rest_framework.utils.field_mapping import ClassLookupDict from rest_framework.utils.field_mapping import ClassLookupDict

View File

@ -7,7 +7,7 @@ from __future__ import unicode_literals
import warnings import warnings
from base64 import b64decode, b64encode from base64 import b64decode, b64encode
from collections import namedtuple from collections import OrderedDict, namedtuple
from django.core.paginator import Paginator as DjangoPaginator from django.core.paginator import Paginator as DjangoPaginator
from django.core.paginator import InvalidPage from django.core.paginator import InvalidPage
@ -16,7 +16,6 @@ from django.utils import six
from django.utils.six.moves.urllib import parse as urlparse from django.utils.six.moves.urllib import parse as urlparse
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from rest_framework.compat import OrderedDict
from rest_framework.exceptions import NotFound from rest_framework.exceptions import NotFound
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.settings import api_settings from rest_framework.settings import api_settings

View File

@ -1,6 +1,8 @@
# coding: utf-8 # coding: utf-8
from __future__ import unicode_literals from __future__ import unicode_literals
from collections import OrderedDict
from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist
from django.core.urlresolvers import ( from django.core.urlresolvers import (
NoReverseMatch, Resolver404, get_script_prefix, resolve NoReverseMatch, Resolver404, get_script_prefix, resolve
@ -12,7 +14,6 @@ from django.utils.encoding import smart_text
from django.utils.six.moves.urllib import parse as urlparse from django.utils.six.moves.urllib import parse as urlparse
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from rest_framework.compat import OrderedDict
from rest_framework.fields import ( from rest_framework.fields import (
Field, empty, get_attribute, is_simple_callable, iter_options Field, empty, get_attribute, is_simple_callable, iter_options
) )

View File

@ -16,14 +16,13 @@ For example, you might have a `urls.py` that looks something like this:
from __future__ import unicode_literals from __future__ import unicode_literals
import itertools import itertools
from collections import namedtuple from collections import OrderedDict, namedtuple
from django.conf.urls import url from django.conf.urls import url
from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ImproperlyConfigured
from django.core.urlresolvers import NoReverseMatch from django.core.urlresolvers import NoReverseMatch
from rest_framework import views from rest_framework import views
from rest_framework.compat import OrderedDict
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.reverse import reverse from rest_framework.reverse import reverse
from rest_framework.urlpatterns import format_suffix_patterns from rest_framework.urlpatterns import format_suffix_patterns

View File

@ -6,14 +6,13 @@ relationships and their associated metadata.
Usage: `get_field_info(model)` returns a `FieldInfo` instance. Usage: `get_field_info(model)` returns a `FieldInfo` instance.
""" """
import inspect import inspect
from collections import namedtuple from collections import OrderedDict, namedtuple
from django.apps import apps
from django.core.exceptions import ImproperlyConfigured from django.core.exceptions import ImproperlyConfigured
from django.db import models from django.db import models
from django.utils import six from django.utils import six
from rest_framework.compat import OrderedDict, get_model
FieldInfo = namedtuple('FieldResult', [ FieldInfo = namedtuple('FieldResult', [
'pk', # Model field instance 'pk', # Model field instance
'fields', # Dict of field name -> model field instance 'fields', # Dict of field name -> model field instance
@ -45,7 +44,7 @@ def _resolve_model(obj):
""" """
if isinstance(obj, six.string_types) and len(obj.split('.')) == 2: if isinstance(obj, six.string_types) and len(obj.split('.')) == 2:
app_name, model_name = obj.split('.') app_name, model_name = obj.split('.')
resolved_model = get_model(app_name, model_name) resolved_model = apps.get_model(app_name, model_name)
if resolved_model is None: if resolved_model is None:
msg = "Django did not return a model for {0}.{1}" msg = "Django did not return a model for {0}.{1}"
raise ImproperlyConfigured(msg.format(app_name, model_name)) raise ImproperlyConfigured(msg.format(app_name, model_name))

View File

@ -1,10 +1,11 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import collections import collections
from collections import OrderedDict
from django.utils.encoding import force_text from django.utils.encoding import force_text
from rest_framework.compat import OrderedDict, unicode_to_repr from rest_framework.compat import unicode_to_repr
class ReturnDict(OrderedDict): class ReturnDict(OrderedDict):

View File

@ -1,5 +1,7 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import unittest
from django.conf.urls import url from django.conf.urls import url
from django.db import connection, connections, transaction from django.db import connection, connections, transaction
from django.http import Http404 from django.http import Http404
@ -7,7 +9,6 @@ from django.test import TestCase, TransactionTestCase
from django.utils.decorators import method_decorator from django.utils.decorators import method_decorator
from rest_framework import status from rest_framework import status
from rest_framework.compat import unittest
from rest_framework.exceptions import APIException from rest_framework.exceptions import APIException
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.test import APIRequestFactory from rest_framework.test import APIRequestFactory

View File

@ -1,6 +1,7 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import datetime import datetime
import unittest
from decimal import Decimal from decimal import Decimal
from django.conf.urls import url from django.conf.urls import url
@ -12,7 +13,7 @@ from django.utils.dateparse import parse_date
from django.utils.six.moves import reload_module from django.utils.six.moves import reload_module
from rest_framework import filters, generics, serializers, status from rest_framework import filters, generics, serializers, status
from rest_framework.compat import django_filters, unittest from rest_framework.compat import django_filters
from rest_framework.test import APIRequestFactory from rest_framework.test import APIRequestFactory
from .models import BaseFilterableItem, BasicModel, FilterableItem from .models import BaseFilterableItem, BasicModel, FilterableItem

View File

@ -8,6 +8,7 @@ an appropriate set of serializer fields for each case.
from __future__ import unicode_literals from __future__ import unicode_literals
import decimal import decimal
from collections import OrderedDict
import django import django
import pytest import pytest
@ -21,7 +22,7 @@ from django.utils import six
from rest_framework import serializers from rest_framework import serializers
from rest_framework.compat import DurationField as ModelDurationField from rest_framework.compat import DurationField as ModelDurationField
from rest_framework.compat import OrderedDict, unicode_repr from rest_framework.compat import unicode_repr
def dedent(blocktext): def dedent(blocktext):

View File

@ -1,6 +1,7 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import base64 import base64
import unittest
from django.contrib.auth.models import Group, Permission, User from django.contrib.auth.models import Group, Permission, User
from django.core.urlresolvers import ResolverMatch from django.core.urlresolvers import ResolverMatch
@ -11,7 +12,7 @@ from rest_framework import (
HTTP_HEADER_ENCODING, authentication, generics, permissions, serializers, HTTP_HEADER_ENCODING, authentication, generics, permissions, serializers,
status status
) )
from rest_framework.compat import guardian, unittest from rest_framework.compat import guardian
from rest_framework.filters import DjangoObjectPermissionsFilter from rest_framework.filters import DjangoObjectPermissionsFilter
from rest_framework.routers import DefaultRouter from rest_framework.routers import DefaultRouter
from rest_framework.test import APIRequestFactory from rest_framework.test import APIRequestFactory

View File

@ -1,12 +1,14 @@
from __future__ import unicode_literals from __future__ import unicode_literals
from django.contrib.contenttypes.fields import (
GenericForeignKey, GenericRelation
)
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
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 django.utils.encoding import python_2_unicode_compatible
from rest_framework import serializers from rest_framework import serializers
from rest_framework.compat import GenericForeignKey, GenericRelation
@python_2_unicode_compatible @python_2_unicode_compatible

View File

@ -3,7 +3,7 @@ from __future__ import unicode_literals
import json import json
import re import re
from collections import MutableMapping from collections import MutableMapping, OrderedDict
from django.conf.urls import include, url from django.conf.urls import include, url
from django.core.cache import cache from django.core.cache import cache
@ -13,7 +13,6 @@ from django.utils import six
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from rest_framework import permissions, serializers, status from rest_framework import permissions, serializers, status
from rest_framework.compat import OrderedDict
from rest_framework.renderers import ( from rest_framework.renderers import (
BaseRenderer, BrowsableAPIRenderer, HTMLFormRenderer, JSONRenderer BaseRenderer, BrowsableAPIRenderer, HTMLFormRenderer, JSONRenderer
) )

View File

@ -150,16 +150,16 @@ class ResolveModelWithPatchedDjangoTests(TestCase):
def setUp(self): def setUp(self):
"""Monkeypatch get_model.""" """Monkeypatch get_model."""
self.get_model = rest_framework.utils.model_meta.get_model self.get_model = rest_framework.utils.model_meta.apps.get_model
def get_model(app_label, model_name): def get_model(app_label, model_name):
return None return None
rest_framework.utils.model_meta.get_model = get_model rest_framework.utils.model_meta.apps.get_model = get_model
def tearDown(self): def tearDown(self):
"""Revert monkeypatching.""" """Revert monkeypatching."""
rest_framework.utils.model_meta.models.get_model = self.get_model rest_framework.utils.model_meta.apps.get_model = self.get_model
def test_blows_up_if_model_does_not_resolve(self): def test_blows_up_if_model_does_not_resolve(self):
with self.assertRaises(ImproperlyConfigured): with self.assertRaises(ImproperlyConfigured):

View File

@ -4,13 +4,11 @@ addopts=--tb=short
[tox] [tox]
envlist = envlist =
py27-{lint,docs}, py27-{lint,docs},
{py26,py27,py32,py33,py34}-django16,
{py27,py32,py33,py34}-django{17,18}, {py27,py32,py33,py34}-django{17,18},
{py27,py34,py35}-django{master} {py27,py34,py35}-django{master}
[testenv] [testenv]
basepython = basepython =
py26: python2.6
py27: python2.7 py27: python2.7
py32: python3.2 py32: python3.2
py33: python3.3 py33: python3.3
@ -21,7 +19,6 @@ commands = ./runtests.py --fast {posargs} --coverage
setenv = setenv =
PYTHONDONTWRITEBYTECODE=1 PYTHONDONTWRITEBYTECODE=1
deps = deps =
django16: Django==1.6.3 # Should track minimum supported
django17: Django==1.7.10 # Should track maximum supported django17: Django==1.7.10 # Should track maximum supported
django18: Django==1.8.4 # Should track maximum supported django18: Django==1.8.4 # Should track maximum supported
djangomaster: https://github.com/django/django/archive/master.tar.gz djangomaster: https://github.com/django/django/archive/master.tar.gz