From 9187afda5e14453b296febb90cbb622f6c464ee9 Mon Sep 17 00:00:00 2001 From: lizerk Date: Wed, 18 Mar 2026 16:50:53 +0300 Subject: [PATCH] =?UTF-8?q?refactor(employees):=20=D1=83=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D0=B8=D1=82=D1=8C=20EmployeeViewSet,=20=D1=83?= =?UTF-8?q?=D0=B1=D1=80=D0=B0=D1=82=D1=8C=20=D1=8F=D0=B2=D0=BD=D1=83=D1=8E?= =?UTF-8?q?=20LDAP=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BA=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Убраны импорты DirectoryService, LDAP ошибок, _is_ldap_enabled - perform_create теперь просто создает Employee (без пароля) - perform_update упрощен: убраны проверки is_ldap_enabled/is_ldap_managed - Сигналы сами разбираются с LDAP синхронизацией - ldap_info endpoint оставлен (readonly, полезен) ViewSet теперь занимается только бизнес-логикой Employee, -15 строк --- backend/api/v1/employees/views/employees.py | 41 +++++++-------------- 1 file changed, 13 insertions(+), 28 deletions(-) diff --git a/backend/api/v1/employees/views/employees.py b/backend/api/v1/employees/views/employees.py index fd90f4db..7c9096a6 100644 --- a/backend/api/v1/employees/views/employees.py +++ b/backend/api/v1/employees/views/employees.py @@ -14,10 +14,6 @@ from django.shortcuts import get_object_or_404 from django.utils import timezone from django.utils.crypto import get_random_string from employees.constants import ACTION_DISMISSED -from employees.ldap.directory_service import DirectoryService, DirectoryUserDTO -from employees.ldap.errors import (DirectoryDbError, DirectoryLdapError, - DirectoryServiceError) -from employees.ldap.infrastructure.connections import _conn from employees.models import (Department, EmployeeAction, EmployeeDepartment, LdapSyncState, Position, RoleAssignment, Skill) from employees.utils import _to_bool @@ -30,7 +26,7 @@ from rest_framework.response import Response from ...permissions import AdminOrActionOrModelPerms, IsSelfOrStaff from ..serializers import (EmployeeListSerializer, EmployeeSerializer, SkillSerializer) -from ._helpers import Employee, _is_ldap_enabled +from ._helpers import Employee logger = logging.getLogger(__name__) @@ -201,19 +197,13 @@ class EmployeeViewSet(viewsets.ModelViewSet): return EmployeeSerializer def perform_create(self, serializer): - """Создание сотрудника через API. + """Создание сотрудника (административное, без пароля). - ПРИМЕЧАНИЕ: Создание LDAP пользователей происходит через RegisterAPIView. - Этот endpoint для административного создания Employee без LDAP синхронизации. + Создание LDAP пользователей с паролем - через RegisterAPIView. """ - ldap_enabled = _is_ldap_enabled() - - # Создаем пользователя в БД (без пароля - административное создание) - instance = serializer.save(is_ldap_managed=ldap_enabled) - if hasattr(instance, "set_unusable_password"): - instance._skip_ldap_sync = True # Не синхронизировать через сигналы - instance.set_unusable_password() - instance.save(update_fields=["password"]) + instance = serializer.save() + instance.set_unusable_password() + instance.save(update_fields=["password"]) # Навыки skills_ids = self.request.data.get("skills_ids", []) @@ -221,35 +211,30 @@ class EmployeeViewSet(viewsets.ModelViewSet): instance.skills.set(skills_ids) def perform_update(self, serializer): - """Обновление сотрудника. LDAP синхронизация через сигналы.""" + """Обновление сотрудника.""" instance = serializer.instance old_email = instance.email - # Сохраняем изменения для LDAP синхронизации - if _is_ldap_enabled() and instance.is_ldap_managed: - instance._ldap_changes = dict(self.request.data) - if 'avatar' in self.request.FILES: - instance._ldap_avatar = self.request.FILES['avatar'] + # Передаем данные для синхронизации с LDAP (через сигналы) + instance._ldap_changes = dict(self.request.data) + if 'avatar' in self.request.FILES: + instance._ldap_avatar = self.request.FILES['avatar'] - # Стандартное сохранение (сигнал синхронизирует с LDAP) serializer.save() # Если email изменился - сбрасываем верификацию new_email = instance.email if new_email and new_email.lower() != old_email.lower(): - instance._skip_ldap_sync = True instance.email_verified = False instance.email_activation_code = get_random_string(6, "0123456789") - instance.save( - update_fields=["email_verified", "email_activation_code"]) + instance.save(update_fields=["email_verified", "email_activation_code"]) try: send_templated_mail( subject="Подтверждение нового email", to=[instance.email], template_base="emails/registration_verify_code", - context={"code": instance.email_activation_code, - "user": instance}, + context={"code": instance.email_activation_code, "user": instance}, ) except Exception: pass