mirror of
https://github.com/encode/django-rest-framework.git
synced 2024-11-23 01:57:00 +03:00
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:
commit
2d0b54e263
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
)
|
)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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))
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
)
|
)
|
||||||
|
|
|
@ -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):
|
||||||
|
|
3
tox.ini
3
tox.ini
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user