54 lines
1.9 KiB
Python
54 lines
1.9 KiB
Python
from django.contrib import admin
|
|
|
|
from .models import AgentRun, AgentRunEvent, HumanApproval, 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(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
|