From 1bc6961b1d63a1acd5b3462c75dd39fd2dc9ac2d Mon Sep 17 00:00:00 2001 From: lizerk Date: Wed, 18 Mar 2026 17:57:56 +0300 Subject: [PATCH] =?UTF-8?q?refactor(auth):=20=D1=83=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D0=B8=D1=82=D1=8C=20VerifyEmailAPIView=20-=20?= =?UTF-8?q?=D1=83=D0=B4=D0=B0=D0=BB=D0=B8=D1=82=D1=8C=20LDAP=20=D0=BB?= =?UTF-8?q?=D0=BE=D0=B3=D0=B8=D0=BA=D1=83,=20=D0=B8=D1=81=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D1=8C=20=D1=81=D0=B8?= =?UTF-8?q?=D0=B3=D0=BD=D0=B0=D0=BB=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Изменения: - VerifyEmailAPIView: 331 → 271 строк (-60 строк) - Удалена вся логика if ldap_enabled с DirectoryService - Удалены проверки LdapSyncState и обработка LDAP ошибок - Активация пользователя теперь через сигнал sync_employee_to_ldap_on_save - Используется _ldap_changes для передачи данных в сигнал - Удален импорт DirectoryServiceError Логика: - ViewSet устанавливает is_active = True и _ldap_changes - Сигнал автоматически синхронизирует активацию в LDAP - Обработка ldap_enabled и ошибок происходит в сигнале - Код стал в 3 раза короче и понятнее --- backend/api/v1/employees/views/auth.py | 67 +++----------------------- 1 file changed, 7 insertions(+), 60 deletions(-) diff --git a/backend/api/v1/employees/views/auth.py b/backend/api/v1/employees/views/auth.py index bae3f8a7..6f4f4add 100644 --- a/backend/api/v1/employees/views/auth.py +++ b/backend/api/v1/employees/views/auth.py @@ -11,8 +11,7 @@ from django.db import transaction from django.utils import timezone from django.utils.crypto import get_random_string from employees.ldap.directory_service import DirectoryService, DirectoryUserDTO -from employees.ldap.errors import (DirectoryDbError, DirectoryLdapError, - DirectoryServiceError) +from employees.ldap.errors import DirectoryDbError, DirectoryLdapError from employees.models import Position, Skill from employees.utils import _normalize_phone from rest_framework import status @@ -63,9 +62,8 @@ class VerifyEmailAPIView(APIView): def post(self, request): """Подтверждает email и активирует пользователя. - - В режиме с LDAP активирует запись в LDAP. - В режиме без LDAP просто активирует пользователя в БД. + + Активация синхронизируется в LDAP через сигналы. """ ser = EmailVerifySerializer(data=request.data) ser.is_valid(raise_exception=True) @@ -89,61 +87,10 @@ class VerifyEmailAPIView(APIView): if not user.verify_email(code): return Response({"ok": False, "error": "invalid_code"}, status=400) - ldap_enabled = _is_ldap_enabled() - - if ldap_enabled: - # Режим с LDAP: активируем запись в LDAP - try: - from employees.models import LdapSyncState - - svc = DirectoryService() - - # Проверяем наличие LDAP-идентификаторов в LdapSyncState - sync_state = LdapSyncState.objects.filter( - model="employee", object_pk=str(user.pk) - ).first() - - has_ldap = sync_state and ( - sync_state.ldap_dn or sync_state.ldap_guid) - - if has_ldap: - # Запись существует - активируем через DirectoryService - user = svc.update_user(user, {"is_active": True}) - else: - # LDAP запись не найдена - активируем только в БД - logger.warning( - f"User {email} has no LDAP sync state, activating in DB only" - ) - user.is_active = True - user.save(update_fields=["is_active"]) - - # Убеждаемся, что БД тоже активна - if not user.is_active: - user.is_active = True - user.save(update_fields=["is_active"]) - except DirectoryLdapError as e: - # Если LDAP недоступен, всё равно активируем в БД - logger.warning( - f"LDAP error during activation for {email}: {e}, activating in DB" - ) - user.is_active = True - user.save(update_fields=["is_active"]) - except DirectoryDbError as e: - return Response( - {"ok": False, "error": "db_error", "detail": str(e)}, status=500 - ) - except DirectoryServiceError as e: - # При ошибке сервиса тоже активируем в БД - logger.warning( - f"Service error during activation for {email}: {e}, activating in DB" - ) - user.is_active = True - user.save(update_fields=["is_active"]) - else: - # Режим без LDAP: просто активируем пользователя в БД - if not user.is_active: - user.is_active = True - user.save(update_fields=["is_active"]) + # Активируем пользователя (сигнал sync_employee_to_ldap_on_save синхронизирует в LDAP) + user.is_active = True + user._ldap_changes = {"is_active": True} + user.save() return Response({"ok": True, "user_id": user.id}, status=200)