Developer
🚀 初始部署到Hugging Face Spaces
35c63fd
from django.contrib import admin
from django.utils.html import format_html
from django.db import models
from .models import Project
class ProjectAdmin(admin.ModelAdmin):
"""项目管理"""
list_display = (
'name', 'user', 'source_lang', 'target_lang', 'status_display',
'progress_display', 'segment_count', 'completed_count', 'created_at'
)
list_filter = ('status', 'source_lang', 'target_lang', 'created_at', 'updated_at')
search_fields = ('name', 'user__username', 'user__email', 'description')
ordering = ('-created_at',)
date_hierarchy = 'created_at'
fieldsets = (
('基本信息', {
'fields': ('name', 'user', 'description')
}),
('语言配置', {
'fields': ('source_lang', 'target_lang')
}),
('文件信息', {
'fields': ('srt_file_path', 'video_file_path', 'concatenated_audio_url'),
'classes': ('collapse',)
}),
('TTS配置', {
'fields': ('tts_model', 'voice_mappings', 'custom_vocabulary', 'max_speed'),
'classes': ('collapse',)
}),
('统计信息', {
'fields': ('status', 'segment_count', 'completed_segment_count', 'progress_percentage', 'created_at', 'updated_at'),
'classes': ('collapse',)
}),
)
readonly_fields = ('segment_count', 'completed_segment_count', 'progress_percentage', 'created_at', 'updated_at')
def status_display(self, obj):
"""彩色显示状态"""
colors = {
'pending': '#ffc107',
'processing': '#17a2b8',
'completed': '#28a745',
'failed': '#dc3545'
}
color = colors.get(obj.status, '#6c757d')
return format_html(
'<span style="color: {}; font-weight: bold;">{}</span>',
color, obj.get_status_display()
)
status_display.short_description = "状态"
def progress_display(self, obj):
"""进度条显示"""
progress = obj.progress_percentage or 0
color = '#28a745' if progress == 100 else '#17a2b8' if progress > 50 else '#ffc107'
return format_html(
'<div style="width: 100px; background: #e9ecef; border-radius: 3px;">'
'<div style="width: {}%; background: {}; height: 20px; border-radius: 3px; text-align: center; color: white; font-size: 12px; line-height: 20px;">'
'{}%</div></div>',
progress, color, progress
)
progress_display.short_description = "进度"
def completed_count(self, obj):
"""显示完成的段落数"""
return f"{obj.completed_segment_count}/{obj.segment_count}"
completed_count.short_description = "完成情况"
def get_queryset(self, request):
"""优化查询性能"""
return super().get_queryset(request).select_related('user').prefetch_related('segments')
actions = ['mark_as_pending', 'mark_as_processing', 'mark_as_completed']
def mark_as_pending(self, request, queryset):
"""批量标记为待处理"""
updated = queryset.update(status='pending')
self.message_user(request, f'成功将 {updated} 个项目标记为待处理')
mark_as_pending.short_description = "标记为待处理"
def mark_as_processing(self, request, queryset):
"""批量标记为处理中"""
updated = queryset.update(status='processing')
self.message_user(request, f'成功将 {updated} 个项目标记为处理中')
mark_as_processing.short_description = "标记为处理中"
def mark_as_completed(self, request, queryset):
"""批量标记为已完成"""
updated = queryset.update(status='completed')
self.message_user(request, f'成功将 {updated} 个项目标记为已完成')
mark_as_completed.short_description = "标记为已完成"
def has_add_permission(self, request):
"""项目应通过前端页面创建,不允许在管理后台添加"""
return False
def get_urls(self):
"""移除添加URL"""
urls = super().get_urls()
# 过滤掉添加相关的URL
filtered_urls = []
for url in urls:
if hasattr(url, 'name') and url.name and 'add' in url.name:
continue
filtered_urls.append(url)
return filtered_urls