Merge pull request #1070 from touilleMan/save-condition-error

Use SaveConditionError instead of OperationError in save_condition
This commit is contained in:
Emmanuel Leblond 2015-07-19 11:18:33 +02:00
commit f8890ca841
4 changed files with 15 additions and 7 deletions

View File

@ -7,6 +7,7 @@ Changes in 0.10.1 - DEV
- Fix infinite recursion with CASCADE delete rules under specific conditions. #1046 - Fix infinite recursion with CASCADE delete rules under specific conditions. #1046
- Fix CachedReferenceField bug when loading cached docs as DBRef but failing to save them. #1047 - Fix CachedReferenceField bug when loading cached docs as DBRef but failing to save them. #1047
- Fix ignored chained options #842 - Fix ignored chained options #842
- Document save's save_condition error raises `SaveConditionError` exception #1070
Changes in 0.10.0 Changes in 0.10.0
================= =================

View File

@ -16,7 +16,8 @@ from mongoengine.base import (
ALLOW_INHERITANCE, ALLOW_INHERITANCE,
get_document get_document
) )
from mongoengine.errors import InvalidQueryError, InvalidDocumentError from mongoengine.errors import (InvalidQueryError, InvalidDocumentError,
SaveConditionError)
from mongoengine.python_support import IS_PYMONGO_3 from mongoengine.python_support import IS_PYMONGO_3
from mongoengine.queryset import (OperationError, NotUniqueError, from mongoengine.queryset import (OperationError, NotUniqueError,
QuerySet, transform) QuerySet, transform)
@ -294,6 +295,8 @@ class Document(BaseDocument):
if the condition is satisfied in the current db record. if the condition is satisfied in the current db record.
.. versionchanged:: 0.10 .. versionchanged:: 0.10
:class:`OperationError` exception raised if save_condition fails. :class:`OperationError` exception raised if save_condition fails.
.. versionchanged:: 0.10.1
:class: save_condition failure now raises a `SaveConditionError`
""" """
signals.pre_save.send(self.__class__, document=self) signals.pre_save.send(self.__class__, document=self)
@ -359,8 +362,8 @@ class Document(BaseDocument):
last_error = collection.update(select_dict, update_query, last_error = collection.update(select_dict, update_query,
upsert=upsert, **write_concern) upsert=upsert, **write_concern)
if not upsert and last_error['nModified'] == 0: if not upsert and last_error['nModified'] == 0:
raise OperationError('Race condition preventing' raise SaveConditionError('Race condition preventing'
' document update detected') ' document update detected')
created = is_new_object(last_error) created = is_new_object(last_error)
if cascade is None: if cascade is None:

View File

@ -41,6 +41,10 @@ class NotUniqueError(OperationError):
pass pass
class SaveConditionError(OperationError):
pass
class FieldDoesNotExist(Exception): class FieldDoesNotExist(Exception):
"""Raised when trying to set a field """Raised when trying to set a field
not declared in a :class:`~mongoengine.Document` not declared in a :class:`~mongoengine.Document`

View File

@ -17,7 +17,7 @@ from tests.fixtures import (PickleEmbedded, PickleTest, PickleSignalsTest,
from mongoengine import * from mongoengine import *
from mongoengine.errors import (NotRegistered, InvalidDocumentError, from mongoengine.errors import (NotRegistered, InvalidDocumentError,
InvalidQueryError, NotUniqueError, InvalidQueryError, NotUniqueError,
FieldDoesNotExist) FieldDoesNotExist, SaveConditionError)
from mongoengine.queryset import NULLIFY, Q from mongoengine.queryset import NULLIFY, Q
from mongoengine.connection import get_db from mongoengine.connection import get_db
from mongoengine.base import get_document from mongoengine.base import get_document
@ -1021,7 +1021,7 @@ class InstanceTest(unittest.TestCase):
flip(w1) flip(w1)
self.assertTrue(w1.toggle) self.assertTrue(w1.toggle)
self.assertEqual(w1.count, 1) self.assertEqual(w1.count, 1)
self.assertRaises(OperationError, self.assertRaises(SaveConditionError,
w1.save, save_condition={'save_id': UUID(42)}) w1.save, save_condition={'save_id': UUID(42)})
w1.reload() w1.reload()
self.assertFalse(w1.toggle) self.assertFalse(w1.toggle)
@ -1050,7 +1050,7 @@ class InstanceTest(unittest.TestCase):
self.assertEqual(w1.count, 2) self.assertEqual(w1.count, 2)
flip(w2) flip(w2)
flip(w2) flip(w2)
self.assertRaises(OperationError, self.assertRaises(SaveConditionError,
w2.save, save_condition={'save_id': old_id}) w2.save, save_condition={'save_id': old_id})
w2.reload() w2.reload()
self.assertFalse(w2.toggle) self.assertFalse(w2.toggle)
@ -1063,7 +1063,7 @@ class InstanceTest(unittest.TestCase):
self.assertTrue(w1.toggle) self.assertTrue(w1.toggle)
self.assertEqual(w1.count, 3) self.assertEqual(w1.count, 3)
flip(w1) flip(w1)
self.assertRaises(OperationError, self.assertRaises(SaveConditionError,
w1.save, save_condition={'count__gte': w1.count}) w1.save, save_condition={'count__gte': w1.count})
w1.reload() w1.reload()
self.assertTrue(w1.toggle) self.assertTrue(w1.toggle)