From 0a65006bb4f3b356391de5b4258792a7bbf763e9 Mon Sep 17 00:00:00 2001 From: mrigal Date: Sat, 11 Apr 2015 01:31:54 +0200 Subject: [PATCH] replaced find_and_modify by PyMongo3 equivalents --- mongoengine/queryset/base.py | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/mongoengine/queryset/base.py b/mongoengine/queryset/base.py index 6867cef3..0ad0e03b 100644 --- a/mongoengine/queryset/base.py +++ b/mongoengine/queryset/base.py @@ -13,6 +13,7 @@ from bson import json_util import pymongo import pymongo.errors from pymongo.common import validate_read_preference +from pymongo.collection import ReturnDocument from mongoengine import signals from mongoengine.connection import get_db @@ -547,7 +548,7 @@ class BaseQuerySet(object): :param upsert: insert if document doesn't exist (default ``False``) :param full_response: return the entire response object from the - server (default ``False``) + server (default ``False``, not available for PyMongo 3+) :param remove: remove rather than updating (default ``False``) :param new: return updated rather than original document (default ``False``) @@ -565,13 +566,31 @@ class BaseQuerySet(object): queryset = self.clone() query = queryset._query - update = transform.update(queryset._document, **update) + if not remove and IS_PYMONGO_3: + update = transform.update(queryset._document, **update) sort = queryset._ordering try: - result = queryset._collection.find_and_modify( - query, update, upsert=upsert, sort=sort, remove=remove, new=new, - full_response=full_response, **self._cursor_args) + if IS_PYMONGO_3: + if full_response: + msg = ("With PyMongo 3+, it is not possible anymore to get the full response.") + warnings.warn(msg, DeprecationWarning) + if remove: + result = queryset._collection.find_one_and_delete( + query, sort=sort, **self._cursor_args) + else: + if new: + return_doc = ReturnDocument.AFTER + else: + return_doc = ReturnDocument.BEFORE + result = queryset._collection.find_one_and_update( + query, update, upsert=upsert, sort=sort, return_document=return_doc, + **self._cursor_args) + + else: + result = queryset._collection.find_and_modify( + query, update, upsert=upsert, sort=sort, remove=remove, new=new, + full_response=full_response, **self._cursor_args) except pymongo.errors.DuplicateKeyError, err: raise NotUniqueError(u"Update failed (%s)" % err) except pymongo.errors.OperationFailure, err: