"""Admin configuration for user app.""" from contextlib import suppress from django.contrib import admin from django.contrib.admin.sites import NotRegistered from django.contrib.auth.admin import UserAdmin as BaseUserAdmin from django.contrib.auth.models import Group from django.utils.html import format_html from django.utils.translation import gettext_lazy as _ from apps.core.models import BackgroundJob from apps.user.models import Profile, User try: from django_celery_beat.models import ( ClockedSchedule, CrontabSchedule, IntervalSchedule, PeriodicTask, SolarSchedule, ) except ImportError: # pragma: no cover - optional dependency import guard ClockedSchedule = None CrontabSchedule = None IntervalSchedule = None PeriodicTask = None SolarSchedule = None try: from rest_framework_simplejwt.token_blacklist.models import ( BlacklistedToken, OutstandingToken, ) except ImportError: # pragma: no cover - optional dependency import guard BlacklistedToken = None OutstandingToken = None def _unregister(model) -> None: if model is None: return with suppress(NotRegistered): admin.site.unregister(model) _unregister(User) class ProfileInline(admin.StackedInline): """Inline для профиля пользователя.""" model = Profile extra = 0 max_num = 1 can_delete = False verbose_name_plural = "Профиль" fk_name = "user" fields = ["first_name", "mid_name", "last_name", "bio", "avatar", "date_of_birth"] @admin.register(User) class UserAdmin(BaseUserAdmin): """Admin для пользователей без групп.""" inlines = [ProfileInline] list_display = [ "username", "email", "phone", "is_verified_badge", "is_active_badge", "is_staff", "created_at", ] list_filter = ["is_staff", "is_superuser", "is_active", "is_verified", "created_at"] search_fields = ["username", "email", "phone"] ordering = ["-created_at"] list_per_page = 50 date_hierarchy = "created_at" fieldsets = ( (None, {"fields": ("username", "password")}), (_("Personal info"), {"fields": ("email", "phone")}), ( _("Permissions"), { "fields": ( "is_active", "is_staff", "is_superuser", "is_verified", "user_permissions", ), "classes": ("collapse",), }, ), ( _("Important dates"), {"fields": ("last_login", "date_joined", "created_at", "updated_at")}, ), ) add_fieldsets = ( ( None, { "classes": ("wide",), "fields": ( "username", "email", "password1", "password2", "is_staff", "is_active", ), }, ), ) readonly_fields = ["created_at", "updated_at", "last_login", "date_joined"] actions = ["verify_users", "unverify_users", "activate_users", "deactivate_users"] def is_verified_badge(self, obj): if obj.is_verified: return format_html( '' ) return format_html( '' ) is_verified_badge.short_description = "Верифицирован" is_verified_badge.admin_order_field = "is_verified" def is_active_badge(self, obj): if obj.is_active: return format_html( 'Активен' ) return format_html( 'Неактивен' ) is_active_badge.short_description = "Статус" is_active_badge.admin_order_field = "is_active" @admin.action(description="Верифицировать выбранных пользователей") def verify_users(self, request, queryset): updated = queryset.update(is_verified=True) self.message_user(request, f"Верифицировано {updated} пользователей") @admin.action(description="Снять верификацию") def unverify_users(self, request, queryset): updated = queryset.update(is_verified=False) self.message_user(request, f"Снята верификация у {updated} пользователей") @admin.action(description="Активировать пользователей") def activate_users(self, request, queryset): updated = queryset.update(is_active=True) self.message_user(request, f"Активировано {updated} пользователей") @admin.action(description="Деактивировать пользователей") def deactivate_users(self, request, queryset): updated = queryset.update(is_active=False) self.message_user(request, f"Деактивировано {updated} пользователей") for model in ( Group, BackgroundJob, OutstandingToken, BlacklistedToken, PeriodicTask, CrontabSchedule, IntervalSchedule, SolarSchedule, ClockedSchedule, ): _unregister(model)