Skip to content

Commit

Permalink
Trigger set_modified for insert on the ListField (#364)
Browse files Browse the repository at this point in the history
  • Loading branch information
denya committed Oct 16, 2021
1 parent 7d199db commit 4f65c1c
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 4 deletions.
1 change: 1 addition & 0 deletions AUTHORS.rst
Expand Up @@ -24,3 +24,4 @@ Contributors
* Pavel Kulyov `@pkulev <https://github.com/pkulev>`_
* Felix Sonntag `@fsonntag <https://github.com/fsonntag>`_
* Attila Kóbor `@atti92 <https://github.com/atti92>`_
* Denis Moskalets `@denya <https://github.com/denya>`_
16 changes: 12 additions & 4 deletions tests/test_fields.py
Expand Up @@ -445,6 +445,12 @@ class MySchema(BaseSchema):
d.get('list').append(4)
assert d.to_mongo(update=True) == {'$set': {'in_mongo_list': [1, 2, 3, 4]}}

d.set('list', [1, 2, 3])
d.clear_modified()
d.get('list').insert(0, 42)
assert d.dump() == {'list': [42, 1, 2, 3]}
assert d.to_mongo(update=True) == {'$set': {'in_mongo_list': [42, 1, 2, 3]}}

d.clear_modified()
d.set('list', [5, 6, 7])
assert d.dump() == {'list': [5, 6, 7]}
Expand Down Expand Up @@ -585,23 +591,25 @@ class MyDoc(Document):
# Test list modification as well
refs_list = d.get('refs')
refs_list.append(to_ref_doc1)
refs_list.insert(0, to_ref_doc1)
refs_list.extend([to_ref_doc1, Reference(ToRefDoc, obj_id2)])
for e in refs_list:
assert isinstance(e, Reference)
embeds_list = d.get('embeds')
embeds_list.append(MyEmbeddedDocument(field=3))
embeds_list.insert(0, MyEmbeddedDocument(field=6))
embeds_list.extend([{'field': 4}, {'field': 5}])
for e in embeds_list:
assert isinstance(e, MyEmbeddedDocument)
# Modifying an EmbeddedDocument inside a list should count a list modification
d.clear_modified()
d.get('refs')[0] = obj_id2
d.get('refs')[1] = obj_id2
assert d.to_mongo(update=True) == {'$set': {'refs': [
obj_id2, obj_id2, obj_id1, obj_id1, obj_id2]}}
obj_id1, obj_id2, obj_id2, obj_id1, obj_id1, obj_id2]}}
d.clear_modified()
d.get('embeds')[1].field = 42
d.get('embeds')[2].field = 42
assert d.to_mongo(update=True) == {'$set': {'embeds': [
{'field': 1}, {'field': 42}, {'field': 3}, {'field': 4}, {'field': 5}]}}
{'field': 6}, {'field': 1}, {'field': 42}, {'field': 3}, {'field': 4}, {'field': 5}]}}

def test_objectid(self):

Expand Down
6 changes: 6 additions & 0 deletions umongo/data_objects.py
Expand Up @@ -31,6 +31,12 @@ def append(self, obj):
self.set_modified()
return ret

def insert(self, i, obj):
obj = self.inner_field.deserialize(obj)
ret = super().insert(i, obj)
self.set_modified()
return ret

def pop(self, *args, **kwargs):
ret = super().pop(*args, **kwargs)
self.set_modified()
Expand Down

0 comments on commit 4f65c1c

Please sign in to comment.