Source code for abiflows.database.mongoengine.utils
# coding: utf-8
"""
Utilities to handle mongoengine classes and connections.
"""
import contextlib
from pymatgen.util.serialization import pmg_serialize
from monty.json import MSONable
from mongoengine import connect
from mongoengine.context_managers import switch_collection
from mongoengine.connection import DEFAULT_CONNECTION_NAME
[docs]class DatabaseData(MSONable):
"""
Basic class providing data to connect to a collection in the database and switching to that collection.
Wraps mongoengine's connect and switch_collection functions.
"""
def __init__(self, database, host=None, port=None, collection=None, username=None, password=None):
"""
Args:
database: name of the database
host: the host name of the mongod instance to connect to
port: the port that the mongod instance is running on
collection: name of the collection
username: username to authenticate with
password: password to authenticate with
"""
#TODO handle multiple collections?
# note: if making collection a list (or a dict), make it safe for mutable default arguments, otherwise there
# will probably be problems with the switch_collection
self.database = database
self.host = host
self.port = port
self.collection = collection
self.username = username
self.password = password
[docs] @classmethod
def from_dict(cls, d):
d = d.copy()
d.pop("@module", None)
d.pop("@class", None)
return cls(**d)
[docs] @pmg_serialize
def as_dict(self):
return dict(database=self.database, host=self.host, port=self.port, collection=self.collection,
username=self.username, password=self.password)
[docs] @pmg_serialize
def as_dict_no_credentials(self):
return dict(database=self.database, host=self.host, port=self.port, collection=self.collection)
[docs] def connect_mongoengine(self, alias=DEFAULT_CONNECTION_NAME):
"""
Open the connection to the selected database
"""
return connect(db=self.database, host=self.host, port=self.port, username=self.username,
password=self.password, alias=alias)
[docs] @contextlib.contextmanager
def switch_collection(self, cls):
"""
Switches to the chosen collection using Mongoengine's switch_collection.
"""
if self.collection:
with switch_collection(cls, self.collection) as new_cls:
yield new_cls
else:
yield cls