From 175796ff784a565cff1402dc1f49dfef60be4872 Mon Sep 17 00:00:00 2001 From: lizerk Date: Fri, 20 Mar 2026 00:12:12 +0300 Subject: [PATCH] Fix LDAP admin actions: resolve dn__in unsupported lookup - Added _resolve_ldap_users() helper to fetch LDAP objects by DN individually - ldapdb does not support dn__in lookup used by Django admin queryset - All 3 actions now use _resolve_ldap_users instead of iterating queryset directly --- backend/employees/ldap/admin.py | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/backend/employees/ldap/admin.py b/backend/employees/ldap/admin.py index 02362e0a..6f62622d 100644 --- a/backend/employees/ldap/admin.py +++ b/backend/employees/ldap/admin.py @@ -131,6 +131,22 @@ class LdapUserAdmin(admin.ModelAdmin): # Пагинация (LDAP может быть медленным) list_per_page = 100 + def _resolve_ldap_users(self, request): + """Получает выбранные LDAP объекты по DN из POST данных. + + ldapdb не поддерживает dn__in lookup, поэтому + получаем каждый объект по DN отдельно. + """ + selected_dns = request.POST.getlist('_selected_action') + users = [] + for dn in selected_dns: + try: + user = LdapUser.objects.get(dn=dn) + users.append(user) + except LdapUser.DoesNotExist: + pass + return users + # Кастомные поля для отображения def cn_display(self, obj): @@ -309,7 +325,8 @@ class LdapUserAdmin(admin.ModelAdmin): success_count = 0 error_count = 0 - for ldap_user in queryset: + ldap_users = self._resolve_ldap_users(request) + for ldap_user in ldap_users: if not ldap_user.employee_number: error_count += 1 continue @@ -370,7 +387,8 @@ class LdapUserAdmin(admin.ModelAdmin): service = UserService() - for ldap_user in queryset: + ldap_users = self._resolve_ldap_users(request) + for ldap_user in ldap_users: if not ldap_user.employee_number: error_count += 1 continue @@ -415,7 +433,8 @@ class LdapUserAdmin(admin.ModelAdmin): """Показывает различия между LDAP и Django для выбранных пользователей.""" diffs = [] - for ldap_user in queryset: + ldap_users = self._resolve_ldap_users(request) + for ldap_user in ldap_users: if not ldap_user.employee_number: continue