155 lines
5.2 KiB
Python
155 lines
5.2 KiB
Python
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())
|