Skip to content

Commit 4687aff

Browse files
committed
Merge branch 'fix/mark-dict-field-as-dirty' of github.com:jaesivsm/mongoengine into jaesivsm__mark-dict-field-as-dirty
2 parents 4df0f8f + 29693bc commit 4687aff

File tree

2 files changed

+28
-3
lines changed

2 files changed

+28
-3
lines changed

mongoengine/base/datastructures.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ def mark_key_as_changed_wrapper(parent_method):
3131

3232
def wrapper(self, key, *args, **kwargs):
3333
# Can't use super() in the decorator.
34-
result = parent_method(self, key, *args, **kwargs)
35-
self._mark_as_changed(key)
36-
return result
34+
if not args or not key or key not in self or self[key] != args[0]:
35+
self._mark_as_changed(key)
36+
return parent_method(self, key, *args, **kwargs)
3737

3838
return wrapper
3939

tests/document/test_delta.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -952,6 +952,31 @@ class Doc(Document):
952952
assert "oops" == delta[0]["users.007.rolist"][0]["type"]
953953
assert uinfo.id == delta[0]["users.007.info"]
954954

955+
def test_delta_on_dict(self):
956+
class MyDoc(Document):
957+
dico = DictField()
958+
959+
MyDoc.drop_collection()
960+
961+
MyDoc(dico={"a": {"b": 0}}).save()
962+
963+
mydoc = MyDoc.objects.first()
964+
assert mydoc._get_changed_fields() == []
965+
mydoc.dico["a"]["b"] = 0
966+
assert mydoc._get_changed_fields() == []
967+
mydoc.dico["a"] = {"b": 0}
968+
assert mydoc._get_changed_fields() == []
969+
mydoc.dico = {"a": {"b": 0}}
970+
assert mydoc._get_changed_fields() == []
971+
mydoc.dico["a"]["c"] = 1
972+
assert mydoc._get_changed_fields() == ["dico.a.c"]
973+
mydoc.dico["a"]["b"] = 2
974+
mydoc.dico["d"] = 3
975+
assert mydoc._get_changed_fields() == ["dico.a.c", "dico.a.b", "dico.d"]
976+
977+
mydoc._clear_changed_fields()
978+
assert mydoc._get_changed_fields() == []
979+
955980

956981
if __name__ == "__main__":
957982
unittest.main()

0 commit comments

Comments
 (0)