XinXiKuaiBaoYuan/django-backend/tasks/serializers.py

155 lines
5.2 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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())