76 lines
2.6 KiB
Python
76 lines
2.6 KiB
Python
from django.contrib import admin
|
|
|
|
from .models import AgentRun, AgentRunEvent, HumanApproval, ModelProviderConfig, ToolCall
|
|
from .services import resolve_approval
|
|
|
|
|
|
class ReadOnlyAuditAdmin(admin.ModelAdmin):
|
|
"""审计记录允许查看但禁止通过 Admin 改写或删除。"""
|
|
|
|
def has_add_permission(self, request):
|
|
return False
|
|
|
|
def has_change_permission(self, request, obj=None):
|
|
return request.user.is_staff if obj is None else False
|
|
|
|
def has_delete_permission(self, request, obj=None):
|
|
return False
|
|
|
|
|
|
@admin.register(AgentRun)
|
|
class AgentRunAdmin(admin.ModelAdmin):
|
|
list_display = ("title", "owner", "status", "created_at", "finished_at")
|
|
list_filter = ("status",)
|
|
search_fields = ("title", "owner__username", "trace_id")
|
|
|
|
|
|
admin.site.register(AgentRunEvent, ReadOnlyAuditAdmin)
|
|
admin.site.register(ToolCall, ReadOnlyAuditAdmin)
|
|
|
|
|
|
@admin.register(ModelProviderConfig)
|
|
class ModelProviderConfigAdmin(admin.ModelAdmin):
|
|
"""只展示连接元数据,密文 API Key 不进入 Admin 页面。"""
|
|
|
|
list_display = (
|
|
"provider_code",
|
|
"owner",
|
|
"status",
|
|
"is_default",
|
|
"last_verified_at",
|
|
)
|
|
list_filter = ("status", "is_default", "enabled")
|
|
search_fields = ("provider_code", "owner__username")
|
|
exclude = ("encrypted_api_key",)
|
|
readonly_fields = ("key_hint", "available_models", "last_verified_at", "last_error_code")
|
|
|
|
def has_add_permission(self, request):
|
|
"""服务商配置必须经过页面连接验证,Admin 不允许绕过验证直接创建。"""
|
|
|
|
return False
|
|
|
|
@admin.register(HumanApproval)
|
|
class HumanApprovalAdmin(admin.ModelAdmin):
|
|
"""人工确认正文只读,通过受控动作执行领域状态转换。"""
|
|
|
|
list_display = ("approval_type", "run", "status", "requested_at", "resolved_by")
|
|
list_filter = ("status", "approval_type")
|
|
readonly_fields = tuple(field.name for field in HumanApproval._meta.fields)
|
|
actions = ("approve_selected", "reject_selected")
|
|
|
|
@admin.action(description="通过选中的待确认请求")
|
|
def approve_selected(self, request, queryset):
|
|
for approval in queryset:
|
|
resolve_approval(request.user, approval.id, True, {"source": "admin"})
|
|
|
|
@admin.action(description="拒绝选中的待确认请求")
|
|
def reject_selected(self, request, queryset):
|
|
for approval in queryset:
|
|
resolve_approval(request.user, approval.id, False, {"source": "admin"})
|
|
|
|
def has_add_permission(self, request):
|
|
return False
|
|
|
|
def has_delete_permission(self, request, obj=None):
|
|
return False
|