from django.contrib import admin from .models import Bot, ChatMessage, CredentialSlot from common.utils import mask_token @admin.register(Bot) class BotAdmin(admin.ModelAdmin): list_display = ('id', 'name', 'description') search_fields = ('id', 'name', 'description') @admin.register(ChatMessage) class BotAdmin(admin.ModelAdmin): list_display = ('id', 'user', 'bot', 'message', 'timestamp', 'sender', 'message_type') search_fields = ('id', 'user', 'bot', 'message', 'timestamp', 'sender', 'message_type') @admin.register(CredentialSlot) class CredentialSlotAdmin(admin.ModelAdmin): """通用凭据槽位 Admin(单例)— Milestone v1.0 / Phase 1 UX 行为: - 列表 / 查看态 access_token 显示末 4 位掩码 - 编辑表单 access_token 明文(运营录入需要) - 已存在记录时隐藏「增加」按钮 - 永远禁止删除(防运营误操作丢失单例) """ list_display = ('id', 'app_id', 'access_token_masked', 'updated_at') readonly_fields = ('updated_at',) fieldsets = ( ('凭据信息', { 'fields': ('app_id', 'access_token'), 'description': '第三方服务商分配的 APP ID + Access Token;保存后立即对手机端 / 设备端生效', }), ('元数据', { 'fields': ('updated_at',), 'classes': ('collapse',), }), ) def access_token_masked(self, obj): return mask_token(obj.access_token) access_token_masked.short_description = 'Access Token (脱敏)' def has_add_permission(self, request): # 已存在记录时隐藏「增加」,配合 has_delete_permission 强制单例 return not CredentialSlot.objects.exists() def has_delete_permission(self, request, obj=None): # 永远禁止删除(含批量动作) return False