From b96404516d3162c73a8766f7711e580afbd8f2a0 Mon Sep 17 00:00:00 2001 From: Tom Walker Date: Fri, 22 Nov 2013 13:42:02 +0000 Subject: [PATCH 1/3] allow default boolean values to be honoured --- rest_framework/fields.py | 3 +++ rest_framework/tests/test_serializer.py | 33 +++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 6c07dbb3b..c4667d6ce 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -185,6 +185,9 @@ class Field(object): Given and object and a field name, returns the value that should be serialized for that field. """ + if obj is None and self.default is not None: + return self.default + if obj is None: return self.empty diff --git a/rest_framework/tests/test_serializer.py b/rest_framework/tests/test_serializer.py index 1f85a4749..1d621aa2f 100644 --- a/rest_framework/tests/test_serializer.py +++ b/rest_framework/tests/test_serializer.py @@ -1720,3 +1720,36 @@ class TestSerializerTransformMethods(TestCase): 'b_renamed': None, } ) +class DefaultTrueBooleanModel(models.Model): + cat = models.BooleanField(default=True) + dog = models.BooleanField(default=True) + +class SerializerDefaultTrueBoolean(TestCase): + + def setUp(self): + super(SerializerDefaultTrueBoolean, self).setUp() + + class DefaultTrueBooleanSerializer(serializers.ModelSerializer): + class Meta: + model = DefaultTrueBooleanModel + fields = ('cat', 'dog') + + self.default_true_boolean_serializer = DefaultTrueBooleanSerializer + + def test_blank_input(self): + serializer = self.default_true_boolean_serializer() + self.assertEqual(serializer.data['dog'], True) + self.assertEqual(serializer.data['cat'], True) + + + + def test_enabled_as_false(self): + serializer = self.default_true_boolean_serializer({'cat': False, 'dog': False}) + self.assertEqual(serializer.data['cat'], False) + self.assertEqual(serializer.data['dog'], False) + + + def test_enabled_as_true(self): + serializer = self.default_true_boolean_serializer({'cat': True, 'dog': True}) + self.assertEqual(serializer.data['cat'], True) + self.assertEqual(serializer.data['dog'], True) From 4f7cd6c6528a5fd27fa86c3693762233874ab87d Mon Sep 17 00:00:00 2001 From: Tom Walker Date: Thu, 28 Nov 2013 15:58:44 +0000 Subject: [PATCH 2/3] honour default value even when field value not specified --- rest_framework/serializers.py | 2 ++ rest_framework/tests/test_serializer.py | 12 +++++++----- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/rest_framework/serializers.py b/rest_framework/serializers.py index 163abf4f0..325b73b4a 100644 --- a/rest_framework/serializers.py +++ b/rest_framework/serializers.py @@ -323,6 +323,8 @@ class BaseSerializer(WritableField): field.initialize(parent=self, field_name=field_name) key = self.get_field_key(field_name) value = field.field_to_native(obj, field_name) + if value == None and hasattr(field, 'default'): + value = field.default method = getattr(self, 'transform_%s' % field_name, None) if callable(method): value = method(obj, value) diff --git a/rest_framework/tests/test_serializer.py b/rest_framework/tests/test_serializer.py index 1d621aa2f..6cd3093f3 100644 --- a/rest_framework/tests/test_serializer.py +++ b/rest_framework/tests/test_serializer.py @@ -1722,7 +1722,7 @@ class TestSerializerTransformMethods(TestCase): ) class DefaultTrueBooleanModel(models.Model): cat = models.BooleanField(default=True) - dog = models.BooleanField(default=True) + dog = models.BooleanField(default=False) class SerializerDefaultTrueBoolean(TestCase): @@ -1738,18 +1738,20 @@ class SerializerDefaultTrueBoolean(TestCase): def test_blank_input(self): serializer = self.default_true_boolean_serializer() - self.assertEqual(serializer.data['dog'], True) self.assertEqual(serializer.data['cat'], True) - - + self.assertEqual(serializer.data['dog'], False) def test_enabled_as_false(self): serializer = self.default_true_boolean_serializer({'cat': False, 'dog': False}) self.assertEqual(serializer.data['cat'], False) self.assertEqual(serializer.data['dog'], False) - def test_enabled_as_true(self): serializer = self.default_true_boolean_serializer({'cat': True, 'dog': True}) self.assertEqual(serializer.data['cat'], True) self.assertEqual(serializer.data['dog'], True) + + def test_enabled_partial(self): + serializer = self.default_true_boolean_serializer({'cat': False}) + self.assertEqual(serializer.data['cat'], False) + self.assertEqual(serializer.data['dog'], False) From c5da67ee0d060307034d7ccb1d98256636e12825 Mon Sep 17 00:00:00 2001 From: Tom Walker Date: Thu, 28 Nov 2013 16:14:10 +0000 Subject: [PATCH 3/3] untabify --- rest_framework/tests/test_serializer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/tests/test_serializer.py b/rest_framework/tests/test_serializer.py index 6cd3093f3..a6cb78142 100644 --- a/rest_framework/tests/test_serializer.py +++ b/rest_framework/tests/test_serializer.py @@ -1752,6 +1752,6 @@ class SerializerDefaultTrueBoolean(TestCase): self.assertEqual(serializer.data['dog'], True) def test_enabled_partial(self): - serializer = self.default_true_boolean_serializer({'cat': False}) + serializer = self.default_true_boolean_serializer({'cat': False}) self.assertEqual(serializer.data['cat'], False) self.assertEqual(serializer.data['dog'], False)