From a19b159f6ea47728126bcd347f2dbf6d7a81c584 Mon Sep 17 00:00:00 2001 From: Darren Date: Sat, 28 Jul 2018 15:57:02 +0800 Subject: [PATCH 1/2] Fix UDT value update --- cassandra/cqlengine/columns.py | 8 +++----- .../cqlengine/model/test_updates.py | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/cassandra/cqlengine/columns.py b/cassandra/cqlengine/columns.py index 5808f60613..bae4b7b906 100644 --- a/cassandra/cqlengine/columns.py +++ b/cassandra/cqlengine/columns.py @@ -979,15 +979,13 @@ def to_database(self, value): class UDTValueManager(BaseValueManager): @property def changed(self): - if self.explicit: - return self.value != self.previous_value + if self.explicit or self.previous_value is not None: + return self.value != self.previous_value or \ + (self.value is not None and self.value.has_changed_fields()) default_value = self.column.get_default() if not self.column._val_is_null(default_value): return self.value != default_value - elif self.previous_value is None: - return not self.column._val_is_null(self.value) and self.value.has_changed_fields() - return False def reset_previous_value(self): diff --git a/tests/integration/cqlengine/model/test_updates.py b/tests/integration/cqlengine/model/test_updates.py index 17eed8ddd9..8c67043418 100644 --- a/tests/integration/cqlengine/model/test_updates.py +++ b/tests/integration/cqlengine/model/test_updates.py @@ -346,6 +346,24 @@ def test_collection_with_default(self): self.assertEqual(ModelWithDefaultCollection.objects.get(id=2)._as_dict(), {'id': 2, 'dummy': 2, 'mf': {1: 1, 4: 4}, "udt": udt, "udt_default": udt_default}) + # test update udt object + udt_default.age = 2 + item.update(udt_default=udt_default) + self.assertEqual(ModelWithDefaultCollection.objects.get(id=2)._as_dict(), item._as_dict()) + self.assertEqual(ModelWithDefaultCollection.objects.get(id=2)._as_dict(), + {'id': 2, 'dummy': 2, 'mf': {1: 1, 4: 4}, "udt": udt, "udt_default": udt_default}) + + udt_default.age = 3 + item.save() + self.assertEqual(ModelWithDefaultCollection.objects.get(id=2)._as_dict(), item._as_dict()) + self.assertEqual(ModelWithDefaultCollection.objects.get(id=2)._as_dict(), + {'id': 2, 'dummy': 2, 'mf': {1: 1, 4: 4}, "udt": udt, "udt_default": udt_default}) + + udt_default.age = 1 + item.save() + self.assertEqual(ModelWithDefaultCollection.objects.get(id=2)._as_dict(), item._as_dict()) + self.assertEqual(ModelWithDefaultCollection.objects.get(id=2)._as_dict(), + {'id': 2, 'dummy': 2, 'mf': {1: 1, 4: 4}, "udt": udt, "udt_default": udt_default}) def test_udt_to_python(self): """ From 2693a6eca26ff28a61e35d17a475f5eec787d342 Mon Sep 17 00:00:00 2001 From: Darren Date: Sat, 28 Jul 2018 15:59:58 +0800 Subject: [PATCH 2/2] Add comments for tests --- tests/integration/cqlengine/model/test_updates.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/integration/cqlengine/model/test_updates.py b/tests/integration/cqlengine/model/test_updates.py index 8c67043418..beaa396731 100644 --- a/tests/integration/cqlengine/model/test_updates.py +++ b/tests/integration/cqlengine/model/test_updates.py @@ -346,19 +346,21 @@ def test_collection_with_default(self): self.assertEqual(ModelWithDefaultCollection.objects.get(id=2)._as_dict(), {'id': 2, 'dummy': 2, 'mf': {1: 1, 4: 4}, "udt": udt, "udt_default": udt_default}) - # test update udt object + # test update udt fields udt_default.age = 2 item.update(udt_default=udt_default) self.assertEqual(ModelWithDefaultCollection.objects.get(id=2)._as_dict(), item._as_dict()) self.assertEqual(ModelWithDefaultCollection.objects.get(id=2)._as_dict(), {'id': 2, 'dummy': 2, 'mf': {1: 1, 4: 4}, "udt": udt, "udt_default": udt_default}) + # test update udt fields implicitly udt_default.age = 3 item.save() self.assertEqual(ModelWithDefaultCollection.objects.get(id=2)._as_dict(), item._as_dict()) self.assertEqual(ModelWithDefaultCollection.objects.get(id=2)._as_dict(), {'id': 2, 'dummy': 2, 'mf': {1: 1, 4: 4}, "udt": udt, "udt_default": udt_default}) + # test update udt fields to default value implicitly udt_default.age = 1 item.save() self.assertEqual(ModelWithDefaultCollection.objects.get(id=2)._as_dict(), item._as_dict())