from django.contrib import admin from django.contrib.auth.admin import UserAdmin from .models import ( AuditLog, InviteCode, InviteCodeUsage, User, UserSession, VisitorMigration, ) @admin.register(User) class HulumathUserAdmin(UserAdmin): fieldsets = UserAdmin.fieldsets + ( ("葫芦数学", {"fields": ("nickname", "avatar_url", "bio", "track", "rating")}), ) add_fieldsets = UserAdmin.add_fieldsets + ( ("葫芦数学", {"fields": ("nickname", "track")}), ) list_display = ("username", "nickname", "track", "rating", "is_active", "date_joined") list_filter = ("is_active", "is_staff", "track", "date_joined") search_fields = ("username", "nickname", "email") ordering = ("-date_joined",) @admin.register(InviteCode) class InviteCodeAdmin(admin.ModelAdmin): list_display = ("code", "group", "used_count", "max_uses", "expires_at", "is_active") list_filter = ("is_active", "group") search_fields = ("code", "group") readonly_fields = ("used_count", "created_at") ordering = ("-created_at",) @admin.register(InviteCodeUsage) class InviteCodeUsageAdmin(admin.ModelAdmin): list_display = ("invite_code", "user", "used_at", "ip_address") search_fields = ("invite_code__code", "user__username", "user__nickname") readonly_fields = ("invite_code", "user", "used_at", "ip_address") ordering = ("-used_at",) @admin.register(UserSession) class UserSessionAdmin(admin.ModelAdmin): list_display = ("user", "ip_address", "last_seen_at", "revoked_at") search_fields = ("user__username", "user__nickname", "ip_address") list_filter = ("revoked_at",) readonly_fields = ("user", "session_key", "user_agent", "ip_address", "last_seen_at") @admin.register(VisitorMigration) class VisitorMigrationAdmin(admin.ModelAdmin): list_display = ("user", "status", "created_at", "applied_at") list_filter = ("status",) search_fields = ("user__username", "user__nickname") readonly_fields = ("user", "payload", "summary", "created_at", "applied_at") @admin.register(AuditLog) class AuditLogAdmin(admin.ModelAdmin): list_display = ("action", "actor", "target_type", "target_id", "created_at") list_filter = ("action", "target_type") search_fields = ("actor__username", "action", "target_type", "target_id", "reason") readonly_fields = ( "actor", "action", "target_type", "target_id", "reason", "metadata", "created_at", ) ordering = ("-created_at",)