aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Christie2014-01-03 13:27:00 +0000
committerTom Christie2014-01-03 13:27:00 +0000
commit399e4d9b0879288130ae2d04634802c53e5423fe (patch)
treeb8fcb60a7ba15a5e78a6170c98c4662def794d5e
parent3050f0e82a60a12dc35ef7947c2f47de12387919 (diff)
parent442916b9649baaf305ff094fe05f026ad04c7818 (diff)
downloaddjango-rest-framework-399e4d9b0879288130ae2d04634802c53e5423fe.tar.bz2
Merge branch 'master' into logo
-rw-r--r--CONTRIBUTING.md2
-rw-r--r--docs/template.html27
-rw-r--r--docs/topics/release-notes.md2
-rwxr-xr-xmkdocs.py6
-rw-r--r--rest_framework/serializers.py4
-rw-r--r--rest_framework/tests/test_genericrelations.py29
6 files changed, 43 insertions, 27 deletions
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index e0544a47..a7aa6fc4 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -67,7 +67,7 @@ To run the tests, clone the repository, and then:
# Run the tests
rest_framework/runtests/runtests.py
-You can also use the excellent `[tox][tox]` testing tool to run the tests against all supported versions of Python and Django. Install `tox` globally, and then simply run:
+You can also use the excellent [`tox`][tox] testing tool to run the tests against all supported versions of Python and Django. Install `tox` globally, and then simply run:
tox
diff --git a/docs/template.html b/docs/template.html
index c065237a..a397d067 100644
--- a/docs/template.html
+++ b/docs/template.html
@@ -170,31 +170,12 @@
<ul class="nav nav-list side-nav well sidebar-nav-fixed">
{{ toc }}
<div>
- <hr>
-
-<p><strong>The team behind REST framework is launching a new API service.</strong></p>
-
-<p>If you want to be first in line when we start issuing invitations, please sign up here:</p>
-
-<!-- Begin MailChimp Signup Form -->
-<link href="//cdn-images.mailchimp.com/embedcode/slim-081711.css" rel="stylesheet" type="text/css">
-<style type="text/css">
- #mc_embed_signup{background:#fff; clear:left; font:14px Helvetica,Arial,sans-serif; }
- /* Add your own MailChimp form style overrides in your site stylesheet or in this style block.
- We recommend moving this block and the preceding CSS link to the HEAD of your HTML file. */
-</style>
-<div id="mc_embed_signup" style="background: rgb(245, 245, 245)">
-<form action="http://dabapps.us1.list-manage1.com/subscribe/post?u=cf73a9994eb5b8d8d461b5dfb&amp;id=cb6af8e8bd" method="post" id="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form" class="validate" target="_blank" novalidate>
-<!-- <label for="mce-EMAIL">Keep me posted!</label>
- --> <input style="width: 90%" type="email" value="" name="EMAIL" class="email" id="mce-EMAIL" placeholder="email address" required>
- <div class="clear"><input class="btn btn-success" type="submit" value="Yes, keep me posted!" name="subscribe" id="mc-embedded-subscribe" class="button"></div>
-</form>
-</div>
-</style></div>
- </ul>
+{{ ad_block }}
+
+</div>
+</ul>
-<!--End mc_embed_signup-->
</div>
</div>
diff --git a/docs/topics/release-notes.md b/docs/topics/release-notes.md
index b09bd0be..ca966d20 100644
--- a/docs/topics/release-notes.md
+++ b/docs/topics/release-notes.md
@@ -98,7 +98,7 @@ You can determine your currently installed version using `pip freeze`:
class DisablePaginationMixin(object):
def get_paginate_by(self, queryset=None):
- if self.request.QUERY_PARAMS['self.paginate_by_param'] == '0':
+ if self.request.QUERY_PARAMS[self.paginate_by_param] == '0':
return None
return super(DisablePaginationMixin, self).get_paginate_by(queryset)
diff --git a/mkdocs.py b/mkdocs.py
index 09c9dcc6..92679a21 100755
--- a/mkdocs.py
+++ b/mkdocs.py
@@ -161,6 +161,12 @@ for (dirpath, dirnames, filenames) in os.walk(docs_dir):
output = output.replace('{{ page_id }}', filename[:-3])
output = output.replace('{{ canonical_url }}', canonical_url)
+ if filename =='index.md':
+ output = output.replace('{{ ad_block }}', """<hr><p><strong>The team behind REST framework is launching a new API service.</strong></p>
+<p>If you want to be first in line when we start issuing invitations, please <a href="http://brightapi.com">sign up here</a>.</p>""")
+ else:
+ output = output.replace('{{ ad_block }}', '')
+
if prev_url:
output = output.replace('{{ prev_url }}', prev_url)
output = output.replace('{{ prev_url_disabled }}', '')
diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py
index 8351b3df..b22ca578 100644
--- a/rest_framework/serializers.py
+++ b/rest_framework/serializers.py
@@ -331,7 +331,7 @@ class BaseSerializer(WritableField):
return ret
- def from_native(self, data, files):
+ def from_native(self, data, files=None):
"""
Deserialize primitives -> objects.
"""
@@ -894,7 +894,7 @@ class ModelSerializer(Serializer):
m2m_data[field_name] = attrs.pop(field_name)
# Forward m2m relations
- for field in meta.many_to_many:
+ for field in meta.many_to_many + meta.virtual_fields:
if field.name in attrs:
m2m_data[field.name] = attrs.pop(field.name)
diff --git a/rest_framework/tests/test_genericrelations.py b/rest_framework/tests/test_genericrelations.py
index c38bfb9f..2d341344 100644
--- a/rest_framework/tests/test_genericrelations.py
+++ b/rest_framework/tests/test_genericrelations.py
@@ -69,6 +69,35 @@ class TestGenericRelations(TestCase):
}
self.assertEqual(serializer.data, expected)
+ def test_generic_nested_relation(self):
+ """
+ Test saving a GenericRelation field via a nested serializer.
+ """
+
+ class TagSerializer(serializers.ModelSerializer):
+ class Meta:
+ model = Tag
+ exclude = ('content_type', 'object_id')
+
+ class BookmarkSerializer(serializers.ModelSerializer):
+ tags = TagSerializer()
+
+ class Meta:
+ model = Bookmark
+ exclude = ('id',)
+
+ data = {
+ 'url': 'https://docs.djangoproject.com/',
+ 'tags': [
+ {'tag': 'contenttypes'},
+ {'tag': 'genericrelations'},
+ ]
+ }
+ serializer = BookmarkSerializer(data=data)
+ self.assertTrue(serializer.is_valid())
+ serializer.save()
+ self.assertEqual(serializer.object.tags.count(), 2)
+
def test_generic_fk(self):
"""
Test a relationship that spans a GenericForeignKey field.