aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Christie2014-11-06 12:00:30 +0000
committerTom Christie2014-11-06 12:00:30 +0000
commit4e001dbb7ac0bc13d6d5fbb4524e905184610aa2 (patch)
treef653aa5d1e0eaff780ba52039f29085e4bc8f54c
parent9923a6ce9013693ea1723e7895b3cab638d719fd (diff)
downloaddjango-rest-framework-4e001dbb7ac0bc13d6d5fbb4524e905184610aa2.tar.bz2
Drop usage of SortedDict. Closes #2027.
-rw-r--r--rest_framework/compat.py10
-rw-r--r--rest_framework/fields.py7
-rw-r--r--rest_framework/metadata.py9
-rw-r--r--rest_framework/routers.py6
-rw-r--r--rest_framework/serializers.py10
-rw-r--r--rest_framework/utils/encoders.py11
-rw-r--r--rest_framework/utils/model_meta.py12
7 files changed, 36 insertions, 29 deletions
diff --git a/rest_framework/compat.py b/rest_framework/compat.py
index 0201bd83..5bd85e74 100644
--- a/rest_framework/compat.py
+++ b/rest_framework/compat.py
@@ -26,6 +26,16 @@ except ImportError:
from django.utils.encoding import force_unicode as force_text
+# 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 OrderedDict.
+try:
+ from collections import OrderedDict
+except:
+ from django.utils.datastructures import SortedDict as OrderedDict
+
+
# HttpResponseBase only exists from 1.5 onwards
try:
from django.http.response import HttpResponseBase
diff --git a/rest_framework/fields.py b/rest_framework/fields.py
index a9e2e48b..71377326 100644
--- a/rest_framework/fields.py
+++ b/rest_framework/fields.py
@@ -4,14 +4,13 @@ from django.core.exceptions import ValidationError as DjangoValidationError
from django.core.validators import RegexValidator
from django.forms import ImageField as DjangoImageField
from django.utils import six, timezone
-from django.utils.datastructures import SortedDict
from django.utils.dateparse import parse_date, parse_datetime, parse_time
from django.utils.encoding import is_protected_type
from django.utils.translation import ugettext_lazy as _
from rest_framework import ISO_8601
from rest_framework.compat import (
smart_text, EmailValidator, MinValueValidator, MaxValueValidator,
- MinLengthValidator, MaxLengthValidator, URLValidator
+ MinLengthValidator, MaxLengthValidator, URLValidator, OrderedDict
)
from rest_framework.exceptions import ValidationError
from rest_framework.settings import api_settings
@@ -917,9 +916,9 @@ class ChoiceField(Field):
for item in choices
]
if all(pairs):
- self.choices = SortedDict([(key, display_value) for key, display_value in choices])
+ self.choices = OrderedDict([(key, display_value) for key, display_value in choices])
else:
- self.choices = SortedDict([(item, item) for item in choices])
+ self.choices = OrderedDict([(item, item) for item in choices])
# Map the string representation of choices to the underlying value.
# Allows us to deal with eg. integer choices while supporting either
diff --git a/rest_framework/metadata.py b/rest_framework/metadata.py
index af4bc396..b08d3ab6 100644
--- a/rest_framework/metadata.py
+++ b/rest_framework/metadata.py
@@ -10,9 +10,8 @@ from __future__ import unicode_literals
from django.core.exceptions import PermissionDenied
from django.http import Http404
-from django.utils.datastructures import SortedDict
from rest_framework import exceptions, serializers
-from rest_framework.compat import force_text
+from rest_framework.compat import force_text, OrderedDict
from rest_framework.request import clone_request
from rest_framework.utils.field_mapping import ClassLookupDict
@@ -54,7 +53,7 @@ class SimpleMetadata(BaseMetadata):
})
def determine_metadata(self, request, view):
- metadata = SortedDict()
+ metadata = OrderedDict()
metadata['name'] = view.get_view_name()
metadata['description'] = view.get_view_description()
metadata['renders'] = [renderer.media_type for renderer in view.renderer_classes]
@@ -97,7 +96,7 @@ class SimpleMetadata(BaseMetadata):
Given an instance of a serializer, return a dictionary of metadata
about its fields.
"""
- return SortedDict([
+ return OrderedDict([
(field_name, self.get_field_info(field))
for field_name, field in serializer.fields.items()
])
@@ -107,7 +106,7 @@ class SimpleMetadata(BaseMetadata):
Given an instance of a serializer field, return a dictionary
of metadata about it.
"""
- field_info = SortedDict()
+ field_info = OrderedDict()
field_info['type'] = self.label_lookup[field]
field_info['required'] = getattr(field, 'required', False)
diff --git a/rest_framework/routers.py b/rest_framework/routers.py
index 169e6e8b..6e99f14d 100644
--- a/rest_framework/routers.py
+++ b/rest_framework/routers.py
@@ -20,8 +20,8 @@ from collections import namedtuple
from django.conf.urls import patterns, url
from django.core.exceptions import ImproperlyConfigured
from django.core.urlresolvers import NoReverseMatch
-from django.utils.datastructures import SortedDict
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
@@ -278,7 +278,7 @@ class DefaultRouter(SimpleRouter):
"""
Return a view to use as the API root.
"""
- api_root_dict = SortedDict()
+ api_root_dict = OrderedDict()
list_name = self.routes[0].name
for prefix, viewset, basename in self.registry:
api_root_dict[prefix] = list_name.format(basename=basename)
@@ -287,7 +287,7 @@ class DefaultRouter(SimpleRouter):
_ignore_model_permissions = True
def get(self, request, *args, **kwargs):
- ret = SortedDict()
+ ret = OrderedDict()
for key, url_name in api_root_dict.items():
try:
ret[key] = reverse(
diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py
index 7cd206c9..0efa9524 100644
--- a/rest_framework/serializers.py
+++ b/rest_framework/serializers.py
@@ -14,8 +14,8 @@ from django.core.exceptions import ImproperlyConfigured
from django.db import models
from django.db.models.fields import FieldDoesNotExist
from django.utils import six
-from django.utils.datastructures import SortedDict
from django.utils.translation import ugettext_lazy as _
+from rest_framework.compat import OrderedDict
from rest_framework.exceptions import ValidationError
from rest_framework.fields import empty, set_value, Field, SkipField
from rest_framework.settings import api_settings
@@ -159,7 +159,7 @@ class BaseSerializer(Field):
# Serializer & ListSerializer classes
# -----------------------------------
-class ReturnDict(SortedDict):
+class ReturnDict(OrderedDict):
"""
Return object from `serialier.data` for the `Serializer` class.
Includes a backlink to the serializer instance for renderers
@@ -235,7 +235,7 @@ class BindingDict(object):
"""
def __init__(self, serializer):
self.serializer = serializer
- self.fields = SortedDict()
+ self.fields = OrderedDict()
def __setitem__(self, key, field):
self.fields[key] = field
@@ -280,7 +280,7 @@ class SerializerMetaclass(type):
if hasattr(base, '_declared_fields'):
fields = list(base._declared_fields.items()) + fields
- return SortedDict(fields)
+ return OrderedDict(fields)
def __new__(cls, name, bases, attrs):
attrs['_declared_fields'] = cls._get_declared_fields(bases, attrs)
@@ -679,7 +679,7 @@ class ModelSerializer(Serializer):
def get_fields(self):
declared_fields = copy.deepcopy(self._declared_fields)
- ret = SortedDict()
+ ret = OrderedDict()
model = getattr(self.Meta, 'model')
fields = getattr(self.Meta, 'fields', None)
exclude = getattr(self.Meta, 'exclude', None)
diff --git a/rest_framework/utils/encoders.py b/rest_framework/utils/encoders.py
index 486186c9..4d6bb3a3 100644
--- a/rest_framework/utils/encoders.py
+++ b/rest_framework/utils/encoders.py
@@ -4,9 +4,8 @@ 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.datastructures import SortedDict
from django.utils.functional import Promise
-from rest_framework.compat import force_text
+from rest_framework.compat import force_text, OrderedDict
import datetime
import decimal
import types
@@ -68,7 +67,7 @@ else:
class SafeDumper(yaml.SafeDumper):
"""
Handles decimals as strings.
- Handles SortedDicts as usual dicts, but preserves field order, rather
+ Handles OrderedDicts as usual dicts, but preserves field order, rather
than the usual behaviour of sorting the keys.
"""
def represent_decimal(self, data):
@@ -82,7 +81,7 @@ else:
best_style = True
if hasattr(mapping, 'items'):
mapping = list(mapping.items())
- if not isinstance(mapping, SortedDict):
+ if not isinstance(mapping, OrderedDict):
mapping.sort()
for item_key, item_value in mapping:
node_key = self.represent_data(item_key)
@@ -104,7 +103,7 @@ else:
SafeDumper.represent_decimal
)
SafeDumper.add_representer(
- SortedDict,
+ OrderedDict,
yaml.representer.SafeRepresenter.represent_dict
)
# SafeDumper.add_representer(
@@ -112,7 +111,7 @@ else:
# yaml.representer.SafeRepresenter.represent_dict
# )
# SafeDumper.add_representer(
- # SortedDictWithMetadata,
+ # OrderedDictWithMetadata,
# yaml.representer.SafeRepresenter.represent_dict
# )
SafeDumper.add_representer(
diff --git a/rest_framework/utils/model_meta.py b/rest_framework/utils/model_meta.py
index 7a95bcdd..82361edf 100644
--- a/rest_framework/utils/model_meta.py
+++ b/rest_framework/utils/model_meta.py
@@ -8,7 +8,7 @@ Usage: `get_field_info(model)` returns a `FieldInfo` instance.
from collections import namedtuple
from django.db import models
from django.utils import six
-from django.utils.datastructures import SortedDict
+from rest_framework.compat import OrderedDict
import inspect
@@ -63,12 +63,12 @@ def get_field_info(model):
pk = pk.rel.to._meta.pk
# Deal with regular fields.
- fields = SortedDict()
+ fields = OrderedDict()
for field in [field for field in opts.fields if field.serialize and not field.rel]:
fields[field.name] = field
# Deal with forward relationships.
- forward_relations = SortedDict()
+ forward_relations = OrderedDict()
for field in [field for field in opts.fields if field.serialize and field.rel]:
forward_relations[field.name] = RelationInfo(
model_field=field,
@@ -89,7 +89,7 @@ def get_field_info(model):
)
# Deal with reverse relationships.
- reverse_relations = SortedDict()
+ reverse_relations = OrderedDict()
for relation in opts.get_all_related_objects():
accessor_name = relation.get_accessor_name()
reverse_relations[accessor_name] = RelationInfo(
@@ -114,14 +114,14 @@ def get_field_info(model):
# Shortcut that merges both regular fields and the pk,
# for simplifying regular field lookup.
- fields_and_pk = SortedDict()
+ fields_and_pk = OrderedDict()
fields_and_pk['pk'] = pk
fields_and_pk[pk.name] = pk
fields_and_pk.update(fields)
# Shortcut that merges both forward and reverse relationships
- relations = SortedDict(
+ relations = OrderedDict(
list(forward_relations.items()) +
list(reverse_relations.items())
)