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
eb3d4d0e
Commit
eb3d4d0e
authored
Jan 16, 2013
by
Tom Christie
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Drop bits of relations_slug tests which don't mirror existing tests.
parent
875841c7
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
46 additions
and
205 deletions
+46
-205
rest_framework/relations.py
+3
-0
rest_framework/tests/relations_hyperlink.py
+2
-0
rest_framework/tests/relations_pk.py
+0
-0
rest_framework/tests/relations_slug.py
+41
-205
No files found.
rest_framework/relations.py
View file @
eb3d4d0e
...
...
@@ -105,6 +105,9 @@ class RelatedField(WritableField):
value
=
getattr
(
obj
,
self
.
source
or
field_name
)
except
ObjectDoesNotExist
:
return
None
if
value
is
None
:
return
None
return
self
.
to_native
(
value
)
def
field_from_native
(
self
,
data
,
files
,
field_name
,
into
):
...
...
rest_framework/tests/relations_hyperlink.py
View file @
eb3d4d0e
...
...
@@ -3,6 +3,7 @@ from rest_framework import serializers
from
rest_framework.compat
import
patterns
,
url
from
rest_framework.tests.models
import
ManyToManyTarget
,
ManyToManySource
,
ForeignKeyTarget
,
ForeignKeySource
,
NullableForeignKeySource
,
OneToOneTarget
,
NullableOneToOneSource
def
dummy_view
(
request
,
pk
):
pass
...
...
@@ -16,6 +17,7 @@ urlpatterns = patterns('',
url
(
r'^nullableonetoonesource/(?P<pk>[0-9]+)/$'
,
dummy_view
,
name
=
'nullableonetoonesource-detail'
),
)
class
ManyToManyTargetSerializer
(
serializers
.
HyperlinkedModelSerializer
):
sources
=
serializers
.
ManyHyperlinkedRelatedField
(
view_name
=
'manytomanysource-detail'
)
...
...
rest_framework/tests/relations_pk.py
View file @
eb3d4d0e
rest_framework/tests/relations_slug.py
View file @
eb3d4d0e
from
django.test
import
TestCase
from
rest_framework
import
serializers
from
rest_framework.compat
import
patterns
,
url
from
rest_framework.tests.models
import
NullableForeignKeySource
,
ForeignKeyTarget
def
dummy_view
(
request
,
pk
):
pass
# Nullable ForeignKey
class
SluggedNullableForeignKeySourceSerializer
(
serializers
.
ModelSerializer
):
target
=
serializers
.
SlugRelatedField
(
slug_field
=
'name'
)
class
Meta
:
model
=
NullableForeignKeySource
class
NullOKSluggedNullableForeignKeySourceSerializer
(
serializers
.
ModelSerializer
):
class
NullableSlugSourceSerializer
(
serializers
.
ModelSerializer
):
target
=
serializers
.
SlugRelatedField
(
slug_field
=
'name'
,
null
=
True
)
class
Meta
:
model
=
NullableForeignKeySource
class
DefaultSluggedNullableForeignKeySourceSerializer
(
serializers
.
ModelSerializer
):
target
=
serializers
.
SlugRelatedField
(
slug_field
=
'name'
,
default
=
'N/A'
)
class
Meta
:
model
=
NullableForeignKeySource
class
NotRequiredSluggedNullableForeignKeySourceSerializer
(
serializers
.
ModelSerializer
):
target
=
serializers
.
SlugRelatedField
(
slug_field
=
'name'
,
required
=
False
)
class
Meta
:
model
=
NullableForeignKeySource
# TODO: M2M Tests, FKTests (Non-nulable), One2One
class
SluggedNullableForeignKeyTests
(
TestCase
):
class
SlugNullableForeignKeyTests
(
TestCase
):
def
setUp
(
self
):
target
=
ForeignKeyTarget
(
name
=
'target-1'
)
target
.
save
()
...
...
@@ -40,242 +22,96 @@ class SluggedNullableForeignKeyTests(TestCase):
source
=
NullableForeignKeySource
(
name
=
'source-
%
d'
%
idx
,
target
=
target
)
source
.
save
()
def
test_
slug_
foreign_key_retrieve_with_null
(
self
):
def
test_foreign_key_retrieve_with_null
(
self
):
queryset
=
NullableForeignKeySource
.
objects
.
all
()
default_expected
=
[
{
'name'
:
u'source-1'
,
'target'
:
'target-1'
},
{
'name'
:
u'source-2'
,
'target'
:
'target-1'
},
{
'name'
:
u'source-3'
,
'target'
:
'N/A'
},
]
serializer
=
NullableSlugSourceSerializer
(
queryset
)
expected
=
[
{
'name'
:
u'source-1'
,
'target'
:
'target-1'
},
{
'name'
:
u'source-2'
,
'target'
:
'target-1'
},
{
'name'
:
u'source-3'
,
'target'
:
None
},
{
'
id'
:
1
,
'
name'
:
u'source-1'
,
'target'
:
'target-1'
},
{
'
id'
:
2
,
'
name'
:
u'source-2'
,
'target'
:
'target-1'
},
{
'
id'
:
3
,
'
name'
:
u'source-3'
,
'target'
:
None
},
]
serializer
=
DefaultSluggedNullableForeignKeySourceSerializer
(
queryset
)
self
.
assertEquals
(
serializer
.
data
,
default_expected
)
serializer
=
NotRequiredSluggedNullableForeignKeySourceSerializer
(
queryset
)
self
.
assertEquals
(
serializer
.
data
,
expected
)
serializer
=
NullOKSluggedNullableForeignKeySourceSerializer
(
queryset
)
self
.
assertEquals
(
serializer
.
data
,
expected
)
serializer
=
SluggedNullableForeignKeySourceSerializer
(
queryset
)
#Throws
self
.
assertEquals
(
serializer
.
data
,
expected
)
def
test_slug_foreign_key_create_with_valid_null
(
self
):
data
=
{
'name'
:
u'source-4'
,
'target'
:
None
}
default_data
=
{
'name'
:
u'source-4'
,
'target'
:
'N/A'
}
serializer
=
SluggedNullableForeignKeySourceSerializer
(
data
=
data
)
self
.
assertFalse
(
serializer
.
is_valid
())
self
.
assertEquals
(
serializer
.
errors
,
{
'target'
:
[
u'Value may not be null'
]})
#If attribute not required, data should match
serializer
=
NullOKSluggedNullableForeignKeySourceSerializer
(
data
=
data
)
self
.
assertTrue
(
serializer
.
is_valid
())
obj
=
serializer
.
save
()
#BUG: Throws AttributeError: "NoneType object has no attribute 'name'"
self
.
assertEquals
(
serializer
.
data
,
data
)
self
.
assertEqual
(
obj
.
name
,
u'source-4'
)
#If default = 'N/A' then target should pass validation, and be the default ('N/A')
serializer
=
DefaultSluggedNullableForeignKeySourceSerializer
(
data
=
data
)
#BUG: test case fails
def
test_foreign_key_create_with_valid_null
(
self
):
data
=
{
'id'
:
4
,
'name'
:
u'source-4'
,
'target'
:
None
}
serializer
=
NullableSlugSourceSerializer
(
data
=
data
)
self
.
assertTrue
(
serializer
.
is_valid
())
#BUG: serializer.errors = {'target': [u'Value may not be null']}
#BUG: Serializer does not use default value to save object
obj
=
serializer
.
save
()
#BUG: Throws AttributeError - NoneType object has no attribute 'name'
self
.
assertEquals
(
serializer
.
data
,
data
)
self
.
assertEqual
(
obj
.
name
,
u'source-4'
)
#If null = True then target should be None
serializer
=
NotRequiredSluggedNullableForeignKeySourceSerializer
(
data
=
data
)
#BUG: test case fails
self
.
assertTrue
(
serializer
.
is_valid
())
#BUG: serializer.errors = {'target': [u'Value may not be null']}
#BUG: serializer does not save object (But it can because its not required)
obj
=
serializer
.
save
()
#BUG: Throws AttributeError - NoneType object has no attribute 'name'
self
.
assertEquals
(
serializer
.
data
,
data
)
self
.
assertEqual
(
obj
.
name
,
u'source-4'
)
# Ensure source 4 is created, and everything else is as expected
queryset
=
NullableForeignKeySource
.
objects
.
all
()
default_expected
=
[
{
'name'
:
u'source-1'
,
'target'
:
'target-1'
},
{
'name'
:
u'source-2'
,
'target'
:
'target-1'
},
{
'name'
:
u'source-3'
,
'target'
:
'N/A'
},
{
'name'
:
u'source-4'
,
'target'
:
'N/A'
}
]
serializer
=
NullableSlugSourceSerializer
(
queryset
)
expected
=
[
{
'name'
:
u'source-1'
,
'target'
:
'target-1'
},
{
'name'
:
u'source-2'
,
'target'
:
'target-1'
},
{
'name'
:
u'source-3'
,
'target'
:
None
},
{
'name'
:
u'source-4'
,
'target'
:
None
}
{
'
id'
:
1
,
'
name'
:
u'source-1'
,
'target'
:
'target-1'
},
{
'
id'
:
2
,
'
name'
:
u'source-2'
,
'target'
:
'target-1'
},
{
'
id'
:
3
,
'
name'
:
u'source-3'
,
'target'
:
None
},
{
'
id'
:
4
,
'
name'
:
u'source-4'
,
'target'
:
None
}
]
serializer
=
NullOKSluggedNullableForeignKeySourceSerializer
(
data
=
data
)
self
.
assertEquals
(
serializer
.
data
,
expected
)
serializer
=
NotRequiredSluggedNullableForeignKeySourceSerializer
(
data
=
data
)
self
.
assertEquals
(
serializer
.
data
,
expected
)
serializer
=
DefaultSluggedNullableForeignKeySourceSerializer
(
data
=
data
)
self
.
assertEquals
(
serializer
.
data
,
default_expected
)
def
test_
slug_
foreign_key_create_with_valid_emptystring
(
self
):
def
test_foreign_key_create_with_valid_emptystring
(
self
):
"""
The emptystring should be interpreted as null in the context
of relationships.
"""
data
=
{
'name'
:
u'source-4'
,
'target'
:
''
}
expected_data
=
{
'name'
:
u'source-4'
,
'target'
:
None
}
serializer
=
SluggedNullableForeignKeySourceSerializer
(
data
=
data
)
self
.
assertFalse
(
serializer
.
is_valid
())
self
.
assertEquals
(
serializer
.
errors
,
{
'target'
:
[
u'Value may not be null'
]})
serializer
=
NullOKSluggedNullableForeignKeySourceSerializer
(
data
=
data
)
data
=
{
'id'
:
4
,
'name'
:
u'source-4'
,
'target'
:
''
}
expected_data
=
{
'id'
:
4
,
'name'
:
u'source-4'
,
'target'
:
None
}
serializer
=
NullableSlugSourceSerializer
(
data
=
data
)
self
.
assertTrue
(
serializer
.
is_valid
())
obj
=
serializer
.
save
()
#BUG: Throws AttributeError: 'NoneType' object has no attribute 'name'
self
.
assertEquals
(
serializer
.
data
,
expected_data
)
self
.
assertEqual
(
obj
.
name
,
u'source-4'
)
serializer
=
NotRequiredSluggedNullableForeignKeySourceSerializer
(
data
=
data
)
#BUG: is_valid() is False
self
.
assertTrue
(
serializer
.
is_valid
())
obj
=
serializer
.
save
()
#BUG: Throws AttributeError: 'NoneType' object has no attribute 'name'
self
.
assertEquals
(
serializer
.
data
,
expected_data
)
self
.
assertEqual
(
obj
.
name
,
u'source-4'
)
serializer
=
DefaultSluggedNullableForeignKeySourceSerializer
(
data
=
data
)
#BUG: is_valid() is False
self
.
assertTrue
(
serializer
.
is_valid
())
obj
=
serializer
.
save
()
#BUG: Throws AttributeError: 'NoneType' object has no attribute 'name'
self
.
assertEquals
(
serializer
.
data
,
expected_data
)
self
.
assertEqual
(
obj
.
name
,
u'source-4'
)
# Ensure source 4 is created, and everything else is as expected
queryset
=
NullableForeignKeySource
.
objects
.
all
()
default_expected
=
[
{
'name'
:
u'source-1'
,
'target'
:
'target-1'
},
{
'name'
:
u'source-2'
,
'target'
:
'target-1'
},
{
'name'
:
u'source-3'
,
'target'
:
'N/A'
},
{
'name'
:
u'source-4'
,
'target'
:
'N/A'
}
]
serializer
=
NullableSlugSourceSerializer
(
queryset
)
expected
=
[
{
'name'
:
u'source-1'
,
'target'
:
'target-1'
},
{
'name'
:
u'source-2'
,
'target'
:
'target-1'
},
{
'name'
:
u'source-3'
,
'target'
:
None
},
{
'name'
:
u'source-4'
,
'target'
:
None
}
{
'
id'
:
1
,
'
name'
:
u'source-1'
,
'target'
:
'target-1'
},
{
'
id'
:
2
,
'
name'
:
u'source-2'
,
'target'
:
'target-1'
},
{
'
id'
:
3
,
'
name'
:
u'source-3'
,
'target'
:
None
},
{
'
id'
:
4
,
'
name'
:
u'source-4'
,
'target'
:
None
}
]
#BUG: All serializers fail here
serializer
=
DefaultSluggedNullableForeignKeySourceSerializer
(
queryset
)
self
.
assertEquals
(
serializer
.
data
,
default_expected
)
serializer
=
NullOKSluggedNullableForeignKeySourceSerializer
(
queryset
)
self
.
assertEquals
(
serializer
.
data
,
expected
)
serializer
=
NotRequiredSluggedNullableForeignKeySourceSerializer
(
queryset
)
self
.
assertEquals
(
serializer
.
data
,
expected
)
def
test_slug_foreign_key_update_with_valid_null
(
self
):
data
=
{
'name'
:
u'source-1'
,
'target'
:
None
}
default_data
=
{
'name'
:
u'source-1'
,
'target'
:
'N/A'
}
def
test_foreign_key_update_with_valid_null
(
self
):
data
=
{
'id'
:
1
,
'name'
:
u'source-1'
,
'target'
:
None
}
instance
=
NullableForeignKeySource
.
objects
.
get
(
pk
=
1
)
serializer
=
SluggedNullableForeignKeySourceSerializer
(
instance
,
data
=
data
)
self
.
assertFalse
(
serializer
.
is_valid
())
self
.
assertEquals
(
serializer
.
errors
,
{
'target'
:
[
u'Value may not be null'
]})
serializer
=
DefaultSluggedNullableForeignKeySourceSerializer
(
instance
,
data
=
data
)
#BUG: is_valid() is False
serializer
=
NullableSlugSourceSerializer
(
instance
,
data
=
data
)
self
.
assertTrue
(
serializer
.
is_valid
())
self
.
assertEquals
(
serializer
.
data
,
default_data
)
serializer
.
save
()
serializer
=
NullOKSluggedNullableForeignKeySourceSerializer
(
instance
,
data
=
data
)
self
.
assertTrue
(
serializer
.
is_valid
())
#BUG: Throws AttributeError: 'NoneType' object has no attribute 'name'
self
.
assertEquals
(
serializer
.
data
,
data
)
serializer
.
save
()
serializer
=
NotRequiredSluggedNullableForeignKeySourceSerializer
(
instance
,
data
=
data
)
#BUG: is_valid() is False
self
.
assertTrue
(
serializer
.
is_valid
())
#BUG: Throws AttributeError: 'NoneType' object has no attribute 'name'
self
.
assertEquals
(
serializer
.
data
,
data
)
serializer
.
save
()
# Ensure source 1 is updated, and everything else is as expected
queryset
=
NullableForeignKeySource
.
objects
.
all
()
serializer
=
NullableSlugSourceSerializer
(
queryset
)
expected
=
[
{
'name'
:
u'source-1'
,
'target'
:
None
},
{
'name'
:
u'source-2'
,
'target'
:
'target-1'
},
{
'
name'
:
u'source-3'
,
'target'
:
None
},
{
'
id'
:
1
,
'
name'
:
u'source-1'
,
'target'
:
None
},
{
'
id'
:
2
,
'
name'
:
u'source-2'
,
'target'
:
'target-1'
},
{
'
id'
:
3
,
'name'
:
u'source-3'
,
'target'
:
None
}
]
serializer
=
NullOKSluggedNullableForeignKeySourceSerializer
(
queryset
)
self
.
assertEquals
(
serializer
.
data
,
expected
)
serializer
=
NotRequiredSluggedNullableForeignKeySourceSerializer
(
queryset
)
self
.
assertEquals
(
serializer
.
data
,
expected
)
expected
=
[
{
'name'
:
u'source-1'
,
'target'
:
'N/A'
},
{
'name'
:
u'source-2'
,
'target'
:
'target-1'
},
{
'name'
:
u'source-3'
,
'target'
:
'N/A'
},
]
serializer
=
NullOKSluggedNullableForeignKeySourceSerializer
(
queryset
)
self
.
assertEquals
(
serializer
.
data
,
expected
)
def
test_slug_foreign_key_update_with_valid_emptystring
(
self
):
def
test_foreign_key_update_with_valid_emptystring
(
self
):
"""
The emptystring should be interpreted as null in the context
of relationships.
"""
data
=
{
'name'
:
u'source-1'
,
'target'
:
''
}
default_data
=
{
'name'
:
u'source-1'
,
'target'
:
'N/A'
}
expected_data
=
{
'name'
:
u'source-1'
,
'target'
:
None
}
data
=
{
'id'
:
1
,
'name'
:
u'source-1'
,
'target'
:
''
}
expected_data
=
{
'id'
:
1
,
'name'
:
u'source-1'
,
'target'
:
None
}
instance
=
NullableForeignKeySource
.
objects
.
get
(
pk
=
1
)
serializer
=
SluggedNullableForeignKeySourceSerializer
(
instance
,
data
=
data
)
self
.
assertFalse
(
serializer
.
is_valid
())
self
.
assertEquals
(
serializer
.
errors
,
{
'target'
:
[
u'Value may not be null'
]})
serializer
=
DefaultSluggedNullableForeignKeySourceSerializer
(
instance
,
data
=
data
)
#BUG: is_valid() is False
self
.
assertTrue
(
serializer
.
is_valid
())
self
.
assertEquals
(
serializer
.
data
,
default_data
)
serializer
.
save
()
serializer
=
NullOKSluggedNullableForeignKeySourceSerializer
(
instance
,
data
=
data
)
self
.
assertTrue
(
serializer
.
is_valid
())
#BUG: Throws AttributeError: 'NoneType' object has no attribute 'name'
self
.
assertEquals
(
serializer
.
data
,
data
)
serializer
.
save
()
serializer
=
NotRequiredSluggedNullableForeignKeySourceSerializer
(
instance
,
data
=
data
)
#BUG: is_valid() is False
serializer
=
NullableSlugSourceSerializer
(
instance
,
data
=
data
)
self
.
assertTrue
(
serializer
.
is_valid
())
#BUG: Throws AttributeError: 'NoneType' object has no attribute 'name'
self
.
assertEquals
(
serializer
.
data
,
data
)
self
.
assertEquals
(
serializer
.
data
,
expected_data
)
serializer
.
save
()
# Ensure source 1 is updated, and everything else is as expected
queryset
=
NullableForeignKeySource
.
objects
.
all
()
serializer
=
NullableSlugSourceSerializer
(
queryset
)
expected
=
[
{
'name'
:
u'source-1'
,
'target'
:
None
},
{
'name'
:
u'source-2'
,
'target'
:
'target-1'
},
{
'
name'
:
u'source-3'
,
'target'
:
None
},
{
'
id'
:
1
,
'
name'
:
u'source-1'
,
'target'
:
None
},
{
'
id'
:
2
,
'
name'
:
u'source-2'
,
'target'
:
'target-1'
},
{
'
id'
:
3
,
'name'
:
u'source-3'
,
'target'
:
None
}
]
serializer
=
NullOKSluggedNullableForeignKeySourceSerializer
(
queryset
)
self
.
assertEquals
(
serializer
.
data
,
expected
)
serializer
=
NotRequiredSluggedNullableForeignKeySourceSerializer
(
queryset
)
self
.
assertEquals
(
serializer
.
data
,
expected
)
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