from django.utils.module_loading import import_string class InvalidChannelBackendError(ValueError): pass class BackendManager(object): """ Takes a settings dictionary of backends and initialises them. """ def __init__(self, backend_configs): self.configs = backend_configs self.backends = {} def make_backend(self, name): # Load the backend class try: backend_class = import_string(self.configs[name]['BACKEND']) except KeyError: raise InvalidChannelBackendError("No BACKEND specified for %s" % name) except ImportError as e: raise InvalidChannelBackendError("Cannot import BACKEND %r specified for %s" % (self.configs[name]['BACKEND'], name)) # Initialise and pass config instance = backend_class(**{k.lower(): v for k, v in self.configs[name].items() if k != "BACKEND"}) instance.alias = name return instance def __getitem__(self, key): if key not in self.backends: self.backends[key] = self.make_backend(key) return self.backends[key]