Merge branch 'single-work-op' of https://github.com/njoyce/mongoengine into 211

Conflicts:
	mongoengine/document.py
	tests/test_document.py
This commit is contained in:
Ross Lawley 2013-01-28 15:05:12 +00:00
commit d90890c08e
4 changed files with 44 additions and 10 deletions

View File

@ -84,6 +84,17 @@ class BaseDocument(object):
self._initialised = True
signals.post_init.send(self.__class__, document=self)
def __delattr__(self, *args, **kwargs):
"""Handle deletions of fields"""
field_name = args[0]
if field_name in self._fields:
default = self._fields[field_name].default
if callable(default):
default = default()
setattr(self, field_name, default)
else:
super(BaseDocument, self).__delattr__(*args, **kwargs)
def __setattr__(self, name, value):
# Handle dynamic data only if an initialised dynamic document
if self._dynamic and not self._dynamic_lock:

View File

@ -250,16 +250,16 @@ class Document(BaseDocument):
return created
upsert = self._created
update_query = {}
if updates:
last_error = collection.update(select_dict,
{"$set": updates}, upsert=upsert, safe=safe,
**write_options)
created = is_new_object(last_error)
update_query["$set"] = updates
if removals:
last_error = collection.update(select_dict,
{"$unset": removals}, upsert=upsert, safe=safe,
**write_options)
created = created or is_new_object(last_error)
update_query["$unset"] = removals
if updates or removals:
last_error = collection.update(select_dict, update_query,
upsert=upsert, safe=safe, **write_options)
created = is_new_object(last_error)
warn_cascade = not cascade and 'cascade' not in self._meta
cascade = (self._meta.get('cascade', True)

View File

@ -18,7 +18,7 @@ from mongoengine.errors import (NotRegistered, InvalidDocumentError,
from mongoengine.queryset import NULLIFY, Q
from mongoengine.connection import get_db
from mongoengine.base import get_document
from mongoengine.context_managers import switch_db
from mongoengine.context_managers import switch_db, query_counter
from mongoengine import signals
TEST_IMAGE_PATH = os.path.join(os.path.dirname(__file__),
@ -971,6 +971,28 @@ class InstanceTest(unittest.TestCase):
self.assertEqual(person.age, 21)
self.assertEqual(person.active, False)
def test_set_unset_one_operation(self):
"""Ensure that $set and $unset actions are performed in the same
operation.
"""
class FooBar(Document):
foo = StringField(default=None)
bar = StringField(default=None)
FooBar.drop_collection()
# write an entity with a single prop
foo = FooBar(foo='foo').save()
self.assertEqual(foo.foo, 'foo')
del foo.foo
foo.bar = 'bar'
with query_counter() as q:
self.assertEqual(0, q)
foo.save()
self.assertEqual(1, q)
def test_save_only_changed_fields_recursive(self):
"""Ensure save only sets / unsets changed fields
"""

View File

@ -260,7 +260,8 @@ class QuerySetTest(unittest.TestCase):
name='Test User', write_options=write_options)
author.save(write_options=write_options)
self.Person.objects.update(set__name='Ross', write_options=write_options)
self.Person.objects.update(set__name='Ross',
write_options=write_options)
author = self.Person.objects.first()
self.assertEqual(author.name, 'Ross')