Files
chunyu_project/tool/admin.py
T
2026-08-05 23:59:15 +08:00

78 lines
2.7 KiB
Python

from django.contrib import admin
from django.utils.translation import gettext_lazy as _
from .models import ToolCategory, Tool, ToolFavorite, CompressionHistory
@admin.register(ToolCategory)
class ToolCategoryAdmin(admin.ModelAdmin):
list_display = ['name', 'icon', 'sort_order', 'tool_count', 'created_at']
search_fields = ['name']
ordering = ['sort_order']
list_editable = ['sort_order']
def tool_count(self, obj):
return obj.tools.count()
tool_count.short_description = _('Tool Count')
@admin.register(Tool)
class ToolAdmin(admin.ModelAdmin):
list_display = ['name', 'category', 'url_path', 'color', 'usage_count', 'is_enabled', 'is_new', 'sort_order', 'created_at']
list_filter = ['is_enabled', 'is_new', 'category']
search_fields = ['name', 'description', 'url_path']
ordering = ['sort_order']
list_editable = ['is_enabled', 'is_new', 'sort_order', 'color']
list_per_page = 20
fieldsets = (
(_('Basic Information'), {
'fields': ('name', 'description', 'icon', 'url_path', 'color')
}),
(_('Category and Sort'), {
'fields': ('category', 'sort_order')
}),
(_('Status'), {
'fields': ('is_enabled', 'is_new', 'usage_count')
}),
)
@admin.register(ToolFavorite)
class ToolFavoriteAdmin(admin.ModelAdmin):
list_display = ['user', 'tool', 'created_at']
list_filter = ['created_at']
search_fields = ['user__username', 'tool__name']
ordering = ['-created_at']
list_per_page = 30
readonly_fields = ['created_at']
@admin.register(CompressionHistory)
class CompressionHistoryAdmin(admin.ModelAdmin):
list_display = [
'original_filename', 'user', 'session_id', 'compression_mode',
'original_format', 'output_format', 'compression_ratio',
'original_size_display', 'compressed_size_display', 'created_at'
]
list_filter = ['compression_mode', 'original_format', 'output_format', 'created_at']
search_fields = ['original_filename', 'session_id', 'user__username']
ordering = ['-created_at']
readonly_fields = ['created_at']
list_per_page = 20
def original_size_display(self, obj):
return self._format_size(obj.original_size)
original_size_display.short_description = _('Original Size')
def compressed_size_display(self, obj):
return self._format_size(obj.compressed_size)
compressed_size_display.short_description = _('Compressed Size')
@staticmethod
def _format_size(size_bytes):
if size_bytes < 1024:
return f"{size_bytes} B"
elif size_bytes < 1024 * 1024:
return f"{size_bytes / 1024:.1f} KB"
else:
return f"{size_bytes / (1024 * 1024):.1f} MB"