From ab2ef69c6a5574dcabfaffa8331d71e5a827fba3 Mon Sep 17 00:00:00 2001 From: "Breeze.kay" Date: Wed, 3 Jun 2015 18:13:54 +0800 Subject: [PATCH 1/3] improve _created status when switch collection and db --- mongoengine/document.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mongoengine/document.py b/mongoengine/document.py index f83f9fa1..791572a4 100644 --- a/mongoengine/document.py +++ b/mongoengine/document.py @@ -477,7 +477,7 @@ class Document(BaseDocument): raise OperationError(message) signals.post_delete.send(self.__class__, document=self) - def switch_db(self, db_alias): + def switch_db(self, db_alias, keep_created=True): """ Temporarily switch the database for a document instance. @@ -499,12 +499,12 @@ class Document(BaseDocument): self._get_collection = lambda: collection self._get_db = lambda: db self._collection = collection - self._created = True + self._created = True if not keep_created else self._created self.__objects = self._qs self.__objects._collection_obj = collection return self - def switch_collection(self, collection_name): + def switch_collection(self, collection_name, keep_created=True): """ Temporarily switch the collection for a document instance. @@ -525,7 +525,7 @@ class Document(BaseDocument): collection = cls._get_collection() self._get_collection = lambda: collection self._collection = collection - self._created = True + self._created = True if not keep_created else self._created self.__objects = self._qs self.__objects._collection_obj = collection return self From dfc7f35ef1717049a2d26d1bf5a9754f016ae4de Mon Sep 17 00:00:00 2001 From: "Breeze.kay" Date: Fri, 19 Jun 2015 15:40:05 +0800 Subject: [PATCH 2/3] add testcase and changelog for pull:#1020 'improve _created status when switch collection and db' --- AUTHORS | 2 ++ docs/changelog.rst | 1 + mongoengine/document.py | 8 +++++ tests/test_signals.py | 73 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 84 insertions(+) diff --git a/AUTHORS b/AUTHORS index f64093d8..42082278 100644 --- a/AUTHORS +++ b/AUTHORS @@ -224,3 +224,5 @@ that much better: * Matthieu Rigal (https://github.com/MRigal) * Charanpal Dhanjal (https://github.com/charanpald) * Emmanuel Leblond (https://github.com/touilleMan) + * Breeze.Kay (https://github.com/9nix00) + diff --git a/docs/changelog.rst b/docs/changelog.rst index b9ad5b0e..76e68254 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -5,6 +5,7 @@ Changelog Changes in 0.9.X - DEV ====================== +- improve Document._created status when switch collection and db #1020 - Queryset update doesn't go through field validation #453 - Added support for specifying authentication source as option `authSource` in URI. #967 - Fixed mark_as_changed to handle higher/lower level fields changed. #927 diff --git a/mongoengine/document.py b/mongoengine/document.py index 654d7a4c..dec72114 100644 --- a/mongoengine/document.py +++ b/mongoengine/document.py @@ -503,6 +503,10 @@ class Document(BaseDocument): :param str db_alias: The database alias to use for saving the document + :param bool keep_created: keep self._created value after call `swith_db()` when True, + else will always set self._created value to True + + .. seealso:: Use :class:`~mongoengine.context_managers.switch_collection` if you need to read from another collection @@ -531,6 +535,10 @@ class Document(BaseDocument): :param str collection_name: The database alias to use for saving the document + :param bool keep_created: keep self._created value after call `swith_db()` when True, + else will always set self._created value to True + + .. seealso:: Use :class:`~mongoengine.context_managers.switch_db` if you need to read from another database diff --git a/tests/test_signals.py b/tests/test_signals.py index 6ab061d1..8165e255 100644 --- a/tests/test_signals.py +++ b/tests/test_signals.py @@ -279,5 +279,78 @@ class SignalTests(unittest.TestCase): # second time, it must be an update self.assertEqual(self.get_signal_output(ei.save), ['Is updated']) + def test_signals_with_switch_collection(self): + ei = self.ExplicitId(id=123) + ei.switch_collection("explicit__1") + self.assertEqual(self.get_signal_output(ei.save), ['Is created']) + ei.switch_collection("explicit__1") + self.assertEqual(self.get_signal_output(ei.save), ['Is updated']) + + ei.switch_collection("explicit__1", keep_created=False) + self.assertEqual(self.get_signal_output(ei.save), ['Is created']) + ei.switch_collection("explicit__1", keep_created=False) + self.assertEqual(self.get_signal_output(ei.save), ['Is created']) + + def test_signals_with_switch_db(self): + connect('mongoenginetest') + register_connection('testdb-1', 'mongoenginetest2') + + ei = self.ExplicitId(id=123) + ei.switch_db("testdb-1") + self.assertEqual(self.get_signal_output(ei.save), ['Is created']) + ei.switch_db("testdb-1") + self.assertEqual(self.get_signal_output(ei.save), ['Is updated']) + + ei.switch_db("testdb-1", keep_created=False) + self.assertEqual(self.get_signal_output(ei.save), ['Is created']) + ei.switch_db("testdb-1", keep_created=False) + self.assertEqual(self.get_signal_output(ei.save), ['Is created']) + + def test_signals_with_switch_sharding_db(self): + + import pymongo + from mongoengine.connection import get_connection + + connect('mongoenginetest', alias='testdb1') + expected_connection = get_connection('testdb1') + + connect('mongoenginetest', alias='testdb2') + actual_connection = get_connection('testdb2') + + if pymongo.version_tuple[0] < 3: + IS_PYMONGO_3 = False + else: + IS_PYMONGO_3 = True + + ei = self.ExplicitId(id=123) + ei.switch_db("testdb1") + self.assertEqual(self.get_signal_output(ei.save), ['Is created']) + ei.switch_db("testdb1") + self.assertEqual(self.get_signal_output(ei.save), ['Is updated']) + + ei.switch_db("testdb2", keep_created=False) + self.assertEqual(self.get_signal_output(ei.save), ['Is created']) + ei.switch_db("testdb2", keep_created=False) + self.assertEqual(self.get_signal_output(ei.save), ['Is created']) + + # Handle PyMongo 3+ Async Connection + if IS_PYMONGO_3: + # Ensure we are connected, throws ServerSelectionTimeoutError otherwise. + # Purposely not catching exception to fail test if thrown. + expected_connection.server_info() + + self.assertEqual(expected_connection, actual_connection) + + + + + + + + + + + + if __name__ == '__main__': unittest.main() From 41bff0b2932c45f9e5d0343a2c1328d7a0f1cea4 Mon Sep 17 00:00:00 2001 From: "Breeze.kay" Date: Sun, 21 Jun 2015 09:32:31 +0800 Subject: [PATCH 3/3] remove testcase:test_signals_with_switch_sharding_db() and fix code style error for pull#1020 --- docs/changelog.rst | 2 +- mongoengine/document.py | 6 ++---- tests/test_signals.py | 45 ----------------------------------------- 3 files changed, 3 insertions(+), 50 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 76e68254..55ff7754 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -5,7 +5,7 @@ Changelog Changes in 0.9.X - DEV ====================== -- improve Document._created status when switch collection and db #1020 +- Improve Document._created status when switch collection and db #1020 - Queryset update doesn't go through field validation #453 - Added support for specifying authentication source as option `authSource` in URI. #967 - Fixed mark_as_changed to handle higher/lower level fields changed. #927 diff --git a/mongoengine/document.py b/mongoengine/document.py index dec72114..0ceedfc1 100644 --- a/mongoengine/document.py +++ b/mongoengine/document.py @@ -503,8 +503,7 @@ class Document(BaseDocument): :param str db_alias: The database alias to use for saving the document - :param bool keep_created: keep self._created value after call `swith_db()` when True, - else will always set self._created value to True + :param bool keep_created: keep self._created value after switching db, else is reset to True .. seealso:: @@ -535,8 +534,7 @@ class Document(BaseDocument): :param str collection_name: The database alias to use for saving the document - :param bool keep_created: keep self._created value after call `swith_db()` when True, - else will always set self._created value to True + :param bool keep_created: keep self._created value after switching collection, else is reset to True .. seealso:: diff --git a/tests/test_signals.py b/tests/test_signals.py index 8165e255..8672925c 100644 --- a/tests/test_signals.py +++ b/tests/test_signals.py @@ -306,51 +306,6 @@ class SignalTests(unittest.TestCase): ei.switch_db("testdb-1", keep_created=False) self.assertEqual(self.get_signal_output(ei.save), ['Is created']) - def test_signals_with_switch_sharding_db(self): - - import pymongo - from mongoengine.connection import get_connection - - connect('mongoenginetest', alias='testdb1') - expected_connection = get_connection('testdb1') - - connect('mongoenginetest', alias='testdb2') - actual_connection = get_connection('testdb2') - - if pymongo.version_tuple[0] < 3: - IS_PYMONGO_3 = False - else: - IS_PYMONGO_3 = True - - ei = self.ExplicitId(id=123) - ei.switch_db("testdb1") - self.assertEqual(self.get_signal_output(ei.save), ['Is created']) - ei.switch_db("testdb1") - self.assertEqual(self.get_signal_output(ei.save), ['Is updated']) - - ei.switch_db("testdb2", keep_created=False) - self.assertEqual(self.get_signal_output(ei.save), ['Is created']) - ei.switch_db("testdb2", keep_created=False) - self.assertEqual(self.get_signal_output(ei.save), ['Is created']) - - # Handle PyMongo 3+ Async Connection - if IS_PYMONGO_3: - # Ensure we are connected, throws ServerSelectionTimeoutError otherwise. - # Purposely not catching exception to fail test if thrown. - expected_connection.server_info() - - self.assertEqual(expected_connection, actual_connection) - - - - - - - - - - - if __name__ == '__main__': unittest.main()