diff --git a/docs/changelog.rst b/docs/changelog.rst index 8c789eb6..ee7a1284 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -4,6 +4,7 @@ Changelog Changes in 0.6.X ================ +- Bug fix Read preference now passed correctly - Added support for File like objects for GridFS - Fix for #473 - Dereferencing abstracts diff --git a/mongoengine/connection.py b/mongoengine/connection.py index 96b8100d..7585c734 100644 --- a/mongoengine/connection.py +++ b/mongoengine/connection.py @@ -63,7 +63,8 @@ def register_connection(alias, name, host='localhost', port=27017, 'password': uri_dict.get('password'), 'read_preference': read_preference, }) - + if "replicaSet" in host: + conn_settings['replicaSet'] = True _connection_settings[alias] = conn_settings @@ -112,7 +113,11 @@ def get_connection(alias=DEFAULT_CONNECTION_NAME, reconnect=False): conn_settings['hosts_or_uri'] = conn_settings.pop('host', None) # Discard port since it can't be used on ReplicaSetConnection conn_settings.pop('port', None) + # Discard replicaSet if not base string + if not isinstance(conn_settings['replicaSet'], basestring): + conn_settings.pop('replicaSet', None) connection_class = ReplicaSetConnection + try: _connections[alias] = connection_class(**conn_settings) except Exception, e: diff --git a/tests/replicaset_connection.py b/tests/replicaset_connection.py new file mode 100644 index 00000000..c8a3bbf4 --- /dev/null +++ b/tests/replicaset_connection.py @@ -0,0 +1,28 @@ +import unittest +import pymongo +from pymongo import ReadPreference + +import mongoengine +from mongoengine import * +from mongoengine.connection import get_db, get_connection, ConnectionError + + +class ConnectionTest(unittest.TestCase): + + def tearDown(self): + mongoengine.connection._connection_settings = {} + mongoengine.connection._connections = {} + mongoengine.connection._dbs = {} + + def test_replicaset_uri_passes_read_preference(self): + """Requires a replica set called "rs" on port 27017 + """ + try: + conn = connect(db='mongoenginetest', host="mongodb://localhost/mongoenginetest?replicaSet=rs", read_preference=ReadPreference.SECONDARY_ONLY) + except ConnectionError, e: + return + + self.assertEquals(conn.read_preference, ReadPreference.SECONDARY_ONLY) + +if __name__ == '__main__': + unittest.main()