from django.db.models.signals import post_save from .models import UserStorage from .multi import MultiStorage class BYOStorage(MultiStorage): ''' Database driven Bring-Your-Own-Storage ''' def __init__(self, config=None): super(BYOStorage, self).__init__(config) post_save.connect(self.handle_change, sender=UserStorage) def handle_change(self, instance, **kwargs): try: del(self._cache[instance.name]) except KeyError: pass def get_storage(self, name): if name not in self._cache: # use storage from config by default if name in self.config: return super(BYOStorage, self).get_storage(name) obj = UserStorage.objects.get(name=name) self._cache[name] = obj.instance() return self._cache[name]