67 lines
2.7 KiB
Python
67 lines
2.7 KiB
Python
"""Database routers для направления запросов к нужным базам данных.
|
||
|
||
LdapRouter направляет все операции с LDAP моделями (из employees.ldap.orm_models)
|
||
в LDAP database, а все остальные модели - в default PostgreSQL database.
|
||
"""
|
||
|
||
|
||
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',
|
||
}
|
||
|
||
def db_for_read(self, model, **hints):
|
||
"""
|
||
Направляет READ операции для LDAP моделей в 'ldap' database.
|
||
"""
|
||
if model._meta.model_name.lower() in self.ldap_models:
|
||
return 'ldap'
|
||
return None # Используем default database
|
||
|
||
def db_for_write(self, model, **hints):
|
||
"""
|
||
Направляет WRITE операции для LDAP моделей в 'ldap' database.
|
||
"""
|
||
if model._meta.model_name.lower() in self.ldap_models:
|
||
return 'ldap'
|
||
return None # Используем default database
|
||
|
||
def allow_relation(self, obj1, obj2, **hints):
|
||
"""
|
||
Разрешает отношения между моделями только если они в одной базе.
|
||
LDAP модели не могут иметь ForeignKey к Django моделям.
|
||
"""
|
||
db_obj1 = obj1._meta.model_name.lower() in self.ldap_models
|
||
db_obj2 = obj2._meta.model_name.lower() in self.ldap_models
|
||
|
||
# Оба LDAP или оба Django - разрешаем
|
||
if db_obj1 == db_obj2:
|
||
return True
|
||
|
||
# Один LDAP, другой Django - запрещаем
|
||
return False
|
||
|
||
def allow_migrate(self, db, app_label, model_name=None, **hints):
|
||
"""
|
||
Запрещает миграции для LDAP моделей (схема управляется AD/LDAP сервером).
|
||
"""
|
||
if model_name and model_name.lower() in self.ldap_models:
|
||
# LDAP модели не мигрируют никуда
|
||
return False
|
||
|
||
# Обычные Django модели мигрируют только в default
|
||
return db == 'default'
|