Files

92 lines
3.1 KiB
Python

from adrf.serializers import (
ModelSerializer, Serializer, CharField, ChoiceField, FileField,
IntegerField, BooleanField, ListField, SerializerMethodField,
)
from .models import CompressionHistory, ToolCategory, Tool, ColorHistory
class ToolCategorySerializer(ModelSerializer):
tool_count = SerializerMethodField()
class Meta:
model = ToolCategory
fields = ['id', 'name', 'icon', 'sort_order', 'tool_count', 'created_at']
async def get_tool_count(self, obj):
return await obj.tools.filter(is_enabled=True).acount()
class ToolSerializer(ModelSerializer):
category_name = 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(ModelSerializer):
original_size_display = SerializerMethodField()
compressed_size_display = SerializerMethodField()
created_at_display = 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']
async def get_original_size_display(self, obj):
return self._format_size(obj.original_size)
async def get_compressed_size_display(self, obj):
return self._format_size(obj.compressed_size)
async 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(Serializer):
file = FileField()
mode = ChoiceField(choices=['lossy', 'lossless'], default='lossy')
quality = IntegerField(min_value=1, max_value=100, default=80)
format = ChoiceField(
choices=['jpeg', 'png', 'webp', 'avif', 'original'],
default='original'
)
keep_exif = BooleanField(default=True)
width = IntegerField(required=False, min_value=1, max_value=10000)
height = IntegerField(required=False, min_value=1, max_value=10000)
maintain_aspect_ratio = BooleanField(default=True)
class ColorHistorySerializer(ModelSerializer):
class Meta:
model = ColorHistory
fields = ['id', 'color', 'created_at']
read_only_fields = ['id', 'created_at']
class ColorHistorySyncSerializer(Serializer):
colors = ListField(
child=CharField(max_length=7),
help_text='颜色HEX值列表,如 ["#FF5733", "#33FF57"]'
)