58 lines
1.4 KiB
Python
58 lines
1.4 KiB
Python
from gvsds.app_config import getdict
|
|
|
|
_DEFAULT_APP_DB_MAP = {
|
|
'core': 'default',
|
|
'gerp': 'default',
|
|
'ugm': 'default',
|
|
'crb': 'minecraft',
|
|
'invite': 'plans',
|
|
'ccgo': 'default',
|
|
'sve': 'document',
|
|
't4': 't4pc',
|
|
'mc': 'minecraft',
|
|
'doc': 'document',
|
|
'api': 'default',
|
|
'msync': 'default',
|
|
'payment': 'default',
|
|
'commission': 'default',
|
|
'stats': 'default',
|
|
}
|
|
|
|
|
|
def _load_app_db_map():
|
|
from gvsds.app_config import items as _app_items
|
|
if _app_items('db_router'):
|
|
result = {}
|
|
for key, value in _app_items('db_router'):
|
|
result[key] = value
|
|
return result
|
|
return _DEFAULT_APP_DB_MAP
|
|
|
|
|
|
class DatabaseRouter:
|
|
app_db_map = None
|
|
model_db_map = {}
|
|
|
|
@classmethod
|
|
def _ensure_map(cls):
|
|
if cls.app_db_map is None:
|
|
cls.app_db_map = _load_app_db_map()
|
|
|
|
def _get_db(self, model):
|
|
self._ensure_map()
|
|
app_label = model._meta.app_label
|
|
if app_label in self.model_db_map:
|
|
return self.model_db_map[app_label]
|
|
return self.app_db_map.get(app_label, 'default')
|
|
|
|
def db_for_read(self, model, **hints):
|
|
return self._get_db(model)
|
|
|
|
def db_for_write(self, model, **hints):
|
|
return self._get_db(model)
|
|
|
|
def allow_migrate(self, db, app_label, model_name=None, **hints):
|
|
self._ensure_map()
|
|
target_db = self.app_db_map.get(app_label, 'default')
|
|
return db == target_db
|