60 lines
2.2 KiB
Python
60 lines
2.2 KiB
Python
"""Database routers для направления запросов к нужным базам данных.
|
||
|
||
LdapRouter направляет все операции с LDAP моделями
|
||
(из employees.ldap.orm_models)
|
||
в LDAP database, а все остальные модели - в default PostgreSQL database.
|
||
|
||
Когда LDAP_WRITE_ENABLED=False, DATABASES["ldap"] не существует.
|
||
Router возвращает None для LDAP моделей (Django не будет выполнять запросы),
|
||
но по-прежнему запрещает миграции для них.
|
||
"""
|
||
|
||
from django.conf import settings
|
||
|
||
|
||
class LdapRouter:
|
||
"""
|
||
Database router для направления LDAP моделей в LDAP подключение.
|
||
|
||
LDAP модели (LdapUser, LdapGroup, LdapOrganizationalUnit) используются
|
||
ТОЛЬКО для записи (POST/PUT/DELETE) в LDAP через ORM.
|
||
|
||
Чтение (GET) происходит из обычных Django моделей
|
||
(Employee, Department и т.д.)
|
||
которые хранятся в PostgreSQL.
|
||
"""
|
||
|
||
ldap_models = {
|
||
"ldapuser",
|
||
"ldapgroup",
|
||
"ldaporganizationalunit",
|
||
"ldaporganizationalunitgroup",
|
||
"ldapguestuser",
|
||
}
|
||
|
||
@property
|
||
def _ldap_db_available(self):
|
||
return "ldap" in settings.DATABASES
|
||
|
||
def db_for_read(self, model, **hints):
|
||
if model._meta.model_name.lower() in self.ldap_models:
|
||
return "ldap" if self._ldap_db_available else None
|
||
return None
|
||
|
||
def db_for_write(self, model, **hints):
|
||
if model._meta.model_name.lower() in self.ldap_models:
|
||
return "ldap" if self._ldap_db_available else None
|
||
return None
|
||
|
||
def allow_relation(self, obj1, obj2, **hints):
|
||
db_obj1 = obj1._meta.model_name.lower() in self.ldap_models
|
||
db_obj2 = obj2._meta.model_name.lower() in self.ldap_models
|
||
if db_obj1 == db_obj2:
|
||
return True
|
||
return False
|
||
|
||
def allow_migrate(self, db, app_label, model_name=None, **hints):
|
||
if model_name and model_name.lower() in self.ldap_models:
|
||
return False
|
||
return db == "default"
|