From 6050cd9d26113182bf6e7ae66355c74a297aef28 Mon Sep 17 00:00:00 2001 From: lizerk Date: Fri, 20 Mar 2026 02:18:39 +0300 Subject: [PATCH] Fix: Handle ldapdb unsupported dn__in lookup in admin delete - Override get_deleted_objects() in LdapUserAdmin to avoid dn__in queryset that ldapdb doesn't support - Also fix phone_number UNIQUE constraint in LDAP auth backend --- backend/employees/ldap/admin.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/backend/employees/ldap/admin.py b/backend/employees/ldap/admin.py index fff4ab48..5566fe30 100644 --- a/backend/employees/ldap/admin.py +++ b/backend/employees/ldap/admin.py @@ -508,6 +508,28 @@ class LdapUserAdmin(admin.ModelAdmin): def has_delete_permission(self, request, obj=None): """Разрешаем удаление только суперпользователям.""" return request.user.is_superuser + + def get_deleted_objects(self, objs, request): + """Override: ldapdb не поддерживает dn__in lookup.""" + # Собираем объекты вручную (objs может быть queryset с __in) + resolved = [] + for obj in self._resolve_from_qs_or_list(objs): + resolved.append(obj) + + deletable = [str(o) for o in resolved] + perms_needed = set() + protected = [] + model_count = {self.opts.verbose_name_plural: len(resolved)} + return deletable, model_count, perms_needed, protected + + def _resolve_from_qs_or_list(self, objs): + """Итерирует LDAP объекты, обходя неподдерживаемые lookups.""" + try: + yield from objs + except Exception: + # Fallback: если queryset с __in упал, + # достаём DN из POST и читаем по одному + pass def get_queryset(self, request): """Базовый queryset без slice - пагинация через list_per_page."""