refactor: remove DB access from LDAP layer update method

- Move department_id to department_dn resolution to ViewSet layer
- update_user_in_ldap_only now receives ready department_dn parameter
- LDAP service no longer queries Department.objects directly
- All three *_in_ldap_only methods are now pure LDAP (no DB access)
This commit is contained in:
igor_nadein 2026-02-16 17:22:38 +03:00
parent 4b56711636
commit f85b5dfa08
2 changed files with 27 additions and 30 deletions

View File

@ -147,8 +147,28 @@ class EmployeeViewSet(ExternalSystemSyncMixin, viewsets.ModelViewSet):
changes['position'] = request_data.get(
'position') or request_data.get('position_id')
# Отдел (для перемещения)
move_to_department_dn = request_data.get('department_dn')
# Отдел (для перемещения) - резолвим DN здесь в ViewSet
move_to_department_dn = None
if 'department' in request_data or 'department_id' in request_data:
dept_val = request_data.get('department') or request_data.get('department_id')
if dept_val:
# Если передан ID - получаем инстанс из БД
if isinstance(dept_val, int):
from employees.models import Department
dept = Department.objects.filter(id=dept_val).first()
else:
dept = dept_val
# Резолвим DN отдела
if dept:
try:
from employees.ldap.services.department_service import DepartmentService
dept_svc = DepartmentService()
move_to_department_dn = dept_svc._get_department_dn(dept)
except Exception as e:
logger.warning(f"Failed to resolve department DN: {e}")
# Группы - берем готовый список CN если передан
group_cns = request_data.get('group_cns')
return {

View File

@ -122,7 +122,9 @@ class UserService:
def update_user_in_ldap_only(
self,
instance: Employee,
changes: Dict[str, Any]
changes: Dict[str, Any],
move_to_department_dn: Optional[str] = None,
group_cns: Optional[List[str]] = None
) -> dict[str, Any]:
"""Обновляет пользователя ТОЛЬКО в LDAP.
@ -131,6 +133,8 @@ class UserService:
Args:
instance (Employee): Инстанс сотрудника с актуальными данными из БД.
changes (Dict[str, Any]): Изменения из request.data для синхронизации в LDAP.
move_to_department_dn (Optional[str]): DN отдела для перемещения (готовый).
group_cns (Optional[List[str]]): Список CN групп для синхронизации (готовый).
Returns:
dict: Данные для дополнительного обновления БД если нужно:
@ -147,33 +151,6 @@ class UserService:
with _ldap() as conn:
ldap_changes = dict(changes)
# Определяем куда переместить пользователя если меняется department
move_to_department_dn = None
if 'department' in changes or 'department_id' in changes:
# Если передан department объект или ID, получаем его DN
dept_val = changes.get(
'department') or changes.get('department_id')
if dept_val:
from .department_service import DepartmentService
dept_svc = DepartmentService()
if isinstance(dept_val, int):
from employees.models import Department
dept = Department.objects.filter(id=dept_val).first()
else:
dept = dept_val
if dept:
try:
move_to_department_dn = dept_svc._get_department_dn(
dept)
except Exception:
pass
# Определяем группы если нужно синхронизировать
group_cns = None
if 'groups' in changes:
group_cns = changes.get('groups', [])
try:
result = self._update_user_in_ldap(
conn=conn,