Merge branch 'dev-bulkinsertsignal' of https://github.com/colinhowe/mongoengine into bulk
This commit is contained in:
commit
5dc998ed52
@ -93,6 +93,7 @@ Changes in v0.5
|
|||||||
way the user has specified them
|
way the user has specified them
|
||||||
- Fixed various errors
|
- Fixed various errors
|
||||||
- Added many tests
|
- Added many tests
|
||||||
|
- Added pre and post bulk-insert signals
|
||||||
|
|
||||||
Changes in v0.4
|
Changes in v0.4
|
||||||
===============
|
===============
|
||||||
|
@ -9,7 +9,7 @@ Signal support is provided by the excellent `blinker`_ library and
|
|||||||
will gracefully fall back if it is not available.
|
will gracefully fall back if it is not available.
|
||||||
|
|
||||||
|
|
||||||
The following document signals exist in MongoEngine and are pretty self explaintary:
|
The following document signals exist in MongoEngine and are pretty self explanatory:
|
||||||
|
|
||||||
* `mongoengine.signals.pre_init`
|
* `mongoengine.signals.pre_init`
|
||||||
* `mongoengine.signals.post_init`
|
* `mongoengine.signals.post_init`
|
||||||
@ -17,6 +17,8 @@ The following document signals exist in MongoEngine and are pretty self explaint
|
|||||||
* `mongoengine.signals.post_save`
|
* `mongoengine.signals.post_save`
|
||||||
* `mongoengine.signals.pre_delete`
|
* `mongoengine.signals.pre_delete`
|
||||||
* `mongoengine.signals.post_delete`
|
* `mongoengine.signals.post_delete`
|
||||||
|
* `mongoengine.signals.pre_bulk_insert`
|
||||||
|
* `mongoengine.signals.post_bulk_insert`
|
||||||
|
|
||||||
Example usage::
|
Example usage::
|
||||||
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
from connection import _get_db
|
from connection import _get_db
|
||||||
|
from mongoengine import signals
|
||||||
|
|
||||||
import pprint
|
import pprint
|
||||||
import pymongo
|
import pymongo
|
||||||
@ -829,15 +830,20 @@ class QuerySet(object):
|
|||||||
raise OperationError(msg)
|
raise OperationError(msg)
|
||||||
raw.append(doc.to_mongo())
|
raw.append(doc.to_mongo())
|
||||||
|
|
||||||
|
signals.pre_bulk_insert.send(self._document, documents=docs)
|
||||||
ids = self._collection.insert(raw)
|
ids = self._collection.insert(raw)
|
||||||
|
|
||||||
if not load_bulk:
|
if not load_bulk:
|
||||||
|
signals.post_bulk_insert.send(
|
||||||
|
self._document, documents=docs, loaded=False)
|
||||||
return return_one and ids[0] or ids
|
return return_one and ids[0] or ids
|
||||||
|
|
||||||
documents = self.in_bulk(ids)
|
documents = self.in_bulk(ids)
|
||||||
results = []
|
results = []
|
||||||
for obj_id in ids:
|
for obj_id in ids:
|
||||||
results.append(documents.get(obj_id))
|
results.append(documents.get(obj_id))
|
||||||
|
signals.post_bulk_insert.send(
|
||||||
|
self._document, documents=results, loaded=True)
|
||||||
return return_one and results[0] or results
|
return return_one and results[0] or results
|
||||||
|
|
||||||
def with_id(self, object_id):
|
def with_id(self, object_id):
|
||||||
|
@ -42,3 +42,5 @@ pre_save = _signals.signal('pre_save')
|
|||||||
post_save = _signals.signal('post_save')
|
post_save = _signals.signal('post_save')
|
||||||
pre_delete = _signals.signal('pre_delete')
|
pre_delete = _signals.signal('pre_delete')
|
||||||
post_delete = _signals.signal('post_delete')
|
post_delete = _signals.signal('post_delete')
|
||||||
|
pre_bulk_insert = _signals.signal('pre_bulk_insert')
|
||||||
|
post_bulk_insert = _signals.signal('post_bulk_insert')
|
||||||
|
@ -17,6 +17,7 @@ class SignalTests(unittest.TestCase):
|
|||||||
global signal_output
|
global signal_output
|
||||||
signal_output = []
|
signal_output = []
|
||||||
fn(*args, **kwargs)
|
fn(*args, **kwargs)
|
||||||
|
print signal_output
|
||||||
return signal_output
|
return signal_output
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
@ -56,6 +57,18 @@ class SignalTests(unittest.TestCase):
|
|||||||
@classmethod
|
@classmethod
|
||||||
def post_delete(cls, sender, document, **kwargs):
|
def post_delete(cls, sender, document, **kwargs):
|
||||||
signal_output.append('post_delete signal, %s' % document)
|
signal_output.append('post_delete signal, %s' % document)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def pre_bulk_insert(cls, sender, documents, **kwargs):
|
||||||
|
signal_output.append('pre_bulk_insert signal, %s' % documents)
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def post_bulk_insert(cls, sender, documents, **kwargs):
|
||||||
|
signal_output.append('post_bulk_insert signal, %s' % documents)
|
||||||
|
if kwargs.get('loaded', False):
|
||||||
|
signal_output.append('Is loaded')
|
||||||
|
else:
|
||||||
|
signal_output.append('Not loaded')
|
||||||
self.Author = Author
|
self.Author = Author
|
||||||
|
|
||||||
|
|
||||||
@ -104,7 +117,9 @@ class SignalTests(unittest.TestCase):
|
|||||||
len(signals.pre_save.receivers),
|
len(signals.pre_save.receivers),
|
||||||
len(signals.post_save.receivers),
|
len(signals.post_save.receivers),
|
||||||
len(signals.pre_delete.receivers),
|
len(signals.pre_delete.receivers),
|
||||||
len(signals.post_delete.receivers)
|
len(signals.post_delete.receivers),
|
||||||
|
len(signals.pre_bulk_insert.receivers),
|
||||||
|
len(signals.post_bulk_insert.receivers),
|
||||||
)
|
)
|
||||||
|
|
||||||
signals.pre_init.connect(Author.pre_init, sender=Author)
|
signals.pre_init.connect(Author.pre_init, sender=Author)
|
||||||
@ -113,6 +128,8 @@ class SignalTests(unittest.TestCase):
|
|||||||
signals.post_save.connect(Author.post_save, sender=Author)
|
signals.post_save.connect(Author.post_save, sender=Author)
|
||||||
signals.pre_delete.connect(Author.pre_delete, sender=Author)
|
signals.pre_delete.connect(Author.pre_delete, sender=Author)
|
||||||
signals.post_delete.connect(Author.post_delete, sender=Author)
|
signals.post_delete.connect(Author.post_delete, sender=Author)
|
||||||
|
signals.pre_bulk_insert.connect(Author.pre_bulk_insert, sender=Author)
|
||||||
|
signals.post_bulk_insert.connect(Author.post_bulk_insert, sender=Author)
|
||||||
|
|
||||||
signals.pre_init.connect(Another.pre_init, sender=Another)
|
signals.pre_init.connect(Another.pre_init, sender=Another)
|
||||||
signals.post_init.connect(Another.post_init, sender=Another)
|
signals.post_init.connect(Another.post_init, sender=Another)
|
||||||
@ -128,6 +145,8 @@ class SignalTests(unittest.TestCase):
|
|||||||
signals.pre_delete.disconnect(self.Author.pre_delete)
|
signals.pre_delete.disconnect(self.Author.pre_delete)
|
||||||
signals.post_save.disconnect(self.Author.post_save)
|
signals.post_save.disconnect(self.Author.post_save)
|
||||||
signals.pre_save.disconnect(self.Author.pre_save)
|
signals.pre_save.disconnect(self.Author.pre_save)
|
||||||
|
signals.pre_bulk_insert.disconnect(self.Author.pre_bulk_insert)
|
||||||
|
signals.post_bulk_insert.disconnect(self.Author.post_bulk_insert)
|
||||||
|
|
||||||
signals.pre_init.disconnect(self.Another.pre_init)
|
signals.pre_init.disconnect(self.Another.pre_init)
|
||||||
signals.post_init.disconnect(self.Another.post_init)
|
signals.post_init.disconnect(self.Another.post_init)
|
||||||
@ -143,7 +162,9 @@ class SignalTests(unittest.TestCase):
|
|||||||
len(signals.pre_save.receivers),
|
len(signals.pre_save.receivers),
|
||||||
len(signals.post_save.receivers),
|
len(signals.post_save.receivers),
|
||||||
len(signals.pre_delete.receivers),
|
len(signals.pre_delete.receivers),
|
||||||
len(signals.post_delete.receivers)
|
len(signals.post_delete.receivers),
|
||||||
|
len(signals.pre_bulk_insert.receivers),
|
||||||
|
len(signals.post_bulk_insert.receivers),
|
||||||
)
|
)
|
||||||
|
|
||||||
self.assertEqual(self.pre_signals, post_signals)
|
self.assertEqual(self.pre_signals, post_signals)
|
||||||
@ -154,6 +175,14 @@ class SignalTests(unittest.TestCase):
|
|||||||
def create_author():
|
def create_author():
|
||||||
a1 = self.Author(name='Bill Shakespeare')
|
a1 = self.Author(name='Bill Shakespeare')
|
||||||
|
|
||||||
|
def bulk_create_author_with_load():
|
||||||
|
a1 = self.Author(name='Bill Shakespeare')
|
||||||
|
self.Author.objects.insert([a1], load_bulk=True)
|
||||||
|
|
||||||
|
def bulk_create_author_without_load():
|
||||||
|
a1 = self.Author(name='Bill Shakespeare')
|
||||||
|
self.Author.objects.insert([a1], load_bulk=False)
|
||||||
|
|
||||||
self.assertEqual(self.get_signal_output(create_author), [
|
self.assertEqual(self.get_signal_output(create_author), [
|
||||||
"pre_init signal, Author",
|
"pre_init signal, Author",
|
||||||
"{'name': 'Bill Shakespeare'}",
|
"{'name': 'Bill Shakespeare'}",
|
||||||
@ -178,4 +207,25 @@ class SignalTests(unittest.TestCase):
|
|||||||
self.assertEqual(self.get_signal_output(a1.delete), [
|
self.assertEqual(self.get_signal_output(a1.delete), [
|
||||||
'pre_delete signal, William Shakespeare',
|
'pre_delete signal, William Shakespeare',
|
||||||
'post_delete signal, William Shakespeare',
|
'post_delete signal, William Shakespeare',
|
||||||
])
|
])
|
||||||
|
|
||||||
|
signal_output = self.get_signal_output(bulk_create_author_with_load)
|
||||||
|
|
||||||
|
# The output of this signal is not entirely deterministic. The reloaded
|
||||||
|
# object will have an object ID. Hence, we only check part of the output
|
||||||
|
self.assertEquals(signal_output[3],
|
||||||
|
"pre_bulk_insert signal, [<Author: Bill Shakespeare>]")
|
||||||
|
self.assertEquals(signal_output[-2:],
|
||||||
|
["post_bulk_insert signal, [<Author: Bill Shakespeare>]",
|
||||||
|
"Is loaded",])
|
||||||
|
|
||||||
|
self.assertEqual(self.get_signal_output(bulk_create_author_without_load), [
|
||||||
|
"pre_init signal, Author",
|
||||||
|
"{'name': 'Bill Shakespeare'}",
|
||||||
|
"post_init signal, Bill Shakespeare",
|
||||||
|
"pre_bulk_insert signal, [<Author: Bill Shakespeare>]",
|
||||||
|
"post_bulk_insert signal, [<Author: Bill Shakespeare>]",
|
||||||
|
"Not loaded",
|
||||||
|
])
|
||||||
|
|
||||||
|
self.Author.objects.delete()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user