diff options
| -rw-r--r-- | rest_framework/compat.py | 10 | ||||
| -rw-r--r-- | rest_framework/fields.py | 7 | ||||
| -rw-r--r-- | rest_framework/metadata.py | 9 | ||||
| -rw-r--r-- | rest_framework/routers.py | 6 | ||||
| -rw-r--r-- | rest_framework/serializers.py | 10 | ||||
| -rw-r--r-- | rest_framework/utils/encoders.py | 11 | ||||
| -rw-r--r-- | rest_framework/utils/model_meta.py | 12 | 
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())      ) | 
