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
b6ee7842
Commit
b6ee7842
authored
Dec 15, 2014
by
Tom Christie
Browse files
Options
Browse Files
Download
Plain Diff
Merge master
parents
8934e61b
af53e34d
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
64 additions
and
27 deletions
+64
-27
docs/api-guide/permissions.md
+1
-1
docs/tutorial/2-requests-and-responses.md
+1
-1
rest_framework/compat.py
+17
-0
rest_framework/fields.py
+20
-6
rest_framework/serializers.py
+5
-5
rest_framework/utils/representation.py
+2
-1
rest_framework/utils/serializer_helpers.py
+4
-3
rest_framework/validators.py
+8
-6
tests/test_fields.py
+2
-2
tests/test_serializer.py
+4
-2
No files found.
docs/api-guide/permissions.md
View file @
b6ee7842
...
...
@@ -104,7 +104,7 @@ This permission is suitable if you want your API to only be accessible to regist
The `IsAdminUser` permission class will deny permission to any user, unless `user.is_staff` is `True` in which case permission will be allowed.
This permission is suitable i
s
you want your API to only be accessible to a subset of trusted administrators.
This permission is suitable i
f
you want your API to only be accessible to a subset of trusted administrators.
## IsAuthenticatedOrReadOnly
...
...
docs/tutorial/2-requests-and-responses.md
View file @
b6ee7842
...
...
@@ -181,7 +181,7 @@ Similarly, we can control the format of the request that we send, using the `Con
"id": 4,
"title": "",
"code": "print 456",
"linenos":
tru
e,
"linenos":
fals
e,
"language": "python",
"style": "friendly"
}
...
...
rest_framework/compat.py
View file @
b6ee7842
...
...
@@ -16,6 +16,23 @@ from django.utils import six
import
django
def
unicode_repr
(
instance
):
# Get the repr of an instance, but ensure it is a unicode string
# on both python 3 (already the case) and 2 (not the case).
if
six
.
PY2
:
repr
(
instance
)
.
decode
(
'utf-8'
)
return
repr
(
instance
)
def
unicode_to_repr
(
value
):
# Coerce a unicode string to the correct repr return type, depending on
# the Python version. We wrap all our `__repr__` implementations with
# this and then use unicode throughout internally.
if
six
.
PY2
:
return
value
.
encode
(
'utf-8'
)
return
value
# 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.
...
...
rest_framework/fields.py
View file @
b6ee7842
from
__future__
import
unicode_literals
from
django.conf
import
settings
from
django.core.exceptions
import
ObjectDoesNotExist
from
django.core.exceptions
import
ValidationError
as
DjangoValidationError
...
...
@@ -10,7 +11,8 @@ from django.utils.translation import ugettext_lazy as _
from
rest_framework
import
ISO_8601
from
rest_framework.compat
import
(
EmailValidator
,
MinValueValidator
,
MaxValueValidator
,
MinLengthValidator
,
MaxLengthValidator
,
URLValidator
,
OrderedDict
MinLengthValidator
,
MaxLengthValidator
,
URLValidator
,
OrderedDict
,
unicode_repr
,
unicode_to_repr
)
from
rest_framework.exceptions
import
ValidationError
from
rest_framework.settings
import
api_settings
...
...
@@ -113,7 +115,9 @@ class CreateOnlyDefault:
return
self
.
default
def
__repr__
(
self
):
return
'
%
s(
%
s)'
%
(
self
.
__class__
.
__name__
,
repr
(
self
.
default
))
return
unicode_to_repr
(
'
%
s(
%
s)'
%
(
self
.
__class__
.
__name__
,
unicode_repr
(
self
.
default
))
)
class
CurrentUserDefault
:
...
...
@@ -124,7 +128,7 @@ class CurrentUserDefault:
return
self
.
user
def
__repr__
(
self
):
return
'
%
s()'
%
self
.
__class__
.
__name__
return
unicode_to_repr
(
'
%
s()'
%
self
.
__class__
.
__name__
)
class
SkipField
(
Exception
):
...
...
@@ -382,13 +386,23 @@ class Field(object):
"""
Transform the *incoming* primitive data into a native value.
"""
raise
NotImplementedError
(
'to_internal_value() must be implemented.'
)
raise
NotImplementedError
(
'{cls}.to_internal_value() must be implemented.'
.
format
(
cls
=
self
.
__class__
.
__name__
)
)
def
to_representation
(
self
,
value
):
"""
Transform the *outgoing* native value into primitive data.
"""
raise
NotImplementedError
(
'to_representation() must be implemented.'
)
raise
NotImplementedError
(
'{cls}.to_representation() must be implemented.
\n
'
'If you are upgrading from REST framework version 2 '
'you might want `ReadOnlyField`.'
.
format
(
cls
=
self
.
__class__
.
__name__
)
)
def
fail
(
self
,
key
,
**
kwargs
):
"""
...
...
@@ -453,7 +467,7 @@ class Field(object):
This allows us to create descriptive representations for serializer
instances that show all the declared fields on the serializer.
"""
return
representation
.
field_repr
(
self
)
return
unicode_to_repr
(
representation
.
field_repr
(
self
)
)
# Boolean types...
...
...
rest_framework/serializers.py
View file @
b6ee7842
...
...
@@ -10,12 +10,11 @@ python primitives.
2. The process of marshalling between python primitives and request and
response content is handled by parsers and renderers.
"""
import
warnings
from
__future__
import
unicode_literals
from
django.db
import
models
from
django.db.models.fields
import
FieldDoesNotExist
from
django.utils.translation
import
ugettext_lazy
as
_
from
rest_framework.compat
import
unicode_to_repr
from
rest_framework.utils
import
model_meta
from
rest_framework.utils.field_mapping
import
(
get_url_kwargs
,
get_field_kwargs
,
...
...
@@ -29,6 +28,7 @@ from rest_framework.validators import (
UniqueForDateValidator
,
UniqueForMonthValidator
,
UniqueForYearValidator
,
UniqueTogetherValidator
)
import
warnings
# Note: We do the following so that users of the framework can use this style:
...
...
@@ -396,7 +396,7 @@ class Serializer(BaseSerializer):
return
attrs
def
__repr__
(
self
):
return
representation
.
serializer_repr
(
self
,
indent
=
1
)
return
unicode_to_repr
(
representation
.
serializer_repr
(
self
,
indent
=
1
)
)
# The following are used for accessing `BoundField` instances on the
# serializer, for the purposes of presenting a form-like API onto the
...
...
@@ -564,7 +564,7 @@ class ListSerializer(BaseSerializer):
return
self
.
instance
def
__repr__
(
self
):
return
representation
.
list_repr
(
self
,
indent
=
1
)
return
unicode_to_repr
(
representation
.
list_repr
(
self
,
indent
=
1
)
)
# Include a backlink to the serializer class on return objects.
# Allows renderers such as HTMLFormRenderer to get the full field info.
...
...
rest_framework/utils/representation.py
View file @
b6ee7842
...
...
@@ -6,6 +6,7 @@ from __future__ import unicode_literals
from
django.db
import
models
from
django.utils.encoding
import
force_text
from
django.utils.functional
import
Promise
from
rest_framework.compat
import
unicode_repr
import
re
...
...
@@ -25,7 +26,7 @@ def smart_repr(value):
if
isinstance
(
value
,
Promise
)
and
value
.
_delegate_text
:
value
=
force_text
(
value
)
value
=
repr
(
value
)
.
decode
(
'utf-8'
)
value
=
unicode_repr
(
value
)
# Representations like u'help text'
# should simply be presented as 'help text'
...
...
rest_framework/utils/serializer_helpers.py
View file @
b6ee7842
from
__future__
import
unicode_literals
import
collections
from
rest_framework.compat
import
OrderedDict
from
rest_framework.compat
import
OrderedDict
,
unicode_to_repr
class
ReturnDict
(
OrderedDict
):
...
...
@@ -47,9 +48,9 @@ class BoundField(object):
return
self
.
_field
.
__class__
def
__repr__
(
self
):
return
'<
%
s value=
%
s errors=
%
s>'
%
(
return
unicode_to_repr
(
'<
%
s value=
%
s errors=
%
s>'
%
(
self
.
__class__
.
__name__
,
self
.
value
,
self
.
errors
)
)
)
class
NestedBoundField
(
BoundField
):
...
...
rest_framework/validators.py
View file @
b6ee7842
...
...
@@ -6,7 +6,9 @@ This gives us better separation of concerns, allows us to use single-step
object creation, and makes it possible to switch between using the implicit
`ModelSerializer` class and an equivalent explicit `Serializer` class.
"""
from
__future__
import
unicode_literals
from
django.utils.translation
import
ugettext_lazy
as
_
from
rest_framework.compat
import
unicode_to_repr
from
rest_framework.exceptions
import
ValidationError
from
rest_framework.utils.representation
import
smart_repr
...
...
@@ -59,10 +61,10 @@ class UniqueValidator:
raise
ValidationError
(
self
.
message
)
def
__repr__
(
self
):
return
'<
%
s(queryset=
%
s)>'
%
(
return
unicode_to_repr
(
'<
%
s(queryset=
%
s)>'
%
(
self
.
__class__
.
__name__
,
smart_repr
(
self
.
queryset
)
)
)
)
class
UniqueTogetherValidator
:
...
...
@@ -141,11 +143,11 @@ class UniqueTogetherValidator:
raise
ValidationError
(
self
.
message
.
format
(
field_names
=
field_names
))
def
__repr__
(
self
):
return
'<
%
s(queryset=
%
s, fields=
%
s)>'
%
(
return
unicode_to_repr
(
'<
%
s(queryset=
%
s, fields=
%
s)>'
%
(
self
.
__class__
.
__name__
,
smart_repr
(
self
.
queryset
),
smart_repr
(
self
.
fields
)
)
)
)
class
BaseUniqueForValidator
:
...
...
@@ -205,12 +207,12 @@ class BaseUniqueForValidator:
raise
ValidationError
({
self
.
field
:
message
})
def
__repr__
(
self
):
return
'<
%
s(queryset=
%
s, field=
%
s, date_field=
%
s)>'
%
(
return
unicode_to_repr
(
'<
%
s(queryset=
%
s, field=
%
s, date_field=
%
s)>'
%
(
self
.
__class__
.
__name__
,
smart_repr
(
self
.
queryset
),
smart_repr
(
self
.
field
),
smart_repr
(
self
.
date_field
)
)
)
)
class
UniqueForDateValidator
(
BaseUniqueForValidator
):
...
...
tests/test_fields.py
View file @
b6ee7842
...
...
@@ -62,7 +62,7 @@ class TestEmpty:
"""
field
=
serializers
.
CharField
(
allow_blank
=
True
)
output
=
field
.
run_validation
(
''
)
assert
output
is
''
assert
output
==
''
def
test_default
(
self
):
"""
...
...
@@ -817,7 +817,7 @@ class TestChoiceField(FieldValues):
]
)
output
=
field
.
run_validation
(
''
)
assert
output
is
''
assert
output
==
''
class
TestChoiceFieldWithType
(
FieldValues
):
...
...
tests/test_serializer.py
View file @
b6ee7842
# coding: utf-8
from
__future__
import
unicode_literals
from
rest_framework
import
serializers
from
rest_framework.compat
import
unicode_repr
import
pytest
...
...
@@ -208,9 +209,10 @@ class TestUnicodeRepr:
class
ExampleObject
:
def
__init__
(
self
):
self
.
example
=
'한국'
def
__repr__
(
self
):
return
self
.
example
.
encode
(
'utf8'
)
return
unicode_repr
(
self
.
example
)
instance
=
ExampleObject
()
serializer
=
ExampleSerializer
(
instance
)
repr
(
serializer
)
repr
(
serializer
)
# Should not error.
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