Skip to content

Commit 73978c9

Browse files
author
kazmiruk
committed
change SortedDict to OrderedDict
1 parent 601b224 commit 73978c9

File tree

5 files changed

+28
-27
lines changed

5 files changed

+28
-27
lines changed

rest_framework/fields.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
from django.utils import six, timezone
2323
from django.utils.encoding import is_protected_type
2424
from django.utils.translation import ugettext_lazy as _
25-
from django.utils.datastructures import SortedDict
2625
from django.utils.dateparse import parse_date, parse_datetime, parse_time
2726
from rest_framework import ISO_8601
2827
from rest_framework.compat import (
@@ -225,7 +224,7 @@ def to_native(self, value):
225224
return [self.to_native(item) for item in value]
226225
elif isinstance(value, dict):
227226
# Make sure we preserve field ordering, if it exists
228-
ret = SortedDict()
227+
ret = collections.OrderedDict()
229228
for key, val in value.items():
230229
ret[key] = self.to_native(val)
231230
return ret
@@ -240,7 +239,7 @@ def attributes(self):
240239
return {}
241240

242241
def metadata(self):
243-
metadata = SortedDict()
242+
metadata = collections.OrderedDict()
244243
metadata['type'] = self.type_label
245244
metadata['required'] = getattr(self, 'required', False)
246245
optional_attrs = ['read_only', 'label', 'help_text',

rest_framework/routers.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,10 @@
1616
from __future__ import unicode_literals
1717

1818
import itertools
19-
from collections import namedtuple
19+
from collections import namedtuple, OrderedDict
2020
from django.conf.urls import patterns, url
2121
from django.core.exceptions import ImproperlyConfigured
2222
from django.core.urlresolvers import NoReverseMatch
23-
from django.utils.datastructures import SortedDict
2423
from rest_framework import views
2524
from rest_framework.response import Response
2625
from rest_framework.reverse import reverse
@@ -278,7 +277,7 @@ def get_api_root_view(self):
278277
"""
279278
Return a view to use as the API root.
280279
"""
281-
api_root_dict = SortedDict()
280+
api_root_dict = OrderedDict()
282281
list_name = self.routes[0].name
283282
for prefix, viewset, basename in self.registry:
284283
api_root_dict[prefix] = list_name.format(basename=basename)
@@ -287,7 +286,7 @@ class APIRoot(views.APIView):
287286
_ignore_model_permissions = True
288287

289288
def get(self, request, *args, **kwargs):
290-
ret = SortedDict()
289+
ret = OrderedDict()
291290
for key, url_name in api_root_dict.items():
292291
try:
293292
ret[key] = reverse(

rest_framework/serializers.py

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
response content is handled by parsers and renderers.
1212
"""
1313
from __future__ import unicode_literals
14+
from collections import OrderedDict
1415
import copy
1516
import datetime
1617
import inspect
@@ -21,7 +22,6 @@
2122
from django.db import models
2223
from django.forms import widgets
2324
from django.utils import six
24-
from django.utils.datastructures import SortedDict
2525
from django.utils.functional import cached_property
2626
from django.core.exceptions import ObjectDoesNotExist
2727
from rest_framework.settings import api_settings
@@ -106,7 +106,7 @@ def __getstate__(self):
106106
return dict(self)
107107

108108

109-
class SortedDictWithMetadata(SortedDict):
109+
class OrderedDictWithMetadata(OrderedDict):
110110
"""
111111
A sorted dict-like object, that can have additional properties attached.
112112
"""
@@ -116,7 +116,7 @@ def __getstate__(self):
116116
Overriden to remove the metadata from the dict, since it shouldn't be
117117
pickle and may in some instances be unpickleable.
118118
"""
119-
return SortedDict(self).__dict__
119+
return OrderedDict(self).__dict__
120120

121121

122122
def _is_protected_type(obj):
@@ -152,7 +152,7 @@ def _get_declared_fields(bases, attrs):
152152
if hasattr(base, 'base_fields'):
153153
fields = list(base.base_fields.items()) + fields
154154

155-
return SortedDict(fields)
155+
return OrderedDict(fields)
156156

157157

158158
class SerializerMetaclass(type):
@@ -180,7 +180,7 @@ class Meta(object):
180180
pass
181181

182182
_options_class = SerializerOptions
183-
_dict_class = SortedDictWithMetadata
183+
_dict_class = OrderedDictWithMetadata
184184

185185
def __init__(self, instance=None, data=None, files=None,
186186
context=None, partial=False, many=False,
@@ -229,7 +229,7 @@ def get_fields(self):
229229
This will be the set of any explicitly declared fields,
230230
plus the set of fields returned by get_default_fields().
231231
"""
232-
ret = SortedDict()
232+
ret = OrderedDict()
233233

234234
# Get the explicitly declared fields
235235
base_fields = copy.deepcopy(self.base_fields)
@@ -245,7 +245,7 @@ def get_fields(self):
245245
# If 'fields' is specified, use those fields, in that order.
246246
if self.opts.fields:
247247
assert isinstance(self.opts.fields, (list, tuple)), '`fields` must be a list or tuple'
248-
new = SortedDict()
248+
new = OrderedDict()
249249
for key in self.opts.fields:
250250
new[key] = ret[key]
251251
ret = new
@@ -606,7 +606,7 @@ def metadata(self):
606606
Useful for things like responding to OPTIONS requests, or generating
607607
API schemas for auto-documentation.
608608
"""
609-
return SortedDict(
609+
return OrderedDict(
610610
[
611611
(field_name, field.metadata())
612612
for field_name, field in six.iteritems(self.fields)
@@ -683,7 +683,7 @@ def get_default_fields(self):
683683
self.__class__.__name__
684684
)
685685
opts = cls._meta.concrete_model._meta
686-
ret = SortedDict()
686+
ret = OrderedDict()
687687
nested = bool(self.opts.depth)
688688

689689
# Deal with adding the primary key field
@@ -985,13 +985,16 @@ def restore_object(self, attrs, instance=None):
985985
if field_name in attrs:
986986
m2m_data[field_name] = attrs.pop(field_name)
987987

988-
# Forward m2m relations
989-
for field in meta.many_to_many + meta.virtual_fields:
988+
def _inner_loop_code(field):
990989
if isinstance(field, GenericForeignKey):
991-
continue
990+
return
992991
if field.name in attrs:
993992
m2m_data[field.name] = attrs.pop(field.name)
994993

994+
# Forward m2m relations
995+
_ = [_inner_loop_code(field) for field in meta.many_to_many]
996+
_ = [_inner_loop_code(field) for field in meta.virtual_fields]
997+
995998
# Nested forward relations - These need to be marked so we can save
996999
# them before saving the parent model instance.
9971000
for field_name in attrs.keys():

rest_framework/utils/encoders.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@
22
Helper classes for parsers.
33
"""
44
from __future__ import unicode_literals
5+
from collections import OrderedDict
56
from django.utils import timezone
67
from django.db.models.query import QuerySet
7-
from django.utils.datastructures import SortedDict
88
from django.utils.functional import Promise
99
from rest_framework.compat import force_text
10-
from rest_framework.serializers import DictWithMetadata, SortedDictWithMetadata
10+
from rest_framework.serializers import DictWithMetadata, OrderedDictWithMetadata
1111
import datetime
1212
import decimal
1313
import types
@@ -67,7 +67,7 @@ def default(self, o):
6767
class SafeDumper(yaml.SafeDumper):
6868
"""
6969
Handles decimals as strings.
70-
Handles SortedDicts as usual dicts, but preserves field order, rather
70+
Handles OrderedDicts as usual dicts, but preserves field order, rather
7171
than the usual behaviour of sorting the keys.
7272
"""
7373
def represent_decimal(self, data):
@@ -81,7 +81,7 @@ def represent_mapping(self, tag, mapping, flow_style=None):
8181
best_style = True
8282
if hasattr(mapping, 'items'):
8383
mapping = list(mapping.items())
84-
if not isinstance(mapping, SortedDict):
84+
if not isinstance(mapping, OrderedDict):
8585
mapping.sort()
8686
for item_key, item_value in mapping:
8787
node_key = self.represent_data(item_key)
@@ -103,15 +103,15 @@ def represent_mapping(self, tag, mapping, flow_style=None):
103103
SafeDumper.represent_decimal
104104
)
105105
SafeDumper.add_representer(
106-
SortedDict,
106+
OrderedDict,
107107
yaml.representer.SafeRepresenter.represent_dict
108108
)
109109
SafeDumper.add_representer(
110110
DictWithMetadata,
111111
yaml.representer.SafeRepresenter.represent_dict
112112
)
113113
SafeDumper.add_representer(
114-
SortedDictWithMetadata,
114+
OrderedDictWithMetadata,
115115
yaml.representer.SafeRepresenter.represent_dict
116116
)
117117
SafeDumper.add_representer(

rest_framework/views.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
"""
44
from __future__ import unicode_literals
55

6+
from collections import OrderedDict
67
from django.core.exceptions import PermissionDenied
78
from django.http import Http404
8-
from django.utils.datastructures import SortedDict
99
from django.views.decorators.csrf import csrf_exempt
1010
from rest_framework import status, exceptions
1111
from rest_framework.compat import smart_text, HttpResponseBase, View
@@ -421,7 +421,7 @@ def metadata(self, request):
421421
# By default we can't provide any form-like information, however the
422422
# generic views override this implementation and add additional
423423
# information for POST and PUT methods, based on the serializer.
424-
ret = SortedDict()
424+
ret = OrderedDict()
425425
ret['name'] = self.get_view_name()
426426
ret['description'] = self.get_view_description()
427427
ret['renders'] = [renderer.media_type for renderer in self.renderer_classes]

0 commit comments

Comments
 (0)