Source code for pymodm.context_managers

# Copyright 2016 MongoDB, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.


[docs]class switch_connection(object): """Context manager that changes the active connection for a Model. Example:: connect('mongodb://.../mainDatabase', alias='main-app') connect('mongodb://.../backupDatabase', alias='backup') # 'MyModel' normally writes to 'mainDatabase'. Let's change that. with switch_connection(MyModel, 'backup'): # This goes to 'backupDatabase'. MyModel(name='Bilbo').save() """ def __init__(self, model, connection_alias): """ :parameters: - `model`: A :class:`~pymodm.MongoModel` class. - `connection_alias`: A connection alias that was set up earlier via a call to :func:`~pymodm.connection.connect`. """ self.model = model self.original_connection_alias = self.model._mongometa.connection_alias self.target_connection_alias = connection_alias def __enter__(self): self.model._mongometa.connection_alias = self.target_connection_alias return self.model def __exit__(self, typ, val, tb): self.model._mongometa.connection_alias = self.original_connection_alias
[docs]class switch_collection(object): """Context manager that changes the active collection for a Model. Example:: with switch_collection(MyModel, "other_collection"): ... """ def __init__(self, model, collection_name): """ :parameters: - `model`: A :class:`~pymodm.MongoModel` class. - `collection_name`: The name of the new collection to use. """ self.model = model self.original_collection_name = self.model._mongometa.collection_name self.target_collection_name = collection_name def __enter__(self): self.model._mongometa.collection_name = self.target_collection_name return self.model def __exit__(self, typ, val, tb): self.model._mongometa.collection_name = self.original_collection_name
[docs]class collection_options(object): """Context manager that changes the collections options for a Model. Example:: with collection_options( MyModel, read_preference=ReadPreference.SECONDARY): # Read objects off of a secondary. MyModel.objects.raw(...) """ def __init__(self, model, codec_options=None, read_preference=None, write_concern=None, read_concern=None): """ :parameters: - `model`: A :class:`~pymodm.MongoModel` class. - `codec_options`: An instance of :class:`~bson.codec_options.CodecOptions`. - `read_preference`: A read preference from the :mod:`~pymongo.read_preferences` module. - `write_concern`: An instance of :class:`~pymongo.write_concern.WriteConcern`. - `read_concern`: An instance of :class:`~pymongo.read_concern.ReadConcern`. """ self.model = model meta = self.model._mongometa self.orig_read_preference = meta.read_preference self.orig_read_concern = meta.read_concern self.orig_write_concern = meta.write_concern self.orig_codec_options = meta.codec_options self.read_preference = read_preference self.read_concern = read_concern self.write_concern = write_concern self.codec_options = codec_options def __enter__(self): meta = self.model._mongometa meta.read_preference = self.read_preference meta.read_concern = self.read_concern meta.write_concern = self.write_concern meta.codec_options = self.codec_options # Clear cached reference to Collection. self.model._mongometa._collection = None return self.model def __exit__(self, typ, val, tb): meta = self.model._mongometa meta.read_preference = self.orig_read_preference meta.read_concern = self.orig_read_concern meta.write_concern = self.orig_write_concern meta.codec_options = self.orig_codec_options self.model._mongometa._collection = None
[docs]class no_auto_dereference(object): """Context manager that turns off automatic dereferencing. Example:: >>> some_profile = UserProfile.objects.first() >>> with no_auto_dereference(UserProfile): ... some_profile.user ObjectId('5786cf1d6e32ab419952fce4') >>> some_profile.user User(name='Sammy', points=123) """ def __init__(self, model): """ :parameters: - `model`: A :class:`~pymodm.MongoModel` class. """ self.model = model self.orig_auto_deref = self.model._mongometa.auto_dereference def __enter__(self): self.model._mongometa.auto_dereference = False def __exit__(self, typ, val, tb): self.model._mongometa.auto_dereference = self.orig_auto_deref