Update transform to handle docs erroneously passed to unset (#416)

This commit is contained in:
Ross Lawley 2013-07-30 13:17:38 +00:00
parent 0c43787996
commit 5e70e1bcb2
3 changed files with 29 additions and 1 deletions

View File

@ -4,6 +4,7 @@ Changelog
Changes in 0.8.4 Changes in 0.8.4
================ ================
- Update transform to handle docs erroneously passed to unset (#416)
- Fixed indexing - turn off _cls (#414) - Fixed indexing - turn off _cls (#414)
- Fixed dereference threading issue in ComplexField.__get__ (#412) - Fixed dereference threading issue in ComplexField.__get__ (#412)
- Fixed QuerySetNoCache.count() caching (#410) - Fixed QuerySetNoCache.count() caching (#410)

View File

@ -203,11 +203,13 @@ def update(_doc_cls=None, **update):
value = field.prepare_query_value(op, value) value = field.prepare_query_value(op, value)
elif op in ('pushAll', 'pullAll'): elif op in ('pushAll', 'pullAll'):
value = [field.prepare_query_value(op, v) for v in value] value = [field.prepare_query_value(op, v) for v in value]
elif op == 'addToSet': elif op in ('addToSet', 'setOnInsert'):
if isinstance(value, (list, tuple, set)): if isinstance(value, (list, tuple, set)):
value = [field.prepare_query_value(op, v) for v in value] value = [field.prepare_query_value(op, v) for v in value]
elif field.required or value is not None: elif field.required or value is not None:
value = field.prepare_query_value(op, value) value = field.prepare_query_value(op, value)
elif op == "unset":
value = 1
if match: if match:
match = '$' + match match = '$' + match

View File

@ -31,6 +31,31 @@ class TransformTest(unittest.TestCase):
self.assertEqual(transform.query(name__exists=True), self.assertEqual(transform.query(name__exists=True),
{'name': {'$exists': True}}) {'name': {'$exists': True}})
def test_transform_update(self):
class DicDoc(Document):
dictField = DictField()
class Doc(Document):
pass
DicDoc.drop_collection()
Doc.drop_collection()
doc = Doc().save()
dic_doc = DicDoc().save()
for k, v in (("set", "$set"), ("set_on_insert", "$setOnInsert"), ("push", "$push")):
update = transform.update(DicDoc, **{"%s__dictField__test" % k: doc})
self.assertTrue(isinstance(update[v]["dictField.test"], dict))
# Update special cases
update = transform.update(DicDoc, unset__dictField__test=doc)
self.assertEqual(update["$unset"]["dictField.test"], 1)
update = transform.update(DicDoc, pull__dictField__test=doc)
self.assertTrue(isinstance(update["$pull"]["dictField"]["test"], dict))
def test_query_field_name(self): def test_query_field_name(self):
"""Ensure that the correct field name is used when querying. """Ensure that the correct field name is used when querying.
""" """