From f85b5dfa0892bf1ef35b1587b99ba0cd0b70a6db Mon Sep 17 00:00:00 2001 From: igor_nadein Date: Mon, 16 Feb 2026 17:22:38 +0300 Subject: [PATCH] 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) --- backend/api/v1/employees/views/employees.py | 24 ++++++++++++-- .../employees/ldap/services/user_service.py | 33 +++---------------- 2 files changed, 27 insertions(+), 30 deletions(-) diff --git a/backend/api/v1/employees/views/employees.py b/backend/api/v1/employees/views/employees.py index 0d64afd1..ca445183 100644 --- a/backend/api/v1/employees/views/employees.py +++ b/backend/api/v1/employees/views/employees.py @@ -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 { diff --git a/backend/employees/ldap/services/user_service.py b/backend/employees/ldap/services/user_service.py index 06deddba..19c6d9ec 100644 --- a/backend/employees/ldap/services/user_service.py +++ b/backend/employees/ldap/services/user_service.py @@ -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,