89 lines
3.2 KiB
Python
89 lines
3.2 KiB
Python
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"]'
|
|
)
|