From 2d6d20def70dacf4ea783e5a0c8a72266e603bb7 Mon Sep 17 00:00:00 2001 From: Russell Keith-Magee Date: Thu, 12 Jul 2007 07:45:35 +0000 Subject: Fixed #4459 -- Added 'raw' argument to save method, to override any pre-save processing, and modified serializers to use a raw-save. This enables serialization of DateFields with auto_now/auto_now_add. Also modified serializers to invoke save() directly on the model baseclass, to avoid any (potentially order-dependent, data modifying) behavior in a custom save() method. git-svn-id: http://code.djangoproject.com/svn/django/trunk@5658 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- .../regressiontests/serializers_regress/models.py | 13 ++++++++++++ tests/regressiontests/serializers_regress/tests.py | 24 ++++++++++++++-------- 2 files changed, 28 insertions(+), 9 deletions(-) (limited to 'tests') diff --git a/tests/regressiontests/serializers_regress/models.py b/tests/regressiontests/serializers_regress/models.py index b441885f10..268fa052e6 100644 --- a/tests/regressiontests/serializers_regress/models.py +++ b/tests/regressiontests/serializers_regress/models.py @@ -209,3 +209,16 @@ class ComplexModel(models.Model): field1 = models.CharField(maxlength=10) field2 = models.CharField(maxlength=10) field3 = models.CharField(maxlength=10) + +# Tests for handling fields with pre_save functions, or +# models with save functions that modify data +class AutoNowDateTimeData(models.Model): + data = models.DateTimeField(null=True, auto_now=True) + +class ModifyingSaveData(models.Model): + data = models.IntegerField(null=True) + + def save(self): + "A save method that modifies the data in the object" + self.data = 666 + super(ModifyingSaveData, self).save(raw) diff --git a/tests/regressiontests/serializers_regress/tests.py b/tests/regressiontests/serializers_regress/tests.py index 7c6da9d356..30fd20a80c 100644 --- a/tests/regressiontests/serializers_regress/tests.py +++ b/tests/regressiontests/serializers_regress/tests.py @@ -24,17 +24,20 @@ except ImportError: from django.utils import _decimal as decimal # A set of functions that can be used to recreate -# test data objects of various kinds +# test data objects of various kinds. +# The save method is a raw base model save, to make +# sure that the data in the database matches the +# exact test case. def data_create(pk, klass, data): instance = klass(id=pk) instance.data = data - instance.save() + models.Model.save(instance, raw=True) return instance def generic_create(pk, klass, data): instance = klass(id=pk) instance.data = data[0] - instance.save() + models.Model.save(instance, raw=True) for tag in data[1:]: instance.tags.create(data=tag) return instance @@ -42,25 +45,25 @@ def generic_create(pk, klass, data): def fk_create(pk, klass, data): instance = klass(id=pk) setattr(instance, 'data_id', data) - instance.save() + models.Model.save(instance, raw=True) return instance def m2m_create(pk, klass, data): instance = klass(id=pk) - instance.save() + models.Model.save(instance, raw=True) instance.data = data return instance def o2o_create(pk, klass, data): instance = klass() instance.data_id = data - instance.save() + models.Model.save(instance, raw=True) return instance def pk_create(pk, klass, data): instance = klass() instance.data = data - instance.save() + models.Model.save(instance, raw=True) return instance # A set of functions that can be used to compare @@ -249,6 +252,9 @@ The end."""), # (pk_obj, 770, TimePKData, datetime.time(10,42,37)), (pk_obj, 780, USStatePKData, "MA"), # (pk_obj, 790, XMLPKData, ""), + + (data_obj, 800, AutoNowDateTimeData, datetime.datetime(2006,6,16,10,42,37)), + (data_obj, 810, ModifyingSaveData, 42), ] # Because Oracle treats the empty string as NULL, Oracle is expected to fail @@ -303,7 +309,7 @@ def fieldsTest(format, self): management.flush(verbosity=0, interactive=False) obj = ComplexModel(field1='first',field2='second',field3='third') - obj.save() + obj.save(raw=True) # Serialize then deserialize the test database serialized_data = serializers.serialize(format, [obj], indent=2, fields=('field1','field3')) @@ -319,7 +325,7 @@ def streamTest(format, self): management.flush(verbosity=0, interactive=False) obj = ComplexModel(field1='first',field2='second',field3='third') - obj.save() + obj.save(raw=True) # Serialize the test database to a stream stream = StringIO() -- cgit v1.3