Skip to content

Commit fa7510c

Browse files
author
Francesco Faraone
committed
LITE-20982 return latest db value in previous data instead of the value before the latest save
1 parent 4ef5ab7 commit fa7510c

File tree

3 files changed

+29
-7
lines changed

3 files changed

+29
-7
lines changed

dj_cqrs/mixins.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -118,11 +118,12 @@ def save(self, *args, **kwargs):
118118
def save_tracked_fields(self):
119119
if hasattr(self, FIELDS_TRACKER_FIELD_NAME):
120120
tracker = getattr(self, FIELDS_TRACKER_FIELD_NAME)
121-
if self._state.adding:
122-
data = tracker.changed_initial()
123-
else:
124-
data = tracker.changed()
125-
setattr(self, TRACKED_FIELDS_ATTR_NAME, data)
121+
if self.is_initial_cqrs_save:
122+
if self._state.adding:
123+
data = tracker.changed_initial()
124+
else:
125+
data = tracker.changed()
126+
setattr(self, TRACKED_FIELDS_ATTR_NAME, data)
126127

127128
@property
128129
def _update_cqrs_fields_default(self):

requirements/dev.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
Django >= 1.11.20
1+
Django>= 1.11.20,<4
22
pika>=1.0.0
33
kombu==4.6.*
44
ujson==3.0.0

tests/test_master/test_mixin.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -734,7 +734,7 @@ def test_transaction_instance_saved_once_simple_case(mocker):
734734

735735
mapper = (
736736
(i0.pk, 0, 'old', None),
737-
(i1.pk, 0, '2', '1'),
737+
(i1.pk, 0, '2', None),
738738
(i2.pk, 0, 'a', None),
739739
(i3.pk, 0, '.', None),
740740
(i0.pk, 1, 'new', 'old'),
@@ -749,6 +749,27 @@ def test_transaction_instance_saved_once_simple_case(mocker):
749749
assert payload.previous_data['char_field'] == expected_data[3]
750750

751751

752+
@pytest.mark.django_db(transaction=True)
753+
def test_transaction_instance_saved_multiple_times_previous_data(mocker):
754+
publisher_mock = mocker.patch('dj_cqrs.controller.producer.produce')
755+
instance = models.TrackedFieldsParentModel.objects.create(char_field='db_value')
756+
757+
with transaction.atomic():
758+
instance.refresh_from_db()
759+
instance.char_field = 'save_1'
760+
instance.save()
761+
instance.char_field = 'save_2'
762+
instance.save()
763+
764+
assert publisher_mock.call_count == 2
765+
payload_create = publisher_mock.call_args_list[0][0][0]
766+
payload_update = publisher_mock.call_args_list[1][0][0]
767+
assert payload_create.instance_data['char_field'] == 'db_value'
768+
assert payload_create.previous_data['char_field'] is None
769+
assert payload_update.instance_data['char_field'] == 'save_2'
770+
assert payload_update.previous_data['char_field'] == 'db_value'
771+
772+
752773
@pytest.mark.django_db(transaction=True)
753774
def test_cqrs_saves_count_lifecycle():
754775
instance = models.TrackedFieldsParentModel(char_field='1')

0 commit comments

Comments
 (0)