Corp/backend/eusrr_backend/db_routers.py
2026-06-22 15:01:28 +03:00

60 lines
2.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""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"