diff options
Diffstat (limited to 'rest_framework')
| -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()) ) |
