From a3e0fbd606eec9319d980dc618fbf4d17e22f508 Mon Sep 17 00:00:00 2001 From: Emmanuel Leblond Date: Wed, 15 Jul 2015 11:15:40 +0200 Subject: [PATCH 1/3] Add SaveConditionError exception --- mongoengine/document.py | 7 ++++--- mongoengine/errors.py | 4 ++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/mongoengine/document.py b/mongoengine/document.py index c5498750..70abadcc 100644 --- a/mongoengine/document.py +++ b/mongoengine/document.py @@ -16,7 +16,8 @@ from mongoengine.base import ( ALLOW_INHERITANCE, 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.queryset import (OperationError, NotUniqueError, QuerySet, transform) @@ -359,8 +360,8 @@ class Document(BaseDocument): last_error = collection.update(select_dict, update_query, upsert=upsert, **write_concern) if not upsert and last_error['nModified'] == 0: - raise OperationError('Race condition preventing' - ' document update detected') + raise SaveConditionError('Race condition preventing' + ' document update detected') created = is_new_object(last_error) if cascade is None: diff --git a/mongoengine/errors.py b/mongoengine/errors.py index b7fb7632..2c5c2946 100644 --- a/mongoengine/errors.py +++ b/mongoengine/errors.py @@ -41,6 +41,10 @@ class NotUniqueError(OperationError): pass +class SaveConditionError(OperationError): + pass + + class FieldDoesNotExist(Exception): """Raised when trying to set a field not declared in a :class:`~mongoengine.Document` From 3ffaf2c0e12ab59940baa1bec3f072b7133f1e4f Mon Sep 17 00:00:00 2001 From: Emmanuel Leblond Date: Wed, 15 Jul 2015 11:59:29 +0200 Subject: [PATCH 2/3] Correct SaveConditionError involved tests --- tests/document/instance.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/document/instance.py b/tests/document/instance.py index ea7d5668..7a393416 100644 --- a/tests/document/instance.py +++ b/tests/document/instance.py @@ -17,7 +17,7 @@ from tests.fixtures import (PickleEmbedded, PickleTest, PickleSignalsTest, from mongoengine import * from mongoengine.errors import (NotRegistered, InvalidDocumentError, InvalidQueryError, NotUniqueError, - FieldDoesNotExist) + FieldDoesNotExist, SaveConditionError) from mongoengine.queryset import NULLIFY, Q from mongoengine.connection import get_db from mongoengine.base import get_document @@ -1021,7 +1021,7 @@ class InstanceTest(unittest.TestCase): flip(w1) self.assertTrue(w1.toggle) self.assertEqual(w1.count, 1) - self.assertRaises(OperationError, + self.assertRaises(SaveConditionError, w1.save, save_condition={'save_id': UUID(42)}) w1.reload() self.assertFalse(w1.toggle) @@ -1050,7 +1050,7 @@ class InstanceTest(unittest.TestCase): self.assertEqual(w1.count, 2) flip(w2) flip(w2) - self.assertRaises(OperationError, + self.assertRaises(SaveConditionError, w2.save, save_condition={'save_id': old_id}) w2.reload() self.assertFalse(w2.toggle) @@ -1063,7 +1063,7 @@ class InstanceTest(unittest.TestCase): self.assertTrue(w1.toggle) self.assertEqual(w1.count, 3) flip(w1) - self.assertRaises(OperationError, + self.assertRaises(SaveConditionError, w1.save, save_condition={'count__gte': w1.count}) w1.reload() self.assertTrue(w1.toggle) From 0752c6b24f163cdfd763609e620dff2c31661294 Mon Sep 17 00:00:00 2001 From: Emmanuel Leblond Date: Sun, 19 Jul 2015 10:33:54 +0200 Subject: [PATCH 3/3] Update changelog for #1070 --- docs/changelog.rst | 1 + mongoengine/document.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/docs/changelog.rst b/docs/changelog.rst index c512eca0..4334ae5a 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -7,6 +7,7 @@ Changes in 0.10.1 - DEV - 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 ignored chained options #842 +- Document save's save_condition error raises `SaveConditionError` exception #1070 Changes in 0.10.0 ================= diff --git a/mongoengine/document.py b/mongoengine/document.py index 70abadcc..d68d6d65 100644 --- a/mongoengine/document.py +++ b/mongoengine/document.py @@ -295,6 +295,8 @@ class Document(BaseDocument): if the condition is satisfied in the current db record. .. versionchanged:: 0.10 :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)