Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 0 additions & 5 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,6 @@ env:
- TOX_ENV=py33-django17
- TOX_ENV=py32-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=py34-djangomaster
- TOX_ENV=py35-djangomaster
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@ There is a live example API for testing purposes, [available here][sandbox].

# Requirements

* Python (2.6.5+, 2.7, 3.2, 3.3, 3.4)
* Django (1.6.3+, 1.7, 1.8)
* Python (2.7, 3.2, 3.3, 3.4)
* Django (1.7, 1.8)

# Installation

Expand Down
3 changes: 2 additions & 1 deletion docs/topics/release-notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ You can determine your currently installed version using `pip freeze`:
**Date**: NOT YET RELEASED

* Removed support for Django Version 1.5 ([#3421][gh3421])
* Removed support for Django Version 1.6 and Python 2.6 ([#3429][gh3429])

## 3.2.x series

Expand Down Expand Up @@ -524,4 +525,4 @@ For older release notes, [please see the version 2.x documentation][old-release-

<!-- 3.0.0 -->
[gh3421]: https://github.com/tomchristie/django-rest-framework/pulls/3421

[gh3429]: https://github.com/tomchristie/django-rest-framework/pull/3429
36 changes: 0 additions & 36 deletions rest_framework/compat.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,49 +57,13 @@ def distinct(queryset, base):
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.
try:
from django.contrib.postgres import fields as postgres_fields
except ImportError:
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
try:
import django_filters
Expand Down
5 changes: 3 additions & 2 deletions rest_framework/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import inspect
import re
import uuid
from collections import OrderedDict

from django.conf import settings
from django.core.exceptions import ValidationError as DjangoValidationError
Expand All @@ -26,8 +27,8 @@
from rest_framework import ISO_8601
from rest_framework.compat import (
MaxLengthValidator, MaxValueValidator, MinLengthValidator,
MinValueValidator, OrderedDict, duration_string, parse_duration,
unicode_repr, unicode_to_repr
MinValueValidator, duration_string, parse_duration, unicode_repr,
unicode_to_repr
)
from rest_framework.exceptions import ValidationError
from rest_framework.settings import api_settings
Expand Down
3 changes: 2 additions & 1 deletion rest_framework/metadata.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,13 @@
"""
from __future__ import unicode_literals

from collections import OrderedDict

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 OrderedDict
from rest_framework.request import clone_request
from rest_framework.utils.field_mapping import ClassLookupDict

Expand Down
3 changes: 1 addition & 2 deletions rest_framework/pagination.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

import warnings
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 InvalidPage
Expand All @@ -16,7 +16,6 @@
from django.utils.six.moves.urllib import parse as urlparse
from django.utils.translation import ugettext_lazy as _

from rest_framework.compat import OrderedDict
from rest_framework.exceptions import NotFound
from rest_framework.response import Response
from rest_framework.settings import api_settings
Expand Down
3 changes: 2 additions & 1 deletion rest_framework/relations.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
# coding: utf-8
from __future__ import unicode_literals

from collections import OrderedDict

from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist
from django.core.urlresolvers import (
NoReverseMatch, Resolver404, get_script_prefix, resolve
Expand All @@ -12,7 +14,6 @@
from django.utils.six.moves.urllib import parse as urlparse
from django.utils.translation import ugettext_lazy as _

from rest_framework.compat import OrderedDict
from rest_framework.fields import (
Field, empty, get_attribute, is_simple_callable, iter_options
)
Expand Down
3 changes: 1 addition & 2 deletions rest_framework/routers.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,13 @@
from __future__ import unicode_literals

import itertools
from collections import namedtuple
from collections import OrderedDict, namedtuple

from django.conf.urls import url
from django.core.exceptions import ImproperlyConfigured
from django.core.urlresolvers import NoReverseMatch

from rest_framework import views
from rest_framework.compat import OrderedDict
from rest_framework.response import Response
from rest_framework.reverse import reverse
from rest_framework.urlpatterns import format_suffix_patterns
Expand Down
7 changes: 3 additions & 4 deletions rest_framework/utils/model_meta.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,13 @@
Usage: `get_field_info(model)` returns a `FieldInfo` instance.
"""
import inspect
from collections import namedtuple
from collections import OrderedDict, namedtuple

from django.apps import apps
from django.core.exceptions import ImproperlyConfigured
from django.db import models
from django.utils import six

from rest_framework.compat import OrderedDict, get_model

FieldInfo = namedtuple('FieldResult', [
'pk', # Model field instance
'fields', # Dict of field name -> model field instance
Expand Down Expand Up @@ -45,7 +44,7 @@ def _resolve_model(obj):
"""
if isinstance(obj, six.string_types) and len(obj.split('.')) == 2:
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:
msg = "Django did not return a model for {0}.{1}"
raise ImproperlyConfigured(msg.format(app_name, model_name))
Expand Down
3 changes: 2 additions & 1 deletion rest_framework/utils/serializer_helpers.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
from __future__ import unicode_literals

import collections
from collections import OrderedDict

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):
Expand Down
3 changes: 2 additions & 1 deletion tests/test_atomic_requests.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
from __future__ import unicode_literals

import unittest

from django.conf.urls import url
from django.db import connection, connections, transaction
from django.http import Http404
from django.test import TestCase, TransactionTestCase
from django.utils.decorators import method_decorator

from rest_framework import status
from rest_framework.compat import unittest
from rest_framework.exceptions import APIException
from rest_framework.response import Response
from rest_framework.test import APIRequestFactory
Expand Down
3 changes: 2 additions & 1 deletion tests/test_filters.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from __future__ import unicode_literals

import datetime
import unittest
from decimal import Decimal

from django.conf.urls import url
Expand All @@ -12,7 +13,7 @@
from django.utils.six.moves import reload_module

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 .models import BaseFilterableItem, BasicModel, FilterableItem
Expand Down
3 changes: 2 additions & 1 deletion tests/test_model_serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from __future__ import unicode_literals

import decimal
from collections import OrderedDict

import django
import pytest
Expand All @@ -21,7 +22,7 @@

from rest_framework import serializers
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):
Expand Down
3 changes: 2 additions & 1 deletion tests/test_permissions.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from __future__ import unicode_literals

import base64
import unittest

from django.contrib.auth.models import Group, Permission, User
from django.core.urlresolvers import ResolverMatch
Expand All @@ -11,7 +12,7 @@
HTTP_HEADER_ENCODING, authentication, generics, permissions, serializers,
status
)
from rest_framework.compat import guardian, unittest
from rest_framework.compat import guardian
from rest_framework.filters import DjangoObjectPermissionsFilter
from rest_framework.routers import DefaultRouter
from rest_framework.test import APIRequestFactory
Expand Down
4 changes: 3 additions & 1 deletion tests/test_relations_generic.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
from __future__ import unicode_literals

from django.contrib.contenttypes.fields import (
GenericForeignKey, GenericRelation
)
from django.contrib.contenttypes.models import ContentType
from django.db import models
from django.test import TestCase
from django.utils.encoding import python_2_unicode_compatible

from rest_framework import serializers
from rest_framework.compat import GenericForeignKey, GenericRelation


@python_2_unicode_compatible
Expand Down
3 changes: 1 addition & 2 deletions tests/test_renderers.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

import json
import re
from collections import MutableMapping
from collections import MutableMapping, OrderedDict

from django.conf.urls import include, url
from django.core.cache import cache
Expand All @@ -13,7 +13,6 @@
from django.utils.translation import ugettext_lazy as _

from rest_framework import permissions, serializers, status
from rest_framework.compat import OrderedDict
from rest_framework.renderers import (
BaseRenderer, BrowsableAPIRenderer, HTMLFormRenderer, JSONRenderer
)
Expand Down
6 changes: 3 additions & 3 deletions tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -150,16 +150,16 @@ class ResolveModelWithPatchedDjangoTests(TestCase):

def setUp(self):
"""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):
return None

rest_framework.utils.model_meta.get_model = get_model
rest_framework.utils.model_meta.apps.get_model = get_model

def tearDown(self):
"""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):
with self.assertRaises(ImproperlyConfigured):
Expand Down
3 changes: 0 additions & 3 deletions tox.ini
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,11 @@ addopts=--tb=short
[tox]
envlist =
py27-{lint,docs},
{py26,py27,py32,py33,py34}-django16,
{py27,py32,py33,py34}-django{17,18},
{py27,py34,py35}-django{master}

[testenv]
basepython =
py26: python2.6
py27: python2.7
py32: python3.2
py33: python3.3
Expand All @@ -21,7 +19,6 @@ commands = ./runtests.py --fast {posargs} --coverage
setenv =
PYTHONDONTWRITEBYTECODE=1
deps =
django16: Django==1.6.3 # Should track minimum supported
django17: Django==1.7.10 # Should track maximum supported
django18: Django==1.8.4 # Should track maximum supported
djangomaster: https://github.com/django/django/archive/master.tar.gz
Expand Down