Added lock when calling doc.Delete() for when signals have no sender (#350)
This commit is contained in:
@@ -347,11 +347,10 @@ class Document(BaseDocument):
|
||||
signals.pre_delete.send(self.__class__, document=self)
|
||||
|
||||
try:
|
||||
self._qs.filter(**self._object_key).delete(write_concern=write_concern)
|
||||
self._qs.filter(**self._object_key).delete(write_concern=write_concern, _from_doc_delete=True)
|
||||
except pymongo.errors.OperationFailure, err:
|
||||
message = u'Could not delete document (%s)' % err.message
|
||||
raise OperationError(message)
|
||||
|
||||
signals.post_delete.send(self.__class__, document=self)
|
||||
|
||||
def switch_db(self, db_alias):
|
||||
|
||||
@@ -407,7 +407,7 @@ class QuerySet(object):
|
||||
self._len = count
|
||||
return count
|
||||
|
||||
def delete(self, write_concern=None):
|
||||
def delete(self, write_concern=None, _from_doc_delete=False):
|
||||
"""Delete the documents matched by the query.
|
||||
|
||||
:param write_concern: Extra keyword arguments are passed down which
|
||||
@@ -416,20 +416,25 @@ class QuerySet(object):
|
||||
``save(..., write_concern={w: 2, fsync: True}, ...)`` will
|
||||
wait until at least two servers have recorded the write and
|
||||
will force an fsync on the primary server.
|
||||
:param _from_doc_delete: True when called from document delete therefore
|
||||
signals will have been triggered so don't loop.
|
||||
"""
|
||||
queryset = self.clone()
|
||||
doc = queryset._document
|
||||
|
||||
if not write_concern:
|
||||
write_concern = {}
|
||||
|
||||
# Handle deletes where skips or limits have been applied or
|
||||
# there is an untriggered delete signal
|
||||
has_delete_signal = signals.signals_available and (
|
||||
signals.pre_delete.has_receivers_for(self._document) or
|
||||
signals.post_delete.has_receivers_for(self._document))
|
||||
|
||||
if not write_concern:
|
||||
write_concern = {}
|
||||
call_document_delete = (queryset._skip or queryset._limit or
|
||||
has_delete_signal) and not _from_doc_delete
|
||||
|
||||
# Handle deletes where skips or limits have been applied or has a
|
||||
# delete signal
|
||||
if queryset._skip or queryset._limit or has_delete_signal:
|
||||
if call_document_delete:
|
||||
for doc in queryset:
|
||||
doc.delete(write_concern=write_concern)
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user