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"