Skip to content

Commit a571afb

Browse files
authored
Merge pull request #326 from bjester/pls-save-fields
Ensure dirty-bit is updated when calling save on a syncable model with `update_fields`
2 parents 398fc95 + 8106e8d commit a571afb

4 files changed

Lines changed: 29 additions & 1 deletion

File tree

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
List of the most important changes for each release.
44

5+
## 0.8.12
6+
- Fixes issue where dirty-bit isn't updated when calling save on a syncable model with `update_fields`
7+
58
## 0.8.11
69
- Adds additional `deserialization_exception` field to `Store` model to track the fully qualified exception path
710

morango/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "0.8.11"
1+
__version__ = "0.8.12"

morango/models/core.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -849,6 +849,13 @@ def save(self, update_dirty_bit_to=True, *args, **kwargs):
849849
self._morango_dirty_bit = True
850850
elif not update_dirty_bit_to:
851851
self._morango_dirty_bit = False
852+
853+
# ensure the dirty bit field is in the fields to update if present, to keep it in sync
854+
if update_dirty_bit_to is not None and kwargs.get("update_fields") is not None:
855+
kwargs["update_fields"] = set(kwargs["update_fields"]) | {
856+
"_morango_dirty_bit"
857+
}
858+
852859
super(SyncableModel, self).save(*args, **kwargs)
853860

854861
def delete(

tests/testapp/tests/integration/test_syncing_models.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,24 @@ def test_syncable_save(self):
6767
user.save(update_dirty_bit_to=None)
6868
self.assertTrue(MyUser.objects.first()._morango_dirty_bit)
6969

70+
def test_syncable_save_with_update_fields_persists_dirty_bit(self):
71+
user = MyUser.objects.first()
72+
user.save(update_dirty_bit_to=False)
73+
self.assertFalse(MyUser.objects.first()._morango_dirty_bit)
74+
75+
user.username = "updated-name"
76+
user.save(update_fields=["username"])
77+
self.assertTrue(MyUser.objects.first()._morango_dirty_bit)
78+
79+
def test_syncable_save_with_update_fields_when_to_ignore_dirty_bit(self):
80+
user = MyUser.objects.first()
81+
user.save(update_dirty_bit_to=False)
82+
self.assertFalse(MyUser.objects.first()._morango_dirty_bit)
83+
84+
user.username = "updated-name"
85+
user.save(update_dirty_bit_to=None, update_fields=["username"])
86+
self.assertFalse(MyUser.objects.first()._morango_dirty_bit)
87+
7088
def test_syncing_objects_manager_with_custom_default_manager(self):
7189
"""Test that syncing_objects manager includes all objects even when default manager filters them out"""
7290
# Create some test objects

0 commit comments

Comments
 (0)