class StaffUserAdmin(UserAdmin): """ Переопределяем админку для работы с персоналом Кристалла """ has_absolute_url = false list_display = (fio_name, groups, phone, 'email', 'username') # list_filter = ('is_staff', 'is_superuser', 'is_active',) list_filter = [] search_fields = ('first_name', 'last_name', 'username', 'email') form = UserChangeForm add_form = StaffCreationForm change_password_form = AdminPasswordChangeForm inlines = [StaffProfileInline, ] add_fieldsets = ( (None, { 'classes': ('wide',), 'fields': ('username', 'email', 'password1', 'password2')} ), ) def formfield_for_manytomany(self, db_field, request=None, **kwargs): """ Выводим список групп пользователей :param db_field: нас интересует только groups :param request: :param kwargs: подставляем queryset в кварги :return: """ if not request.user.is_superuser: if db_field.name == "groups": self_group = request.user.groups.all() gpin = GroupRelation.objects.filter(pk__in=self_group).values_list('subordinated__pk', flat=True) kwargs["queryset"] = GroupRelation.objects.filter(Q(pk__in=gpin) | Q(pk__in=self_group)) return super(StaffUserAdmin, self).formfield_for_manytomany(db_field, request, **kwargs) def get_queryset(self, request): """ Фильтруем сотрудников по подчиненным, чтобы не выводились люди не из своего отдела :param request: :return: """ super_qs = super(StaffUserAdmin, self).get_queryset(request).filter(is_staff=True) if request.user.is_superuser: return super_qs self_group = request.user.groups.all() gpin = GroupRelation.objects.filter(pk__in=self_group).values_list('subordinated__pk', flat=True) return super_qs.filter(is_active=True, is_superuser=False).filter( Q(groups__in=gpin) | Q(groups__in=self_group) | Q(groups__isnull=True)).distinct() readonly_fields = ['is_superuser', 'user_permissions', 'last_login', 'date_joined']