Corp/backend/eusrr_backend/db_routers.py
lizerk 2eb2da4c5a feat(ldap): интеграция django-ldapdb ORM в employees/ldap/
Добавлена поддержка django-ldapdb для упрощения работы с LDAP через Django ORM.

Ключевые изменения:
- Установлен django-ldapdb==1.5.1 в requirements.txt
- Созданы LDAP ORM модели (LdapUser, LdapGroup, LdapOrganizationalUnit) в employees/ldap/orm_models.py
- Реализованы ORM сервисы для CRUD операций в employees/ldap/orm_services.py
- Настроен database router в eusrr_backend/db_routers.py
- Добавлена LDAP database конфигурация в settings.py
- Создана документация ORM_INTEGRATION.md

Архитектура:
✅ GET → Employee (PostgreSQL) - быстро
✅ POST/PUT/DELETE → LdapUser (django-ldapdb ORM) - просто

Преимущества:
- Django ORM вместо низкоуровневого ldap3
- Автоматическая валидация через Django fields
- Унифицированный CRUD API
- Меньше кода, больше удобства

Файлы:
+ employees/ldap/orm_models.py - LDAP ORM модели (LdapUser, LdapGroup, LdapOrganizationalUnit)
+ employees/ldap/orm_services.py - ORM сервисы (LdapOrmUserService, LdapOrmGroupService, LdapOrmDepartmentService)
+ employees/ldap/ORM_INTEGRATION.md - документация по интеграции
+ eusrr_backend/db_routers.py - database router для LDAP моделей
~ requirements.txt - добавлен django-ldapdb==1.5.1
~ eusrr_backend/settings.py - настроена LDAP database и router
2026-03-18 13:42:32 +03:00

66 lines
2.7 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.
"""
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',
}
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'