refactor(employees): упростить EmployeeViewSet, убрать явную LDAP логику
- Убраны импорты DirectoryService, LDAP ошибок, _is_ldap_enabled - perform_create теперь просто создает Employee (без пароля) - perform_update упрощен: убраны проверки is_ldap_enabled/is_ldap_managed - Сигналы сами разбираются с LDAP синхронизацией - ldap_info endpoint оставлен (readonly, полезен) ViewSet теперь занимается только бизнес-логикой Employee, -15 строк
This commit is contained in:
parent
016d73ff56
commit
9187afda5e
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user