Fix: Use get_ldap_str() in employees admin sync actions

- Added get_ldap_str() import to 3 admin actions
- Updated sync_from_django_to_ldap to safely compare LDAP fields
- Updated sync_from_ldap_to_django to safely extract LDAP values
- Updated show_sync_diff to safely compare LDAP vs Django data
- Prevents 'list' object errors in all admin LDAP sync operations
This commit is contained in:
lizerk 2026-03-20 00:42:15 +03:00
parent a3bd9226a5
commit c8ae3b3c7b

View File

@ -541,6 +541,7 @@ class EmployeeAdmin(DjangoUserAdmin):
import logging
from employees.ldap.services import UserService
from employees.ldap.orm_models import LdapUser
from employees.ldap.utils.ldap_utils import get_ldap_str
logger = logging.getLogger(__name__)
@ -575,19 +576,22 @@ class EmployeeAdmin(DjangoUserAdmin):
try:
changes = {}
logger.debug(f"[sync_from_django_to_ldap] Employee {employee.pk}: сравнение given_name: LDAP='{ldap_user.given_name}' vs Django='{employee.first_name}'")
if ldap_user.given_name != employee.first_name:
ldap_first = get_ldap_str(ldap_user.given_name)
logger.debug(f"[sync_from_django_to_ldap] Employee {employee.pk}: сравнение given_name: LDAP='{ldap_first}' vs Django='{employee.first_name}'")
if ldap_first != employee.first_name:
changes['first_name'] = employee.first_name
logger.debug(f"[sync_from_django_to_ldap] Employee {employee.pk}: сравнение sn: LDAP='{ldap_user.sn}' vs Django='{employee.last_name}'")
if ldap_user.sn != employee.last_name:
ldap_last = get_ldap_str(ldap_user.sn)
logger.debug(f"[sync_from_django_to_ldap] Employee {employee.pk}: сравнение sn: LDAP='{ldap_last}' vs Django='{employee.last_name}'")
if ldap_last != employee.last_name:
changes['last_name'] = employee.last_name
logger.debug(f"[sync_from_django_to_ldap] Employee {employee.pk}: сравнение mail: LDAP='{ldap_user.mail}' vs Django='{employee.email}'")
if ldap_user.mail != employee.email:
ldap_email = get_ldap_str(ldap_user.mail)
logger.debug(f"[sync_from_django_to_ldap] Employee {employee.pk}: сравнение mail: LDAP='{ldap_email}' vs Django='{employee.email}'")
if ldap_email != employee.email:
changes['email'] = employee.email
ldap_phone = ldap_user.telephone_number or ldap_user.mobile
ldap_phone = get_ldap_str(ldap_user.telephone_number or ldap_user.mobile)
logger.debug(f"[sync_from_django_to_ldap] Employee {employee.pk}: сравнение phone: LDAP='{ldap_phone}' vs Django='{employee.phone_number}'")
if employee.phone_number and ldap_phone != employee.phone_number:
changes['phone_number'] = employee.phone_number
@ -718,6 +722,7 @@ class EmployeeAdmin(DjangoUserAdmin):
перезапишут данные в Django Employee.
"""
from employees.ldap.orm_models import LdapUser
from employees.ldap.utils.ldap_utils import get_ldap_str
success_count = 0
error_count = 0
@ -752,19 +757,22 @@ class EmployeeAdmin(DjangoUserAdmin):
# Обновляем Django из LDAP
updated_fields = []
if ldap_user.given_name and ldap_user.given_name != employee.first_name:
employee.first_name = ldap_user.given_name
ldap_first = get_ldap_str(ldap_user.given_name)
if ldap_first and ldap_first != employee.first_name:
employee.first_name = ldap_first
updated_fields.append('first_name')
if ldap_user.sn and ldap_user.sn != employee.last_name:
employee.last_name = ldap_user.sn
ldap_last = get_ldap_str(ldap_user.sn)
if ldap_last and ldap_last != employee.last_name:
employee.last_name = ldap_last
updated_fields.append('last_name')
if ldap_user.mail and ldap_user.mail != employee.email:
employee.email = ldap_user.mail
ldap_email = get_ldap_str(ldap_user.mail)
if ldap_email and ldap_email != employee.email:
employee.email = ldap_email
updated_fields.append('email')
ldap_phone = ldap_user.telephone_number or ldap_user.mobile
ldap_phone = get_ldap_str(ldap_user.telephone_number or ldap_user.mobile)
if ldap_phone and ldap_phone != employee.phone_number:
employee.phone_number = ldap_phone
updated_fields.append('phone_number')
@ -816,6 +824,7 @@ class EmployeeAdmin(DjangoUserAdmin):
def show_sync_diff(self, request, queryset):
"""Показывает различия между Django и LDAP для выбранных пользователей."""
from employees.ldap.orm_models import LdapUser
from employees.ldap.utils.ldap_utils import get_ldap_str
diffs = []
no_ldap_count = 0
@ -841,22 +850,25 @@ class EmployeeAdmin(DjangoUserAdmin):
user_diffs = []
# Сравниваем поля
if ldap_user.given_name != employee.first_name:
ldap_first = get_ldap_str(ldap_user.given_name)
if ldap_first != employee.first_name:
user_diffs.append(
f"Имя: Django='{employee.first_name}' vs LDAP='{ldap_user.given_name}'"
f"Имя: Django='{employee.first_name}' vs LDAP='{ldap_first}'"
)
if ldap_user.sn != employee.last_name:
ldap_last = get_ldap_str(ldap_user.sn)
if ldap_last != employee.last_name:
user_diffs.append(
f"Фамилия: Django='{employee.last_name}' vs LDAP='{ldap_user.sn}'"
f"Фамилия: Django='{employee.last_name}' vs LDAP='{ldap_last}'"
)
if ldap_user.mail != employee.email:
ldap_email = get_ldap_str(ldap_user.mail)
if ldap_email != employee.email:
user_diffs.append(
f"Email: Django='{employee.email}' vs LDAP='{ldap_user.mail}'"
f"Email: Django='{employee.email}' vs LDAP='{ldap_email}'"
)
ldap_phone = ldap_user.telephone_number or ldap_user.mobile
ldap_phone = get_ldap_str(ldap_user.telephone_number or ldap_user.mobile)
if employee.phone_number and ldap_phone and ldap_phone != employee.phone_number:
user_diffs.append(
f"Телефон: Django='{employee.phone_number}' vs LDAP='{ldap_phone}'"