Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
D
django-rest-framework
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
django-rest-framework
Commits
be66e15c
Commit
be66e15c
authored
Apr 23, 2015
by
kazmiruk
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
renaming of OrderedDict back to SortedDict + some comments
parent
18f1f578
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
43 additions
and
29 deletions
+43
-29
rest_framework/compat.py
+11
-2
rest_framework/fields.py
+3
-3
rest_framework/routers.py
+3
-3
rest_framework/serializers.py
+16
-11
rest_framework/utils/encoders.py
+6
-6
rest_framework/views.py
+2
-2
tests/test_serializer.py
+2
-2
No files found.
rest_framework/compat.py
View file @
be66e15c
...
@@ -266,11 +266,20 @@ except ImportError:
...
@@ -266,11 +266,20 @@ except ImportError:
klass
.
__str__
=
lambda
self
:
self
.
__unicode__
()
.
encode
(
'utf-8'
)
klass
.
__str__
=
lambda
self
:
self
.
__unicode__
()
.
encode
(
'utf-8'
)
return
klass
return
klass
"""
SortedDict deprecated since django 1.8. There is collections.OrderedDict
which available since python 2.7 and python 3.1. There are no need of other
checks because of django 1.7+ requires python 2.7+
"""
try
:
try
:
from
collections
import
OrderedDict
from
collections
import
OrderedDict
as
SortedDict
except
ImportError
:
except
ImportError
:
from
django.utils.datastructures
import
SortedDict
as
OrderedDict
from
django.utils.datastructures
import
SortedDict
"""
GenericForeignKey moves from generic to fields in django 1.9 and in 1.8 shows
deprecation warnings
"""
if
django
.
VERSION
>=
(
1
,
8
):
if
django
.
VERSION
>=
(
1
,
8
):
from
django.contrib.contenttypes.fields
import
GenericForeignKey
from
django.contrib.contenttypes.fields
import
GenericForeignKey
else
:
else
:
...
...
rest_framework/fields.py
View file @
be66e15c
...
@@ -25,7 +25,7 @@ from django.utils.translation import ugettext_lazy as _
...
@@ -25,7 +25,7 @@ from django.utils.translation import ugettext_lazy as _
from
django.utils.dateparse
import
parse_date
,
parse_datetime
,
parse_time
from
django.utils.dateparse
import
parse_date
,
parse_datetime
,
parse_time
from
rest_framework
import
ISO_8601
from
rest_framework
import
ISO_8601
from
rest_framework.compat
import
(
from
rest_framework.compat
import
(
BytesIO
,
smart_text
,
Order
edDict
,
BytesIO
,
smart_text
,
Sort
edDict
,
force_text
,
is_non_str_iterable
force_text
,
is_non_str_iterable
)
)
from
rest_framework.settings
import
api_settings
from
rest_framework.settings
import
api_settings
...
@@ -224,7 +224,7 @@ class Field(object):
...
@@ -224,7 +224,7 @@ class Field(object):
return
[
self
.
to_native
(
item
)
for
item
in
value
]
return
[
self
.
to_native
(
item
)
for
item
in
value
]
elif
isinstance
(
value
,
dict
):
elif
isinstance
(
value
,
dict
):
# Make sure we preserve field ordering, if it exists
# Make sure we preserve field ordering, if it exists
ret
=
Order
edDict
()
ret
=
Sort
edDict
()
for
key
,
val
in
value
.
items
():
for
key
,
val
in
value
.
items
():
ret
[
key
]
=
self
.
to_native
(
val
)
ret
[
key
]
=
self
.
to_native
(
val
)
return
ret
return
ret
...
@@ -239,7 +239,7 @@ class Field(object):
...
@@ -239,7 +239,7 @@ class Field(object):
return
{}
return
{}
def
metadata
(
self
):
def
metadata
(
self
):
metadata
=
Order
edDict
()
metadata
=
Sort
edDict
()
metadata
[
'type'
]
=
self
.
type_label
metadata
[
'type'
]
=
self
.
type_label
metadata
[
'required'
]
=
getattr
(
self
,
'required'
,
False
)
metadata
[
'required'
]
=
getattr
(
self
,
'required'
,
False
)
optional_attrs
=
[
'read_only'
,
'label'
,
'help_text'
,
optional_attrs
=
[
'read_only'
,
'label'
,
'help_text'
,
...
...
rest_framework/routers.py
View file @
be66e15c
...
@@ -21,7 +21,7 @@ from django.conf.urls import patterns, url
...
@@ -21,7 +21,7 @@ from django.conf.urls import patterns, url
from
django.core.exceptions
import
ImproperlyConfigured
from
django.core.exceptions
import
ImproperlyConfigured
from
django.core.urlresolvers
import
NoReverseMatch
from
django.core.urlresolvers
import
NoReverseMatch
from
rest_framework
import
views
from
rest_framework
import
views
from
rest_framework.compat
import
Order
edDict
from
rest_framework.compat
import
Sort
edDict
from
rest_framework.response
import
Response
from
rest_framework.response
import
Response
from
rest_framework.reverse
import
reverse
from
rest_framework.reverse
import
reverse
from
rest_framework.urlpatterns
import
format_suffix_patterns
from
rest_framework.urlpatterns
import
format_suffix_patterns
...
@@ -278,7 +278,7 @@ class DefaultRouter(SimpleRouter):
...
@@ -278,7 +278,7 @@ class DefaultRouter(SimpleRouter):
"""
"""
Return a view to use as the API root.
Return a view to use as the API root.
"""
"""
api_root_dict
=
Order
edDict
()
api_root_dict
=
Sort
edDict
()
list_name
=
self
.
routes
[
0
]
.
name
list_name
=
self
.
routes
[
0
]
.
name
for
prefix
,
viewset
,
basename
in
self
.
registry
:
for
prefix
,
viewset
,
basename
in
self
.
registry
:
api_root_dict
[
prefix
]
=
list_name
.
format
(
basename
=
basename
)
api_root_dict
[
prefix
]
=
list_name
.
format
(
basename
=
basename
)
...
@@ -287,7 +287,7 @@ class DefaultRouter(SimpleRouter):
...
@@ -287,7 +287,7 @@ class DefaultRouter(SimpleRouter):
_ignore_model_permissions
=
True
_ignore_model_permissions
=
True
def
get
(
self
,
request
,
*
args
,
**
kwargs
):
def
get
(
self
,
request
,
*
args
,
**
kwargs
):
ret
=
Order
edDict
()
ret
=
Sort
edDict
()
for
key
,
url_name
in
api_root_dict
.
items
():
for
key
,
url_name
in
api_root_dict
.
items
():
try
:
try
:
ret
[
key
]
=
reverse
(
ret
[
key
]
=
reverse
(
...
...
rest_framework/serializers.py
View file @
be66e15c
...
@@ -22,7 +22,7 @@ from django.forms import widgets
...
@@ -22,7 +22,7 @@ from django.forms import widgets
from
django.utils
import
six
from
django.utils
import
six
from
django.utils.functional
import
cached_property
from
django.utils.functional
import
cached_property
from
django.core.exceptions
import
ObjectDoesNotExist
from
django.core.exceptions
import
ObjectDoesNotExist
from
rest_framework.compat
import
Order
edDict
,
GenericForeignKey
from
rest_framework.compat
import
Sort
edDict
,
GenericForeignKey
from
rest_framework.settings
import
api_settings
from
rest_framework.settings
import
api_settings
...
@@ -105,20 +105,25 @@ class DictWithMetadata(dict):
...
@@ -105,20 +105,25 @@ class DictWithMetadata(dict):
return
dict
(
self
)
return
dict
(
self
)
class
OrderedDictWithMetadata
(
Order
edDict
):
class
SortedDictWithMetadata
(
Sort
edDict
):
"""
"""
A sorted dict-like object, that can have additional properties attached.
A sorted dict-like object, that can have additional properties attached.
"""
"""
def
__reduce__
(
self
):
def
__reduce__
(
self
):
return
self
.
__class__
,
(
OrderedDict
(
self
),
)
"""
Used by pickle (e.g., caching) if OrderedDict is used instead of SortedDict
Overriden to remove the metadata from the dict, since it shouldn't be
pickle and may in some instances be unpickleable.
"""
return
self
.
__class__
,
(
SortedDict
(
self
),
)
def
__getstate__
(
self
):
def
__getstate__
(
self
):
"""
"""
Used by pickle (e.g., caching)
.
Used by pickle (e.g., caching)
in SortedDict
Overriden to remove the metadata from the dict, since it shouldn't be
Overriden to remove the metadata from the dict, since it shouldn't be
pickle and may in some instances be unpickleable.
pickle and may in some instances be unpickleable.
"""
"""
return
Order
edDict
(
self
)
.
__dict__
return
Sort
edDict
(
self
)
.
__dict__
def
_is_protected_type
(
obj
):
def
_is_protected_type
(
obj
):
...
@@ -154,7 +159,7 @@ def _get_declared_fields(bases, attrs):
...
@@ -154,7 +159,7 @@ def _get_declared_fields(bases, attrs):
if
hasattr
(
base
,
'base_fields'
):
if
hasattr
(
base
,
'base_fields'
):
fields
=
list
(
base
.
base_fields
.
items
())
+
fields
fields
=
list
(
base
.
base_fields
.
items
())
+
fields
return
Order
edDict
(
fields
)
return
Sort
edDict
(
fields
)
class
SerializerMetaclass
(
type
):
class
SerializerMetaclass
(
type
):
...
@@ -182,7 +187,7 @@ class BaseSerializer(WritableField):
...
@@ -182,7 +187,7 @@ class BaseSerializer(WritableField):
pass
pass
_options_class
=
SerializerOptions
_options_class
=
SerializerOptions
_dict_class
=
Order
edDictWithMetadata
_dict_class
=
Sort
edDictWithMetadata
def
__init__
(
self
,
instance
=
None
,
data
=
None
,
files
=
None
,
def
__init__
(
self
,
instance
=
None
,
data
=
None
,
files
=
None
,
context
=
None
,
partial
=
False
,
many
=
False
,
context
=
None
,
partial
=
False
,
many
=
False
,
...
@@ -231,7 +236,7 @@ class BaseSerializer(WritableField):
...
@@ -231,7 +236,7 @@ class BaseSerializer(WritableField):
This will be the set of any explicitly declared fields,
This will be the set of any explicitly declared fields,
plus the set of fields returned by get_default_fields().
plus the set of fields returned by get_default_fields().
"""
"""
ret
=
Order
edDict
()
ret
=
Sort
edDict
()
# Get the explicitly declared fields
# Get the explicitly declared fields
base_fields
=
copy
.
deepcopy
(
self
.
base_fields
)
base_fields
=
copy
.
deepcopy
(
self
.
base_fields
)
...
@@ -247,7 +252,7 @@ class BaseSerializer(WritableField):
...
@@ -247,7 +252,7 @@ class BaseSerializer(WritableField):
# If 'fields' is specified, use those fields, in that order.
# If 'fields' is specified, use those fields, in that order.
if
self
.
opts
.
fields
:
if
self
.
opts
.
fields
:
assert
isinstance
(
self
.
opts
.
fields
,
(
list
,
tuple
)),
'`fields` must be a list or tuple'
assert
isinstance
(
self
.
opts
.
fields
,
(
list
,
tuple
)),
'`fields` must be a list or tuple'
new
=
Order
edDict
()
new
=
Sort
edDict
()
for
key
in
self
.
opts
.
fields
:
for
key
in
self
.
opts
.
fields
:
new
[
key
]
=
ret
[
key
]
new
[
key
]
=
ret
[
key
]
ret
=
new
ret
=
new
...
@@ -608,7 +613,7 @@ class BaseSerializer(WritableField):
...
@@ -608,7 +613,7 @@ class BaseSerializer(WritableField):
Useful for things like responding to OPTIONS requests, or generating
Useful for things like responding to OPTIONS requests, or generating
API schemas for auto-documentation.
API schemas for auto-documentation.
"""
"""
return
Order
edDict
(
return
Sort
edDict
(
[
[
(
field_name
,
field
.
metadata
())
(
field_name
,
field
.
metadata
())
for
field_name
,
field
in
six
.
iteritems
(
self
.
fields
)
for
field_name
,
field
in
six
.
iteritems
(
self
.
fields
)
...
@@ -685,7 +690,7 @@ class ModelSerializer(Serializer):
...
@@ -685,7 +690,7 @@ class ModelSerializer(Serializer):
self
.
__class__
.
__name__
self
.
__class__
.
__name__
)
)
opts
=
cls
.
_meta
.
concrete_model
.
_meta
opts
=
cls
.
_meta
.
concrete_model
.
_meta
ret
=
Order
edDict
()
ret
=
Sort
edDict
()
nested
=
bool
(
self
.
opts
.
depth
)
nested
=
bool
(
self
.
opts
.
depth
)
# Deal with adding the primary key field
# Deal with adding the primary key field
...
...
rest_framework/utils/encoders.py
View file @
be66e15c
...
@@ -5,8 +5,8 @@ from __future__ import unicode_literals
...
@@ -5,8 +5,8 @@ from __future__ import unicode_literals
from
django.utils
import
timezone
from
django.utils
import
timezone
from
django.db.models.query
import
QuerySet
from
django.db.models.query
import
QuerySet
from
django.utils.functional
import
Promise
from
django.utils.functional
import
Promise
from
rest_framework.compat
import
force_text
,
Order
edDict
from
rest_framework.compat
import
force_text
,
Sort
edDict
from
rest_framework.serializers
import
DictWithMetadata
,
Order
edDictWithMetadata
from
rest_framework.serializers
import
DictWithMetadata
,
Sort
edDictWithMetadata
import
datetime
import
datetime
import
decimal
import
decimal
import
types
import
types
...
@@ -66,7 +66,7 @@ else:
...
@@ -66,7 +66,7 @@ else:
class
SafeDumper
(
yaml
.
SafeDumper
):
class
SafeDumper
(
yaml
.
SafeDumper
):
"""
"""
Handles decimals as strings.
Handles decimals as strings.
Handles
Order
edDicts as usual dicts, but preserves field order, rather
Handles
Sort
edDicts as usual dicts, but preserves field order, rather
than the usual behaviour of sorting the keys.
than the usual behaviour of sorting the keys.
"""
"""
def
represent_decimal
(
self
,
data
):
def
represent_decimal
(
self
,
data
):
...
@@ -80,7 +80,7 @@ else:
...
@@ -80,7 +80,7 @@ else:
best_style
=
True
best_style
=
True
if
hasattr
(
mapping
,
'items'
):
if
hasattr
(
mapping
,
'items'
):
mapping
=
list
(
mapping
.
items
())
mapping
=
list
(
mapping
.
items
())
if
not
isinstance
(
mapping
,
Order
edDict
):
if
not
isinstance
(
mapping
,
Sort
edDict
):
mapping
.
sort
()
mapping
.
sort
()
for
item_key
,
item_value
in
mapping
:
for
item_key
,
item_value
in
mapping
:
node_key
=
self
.
represent_data
(
item_key
)
node_key
=
self
.
represent_data
(
item_key
)
...
@@ -102,7 +102,7 @@ else:
...
@@ -102,7 +102,7 @@ else:
SafeDumper
.
represent_decimal
SafeDumper
.
represent_decimal
)
)
SafeDumper
.
add_representer
(
SafeDumper
.
add_representer
(
Order
edDict
,
Sort
edDict
,
yaml
.
representer
.
SafeRepresenter
.
represent_dict
yaml
.
representer
.
SafeRepresenter
.
represent_dict
)
)
SafeDumper
.
add_representer
(
SafeDumper
.
add_representer
(
...
@@ -110,7 +110,7 @@ else:
...
@@ -110,7 +110,7 @@ else:
yaml
.
representer
.
SafeRepresenter
.
represent_dict
yaml
.
representer
.
SafeRepresenter
.
represent_dict
)
)
SafeDumper
.
add_representer
(
SafeDumper
.
add_representer
(
Order
edDictWithMetadata
,
Sort
edDictWithMetadata
,
yaml
.
representer
.
SafeRepresenter
.
represent_dict
yaml
.
representer
.
SafeRepresenter
.
represent_dict
)
)
SafeDumper
.
add_representer
(
SafeDumper
.
add_representer
(
...
...
rest_framework/views.py
View file @
be66e15c
...
@@ -7,7 +7,7 @@ from django.core.exceptions import PermissionDenied
...
@@ -7,7 +7,7 @@ from django.core.exceptions import PermissionDenied
from
django.http
import
Http404
from
django.http
import
Http404
from
django.views.decorators.csrf
import
csrf_exempt
from
django.views.decorators.csrf
import
csrf_exempt
from
rest_framework
import
status
,
exceptions
from
rest_framework
import
status
,
exceptions
from
rest_framework.compat
import
smart_text
,
HttpResponseBase
,
Order
edDict
,
View
from
rest_framework.compat
import
smart_text
,
HttpResponseBase
,
Sort
edDict
,
View
from
rest_framework.request
import
Request
from
rest_framework.request
import
Request
from
rest_framework.response
import
Response
from
rest_framework.response
import
Response
from
rest_framework.settings
import
api_settings
from
rest_framework.settings
import
api_settings
...
@@ -420,7 +420,7 @@ class APIView(View):
...
@@ -420,7 +420,7 @@ class APIView(View):
# By default we can't provide any form-like information, however the
# By default we can't provide any form-like information, however the
# generic views override this implementation and add additional
# generic views override this implementation and add additional
# information for POST and PUT methods, based on the serializer.
# information for POST and PUT methods, based on the serializer.
ret
=
Order
edDict
()
ret
=
Sort
edDict
()
ret
[
'name'
]
=
self
.
get_view_name
()
ret
[
'name'
]
=
self
.
get_view_name
()
ret
[
'description'
]
=
self
.
get_view_description
()
ret
[
'description'
]
=
self
.
get_view_description
()
ret
[
'renders'
]
=
[
renderer
.
media_type
for
renderer
in
self
.
renderer_classes
]
ret
[
'renders'
]
=
[
renderer
.
media_type
for
renderer
in
self
.
renderer_classes
]
...
...
tests/test_serializer.py
View file @
be66e15c
...
@@ -1297,7 +1297,7 @@ class SerializerPickleTests(TestCase):
...
@@ -1297,7 +1297,7 @@ class SerializerPickleTests(TestCase):
def
test_pickle_inner_serializer
(
self
):
def
test_pickle_inner_serializer
(
self
):
"""
"""
Test pickling a serializer whose resulting .data (a
Order
edDictWithMetadata) will
Test pickling a serializer whose resulting .data (a
Sort
edDictWithMetadata) will
have unpickleable meta data--in order to make sure metadata doesn't get pulled into the pickle.
have unpickleable meta data--in order to make sure metadata doesn't get pulled into the pickle.
See DictWithMetadata.__getstate__
See DictWithMetadata.__getstate__
"""
"""
...
@@ -1318,7 +1318,7 @@ class SerializerPickleTests(TestCase):
...
@@ -1318,7 +1318,7 @@ class SerializerPickleTests(TestCase):
"""
"""
Another regression test for #645.
Another regression test for #645.
"""
"""
data
=
serializers
.
Order
edDictWithMetadata
({
1
:
1
})
data
=
serializers
.
Sort
edDictWithMetadata
({
1
:
1
})
repr
(
pickle
.
loads
(
pickle
.
dumps
(
data
,
0
)))
repr
(
pickle
.
loads
(
pickle
.
dumps
(
data
,
0
)))
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment