From 8c3f82fb18a58b8e0983612ef3cc35b3c3950b66 Mon Sep 17 00:00:00 2001 From: Susan Dreher Date: Tue, 27 Jan 2015 16:18:51 -0500 Subject: :bug: ManyRelatedField get_value clearing field on partial update A PATCH to a serializer's non-related CharField was clearing an ancillary StringRelatedField(many=True) field. The issue appears to be in the ManyRelatedField's get_value method, which was returning a [] instead of empty when the request data was a MultiDict. This fix mirrors code in fields.py, class Field, get_value, Ln. 272, which explicitly returns empty on a partial update. Tests added to demonstrate the issue. --- tests/test_relations.py | 40 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) (limited to 'tests') diff --git a/tests/test_relations.py b/tests/test_relations.py index 62353dc2..143e835c 100644 --- a/tests/test_relations.py +++ b/tests/test_relations.py @@ -1,8 +1,13 @@ -from .utils import mock_reverse, fail_reverse, BadType, MockObject, MockQueryset +import pytest + from django.core.exceptions import ImproperlyConfigured +from django.utils.datastructures import MultiValueDict + from rest_framework import serializers +from rest_framework.fields import empty from rest_framework.test import APISimpleTestCase -import pytest + +from .utils import mock_reverse, fail_reverse, BadType, MockObject, MockQueryset class TestStringRelatedField(APISimpleTestCase): @@ -134,3 +139,34 @@ class TestSlugRelatedField(APISimpleTestCase): def test_representation(self): representation = self.field.to_representation(self.instance) assert representation == self.instance.name + + +class TestManyRelatedField(APISimpleTestCase): + def setUp(self): + self.instance = MockObject(pk=1, name='foo') + self.field = serializers.StringRelatedField(many=True) + self.field.field_name = 'foo' + + def test_get_value_regular_dictionary_full(self): + assert 'bar' == self.field.get_value({'foo': 'bar'}) + assert empty == self.field.get_value({'baz': 'bar'}) + + def test_get_value_regular_dictionary_partial(self): + setattr(self.field.root, 'partial', True) + assert 'bar' == self.field.get_value({'foo': 'bar'}) + assert empty == self.field.get_value({'baz': 'bar'}) + + def test_get_value_multi_dictionary_full(self): + mvd = MultiValueDict({'foo': ['bar1', 'bar2']}) + assert ['bar1', 'bar2'] == self.field.get_value(mvd) + + mvd = MultiValueDict({'baz': ['bar1', 'bar2']}) + assert [] == self.field.get_value(mvd) + + def test_get_value_multi_dictionary_partial(self): + setattr(self.field.root, 'partial', True) + mvd = MultiValueDict({'foo': ['bar1', 'bar2']}) + assert ['bar1', 'bar2'] == self.field.get_value(mvd) + + mvd = MultiValueDict({'baz': ['bar1', 'bar2']}) + assert empty == self.field.get_value(mvd) -- cgit v1.2.3 From 1714ceae9f468bc1479f0d7a32b0bf26ae9cf15f Mon Sep 17 00:00:00 2001 From: Susan Dreher Date: Tue, 27 Jan 2015 16:31:25 -0500 Subject: reorganize imports --- tests/test_relations.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'tests') diff --git a/tests/test_relations.py b/tests/test_relations.py index 143e835c..67f49c6b 100644 --- a/tests/test_relations.py +++ b/tests/test_relations.py @@ -1,13 +1,13 @@ -import pytest +from .utils import mock_reverse, fail_reverse, BadType, MockObject, MockQueryset from django.core.exceptions import ImproperlyConfigured from django.utils.datastructures import MultiValueDict from rest_framework import serializers from rest_framework.fields import empty -from rest_framework.test import APISimpleTestCase -from .utils import mock_reverse, fail_reverse, BadType, MockObject, MockQueryset +from rest_framework.test import APISimpleTestCase +import pytest class TestStringRelatedField(APISimpleTestCase): -- cgit v1.2.3 From e7da266a866adddd5c37453fab33812ee412752b Mon Sep 17 00:00:00 2001 From: Susan Dreher Date: Tue, 27 Jan 2015 16:32:15 -0500 Subject: reorganize imports --- tests/test_relations.py | 3 --- 1 file changed, 3 deletions(-) (limited to 'tests') diff --git a/tests/test_relations.py b/tests/test_relations.py index 67f49c6b..d478d855 100644 --- a/tests/test_relations.py +++ b/tests/test_relations.py @@ -1,11 +1,8 @@ from .utils import mock_reverse, fail_reverse, BadType, MockObject, MockQueryset - from django.core.exceptions import ImproperlyConfigured from django.utils.datastructures import MultiValueDict - from rest_framework import serializers from rest_framework.fields import empty - from rest_framework.test import APISimpleTestCase import pytest -- cgit v1.2.3