from rest_framework import serializers from .models import CompressionHistory, ToolCategory, Tool, ColorHistory class ToolCategorySerializer(serializers.ModelSerializer): tool_count = serializers.SerializerMethodField() class Meta: model = ToolCategory fields = ['id', 'name', 'icon', 'sort_order', 'tool_count', 'created_at'] def get_tool_count(self, obj): return obj.tools.filter(is_enabled=True).count() class ToolSerializer(serializers.ModelSerializer): category_name = serializers.CharField(source='category.name', read_only=True, default='') class Meta: model = Tool fields = [ 'id', 'name', 'description', 'icon', 'url_path', 'color', 'category', 'category_name', 'is_enabled', 'is_new', 'usage_count', 'sort_order', 'created_at', 'updated_at' ] read_only_fields = ['id', 'created_at', 'updated_at'] class CompressionHistorySerializer(serializers.ModelSerializer): original_size_display = serializers.SerializerMethodField() compressed_size_display = serializers.SerializerMethodField() created_at_display = serializers.SerializerMethodField() class Meta: model = CompressionHistory fields = [ 'id', 'original_filename', 'original_size', 'compressed_size', 'compression_ratio', 'original_format', 'output_format', 'compression_mode', 'quality', 'created_at', 'file_path', 'original_size_display', 'compressed_size_display', 'created_at_display' ] read_only_fields = ['id', 'created_at'] def get_original_size_display(self, obj): return self._format_size(obj.original_size) def get_compressed_size_display(self, obj): return self._format_size(obj.compressed_size) def get_created_at_display(self, obj): return obj.created_at.strftime('%Y-%m-%d %H:%M:%S') @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" class ImageCompressRequestSerializer(serializers.Serializer): file = serializers.FileField() mode = serializers.ChoiceField(choices=['lossy', 'lossless'], default='lossy') quality = serializers.IntegerField(min_value=1, max_value=100, default=80) format = serializers.ChoiceField( choices=['jpeg', 'png', 'webp', 'avif', 'original'], default='original' ) keep_exif = serializers.BooleanField(default=True) width = serializers.IntegerField(required=False, min_value=1, max_value=10000) height = serializers.IntegerField(required=False, min_value=1, max_value=10000) maintain_aspect_ratio = serializers.BooleanField(default=True) class ColorHistorySerializer(serializers.ModelSerializer): class Meta: model = ColorHistory fields = ['id', 'color', 'created_at'] read_only_fields = ['id', 'created_at'] class ColorHistorySyncSerializer(serializers.Serializer): colors = serializers.ListField( child=serializers.CharField(max_length=7), help_text='颜色HEX值列表,如 ["#FF5733", "#33FF57"]' )