XinXiKuaiBaoYuan/django-backend/tasks/serializers.py

155 lines
5.2 KiB
Python
Raw Permalink Normal View History

from rest_framework import serializers
from .models import Task, Report, ReportSource, TaskLog
class TaskSerializer(serializers.ModelSerializer):
"""任务序列化器"""
report_count = serializers.ReadOnlyField()
has_new_report = serializers.ReadOnlyField()
class Meta:
model = Task
fields = [
'id', 'title', 'description', 'requirement', 'type', 'status',
'schedule_config', 'sources_config', 'web_search_enabled',
'last_report_time', 'next_run_time', 'created_at', 'updated_at',
'report_count', 'has_new_report'
]
read_only_fields = ['id', 'created_at', 'updated_at', 'last_report_time']
class CreateTaskSerializer(serializers.Serializer):
"""创建任务的序列化器"""
requirement = serializers.CharField(max_length=5000, help_text='用户需求描述')
type = serializers.ChoiceField(choices=['single', 'scheduled'], help_text='任务类型')
schedule = serializers.JSONField(required=False, allow_null=True, help_text='周期任务配置')
presetSources = serializers.ListField(
child=serializers.DictField(),
required=False,
default=list,
help_text='预设信息源'
)
customSources = serializers.ListField(
child=serializers.DictField(),
required=False,
default=list,
help_text='自定义信息源'
)
webSearchEnabled = serializers.BooleanField(default=True, help_text='是否启用联网搜索')
def validate_schedule(self, value):
"""验证周期任务配置"""
task_type = self.initial_data.get('type')
# 单次任务允许schedule为None或null
if task_type == 'single':
return None
# 周期任务必须有schedule配置
if task_type == 'scheduled':
if not value:
raise serializers.ValidationError('周期任务必须提供执行周期配置')
required_fields = ['frequency', 'time']
for field in required_fields:
if field not in value:
raise serializers.ValidationError(f'周期任务配置缺少必要字段: {field}')
return value
class ReportSourceSerializer(serializers.ModelSerializer):
"""报告来源序列化器"""
class Meta:
model = ReportSource
fields = [
'id', 'source_type', 'source_name', 'source_url',
'extracted_content', 'collected_at'
]
class ReportSerializer(serializers.ModelSerializer):
"""报告序列化器"""
task_title = serializers.CharField(source='task.title', read_only=True)
sources = ReportSourceSerializer(many=True, read_only=True)
class Meta:
model = Report
fields = [
'id', 'task_id', 'task_title', 'title', 'summary', 'content',
'source_tag', 'word_count', 'status', 'generated_at',
'created_at', 'updated_at', 'sources'
]
read_only_fields = ['id', 'created_at', 'updated_at', 'word_count']
class ReportListSerializer(serializers.ModelSerializer):
"""报告列表序列化器不包含content字段"""
task_title = serializers.CharField(source='task.title', read_only=True)
class Meta:
model = Report
fields = [
'id', 'task_id', 'task_title', 'title', 'summary',
'source_tag', 'word_count', 'status', 'generated_at'
]
class TaskLogSerializer(serializers.ModelSerializer):
"""任务日志序列化器"""
class Meta:
model = TaskLog
fields = [
'id', 'action_type', 'message', 'error_details', 'created_at'
]
read_only_fields = ['id', 'created_at']
class TaskDetailSerializer(TaskSerializer):
"""任务详情序列化器"""
logs = TaskLogSerializer(many=True, read_only=True)
recent_reports = serializers.SerializerMethodField()
class Meta(TaskSerializer.Meta):
fields = TaskSerializer.Meta.fields + ['logs', 'recent_reports']
def get_recent_reports(self, obj):
"""获取最近的3个报告"""
recent_reports = obj.reports.filter(status='completed')[:3]
return ReportListSerializer(recent_reports, many=True).data
class UpdateTaskStatusSerializer(serializers.Serializer):
"""更新任务状态的序列化器"""
status = serializers.ChoiceField(choices=['running', 'paused'], help_text='任务状态')
class TaskStatisticsSerializer(serializers.Serializer):
"""任务统计序列化器"""
total_tasks = serializers.IntegerField()
running_tasks = serializers.IntegerField()
paused_tasks = serializers.IntegerField()
error_tasks = serializers.IntegerField()
completed_tasks = serializers.IntegerField()
today_reports = serializers.IntegerField()
weekly_reports = serializers.IntegerField()
class ReportStatisticsSerializer(serializers.Serializer):
"""报告统计序列化器"""
total_reports = serializers.IntegerField()
generated_today = serializers.IntegerField()
average_word_count = serializers.FloatField()
source_distribution = serializers.DictField()
daily_generation = serializers.ListField(child=serializers.DictField())