From 298524ecc62ac44a409c247c100c0a1ed5693a10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=B3=D0=BE=D1=80=D1=8C=20=D0=9D=D0=B0=D0=B4=D0=B5?= =?UTF-8?q?=D0=B8=D0=BD?= Date: Mon, 8 Dec 2025 13:29:53 +0300 Subject: [PATCH] fix: use PositionService instead of DirectoryService for position groups Problem: - When assigning/changing position, got 502 error - Error: 'DirectoryService' object has no attribute '_ensure_position_group' - Method was called on wrong service class Root Cause: DirectoryService doesn't have _ensure_position_group method. This method exists in PositionService (line 190 of position_service.py). Solution: - Import and use PositionService for position-specific operations - Keep DirectoryService for general group operations (add/remove members) - Use pos_svc._ensure_position_group() to create/get position group DN - Use dir_svc for add_group_members/remove_group_members Now position assignment/changes work correctly through LDAP sync. --- .../employees/ldap/services/user_service.py | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/backend/employees/ldap/services/user_service.py b/backend/employees/ldap/services/user_service.py index c25b4eec..1685e764 100644 --- a/backend/employees/ldap/services/user_service.py +++ b/backend/employees/ldap/services/user_service.py @@ -280,20 +280,22 @@ class UserService: try: if pos_in_payload and (old_pos != new_pos): - # Временное решение - используем методы из DirectoryService - # TODO: убрать после создания PositionService (Сессия 8) + # Используем PositionService для синхронизации должностей + from .position_service import PositionService from ..directory_service import DirectoryService import logging logger = logging.getLogger(__name__) - svc = DirectoryService() + pos_svc = PositionService() + dir_svc = DirectoryService() + if old_pos: old_dn = (old_pos.ldap_group_dn or "").strip() if not old_dn: - maybe = svc.find_group_dn( + maybe = dir_svc.find_group_dn( conn, f"POS_{old_pos.name}", - bases=[svc._positions_base()], + bases=[dir_svc._positions_base()], ) old_dn = maybe or "" if old_dn: @@ -302,7 +304,7 @@ class UserService: f"Removing user {current_dn} " f"from position group {old_dn}" ) - svc.remove_group_members( + dir_svc.remove_group_members( conn, old_dn, [current_dn] ) except RuntimeError as e: @@ -322,8 +324,8 @@ class UserService: raise if new_pos: - pos_dn = svc._ensure_position_group(conn, new_pos) - svc.add_group_members(conn, pos_dn, [current_dn]) + pos_dn = pos_svc._ensure_position_group(conn, new_pos) + dir_svc.add_group_members(conn, pos_dn, [current_dn]) except Exception as e: raise DirectoryLdapError( f"LDAP position membership sync failed: {e}"