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( '{}', 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( '
' '
' '{}%
', 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