核心功能:
- Meeting 模型:添加 host_agent_id, host_instance_id
- 会议纪要 API:记录获取 + 纪要上传 + 结束通知
- 会议结束自动通知主持龙虾生成纪要
- 平台留存纪要供参会者下载
API 端点:
- GET /api/v1/meetings/{id}/records/ - 获取会议记录(主持专用)
- POST /api/v1/meetings/{id}/minutes/upload/ - 上传纪要(主持专用)
- POST /api/v1/meetings/{id}/end-notify/ - 会议结束通知
测试:
- test_host_minutes.py: 完整流程测试通过
算力分配:
- 中央平台:消息路由 + 数据存储(轻量级)
- 主持龙虾:生成纪要(消耗用户算力)
- 平台留存:纪要供所有参会者下载
78 lines
2.6 KiB
Python
78 lines
2.6 KiB
Python
from rest_framework import serializers
|
||
from .models import Meeting, Participant, Message, MeetingMinutes
|
||
from django.contrib.auth import get_user_model
|
||
|
||
User = get_user_model()
|
||
|
||
|
||
class UserSerializer(serializers.ModelSerializer):
|
||
"""用户序列化器"""
|
||
class Meta:
|
||
model = User
|
||
fields = ['id', 'username', 'email', 'created_at']
|
||
|
||
|
||
class MeetingSerializer(serializers.ModelSerializer):
|
||
"""会议室序列化器"""
|
||
host_name = serializers.CharField(source='host.username', read_only=True)
|
||
participant_count = serializers.SerializerMethodField()
|
||
|
||
class Meta:
|
||
model = Meeting
|
||
fields = [
|
||
'id', 'topic', 'host', 'host_name', 'status', 'invite_code',
|
||
'created_at', 'started_at', 'ended_at', 'participant_count',
|
||
'host_agent_id', 'host_instance_id', 'minutes_generated', 'minutes_uploaded_at'
|
||
]
|
||
read_only_fields = ['host', 'invite_code', 'status']
|
||
|
||
def get_participant_count(self, obj):
|
||
return obj.participants.filter(left_at__isnull=True).count()
|
||
|
||
def create(self, validated_data):
|
||
# 使用第一个用户作为 host(临时方案)
|
||
host = User.objects.first()
|
||
validated_data['host'] = host
|
||
return super().create(validated_data)
|
||
|
||
|
||
class ParticipantSerializer(serializers.ModelSerializer):
|
||
"""参会者序列化器"""
|
||
class Meta:
|
||
model = Participant
|
||
fields = [
|
||
'id', 'meeting', 'user', 'agent_type', 'agent_id',
|
||
'agent_name', 'agent_emoji', 'nickname', 'is_host',
|
||
'joined_at', 'api_key'
|
||
]
|
||
read_only_fields = ['api_key', 'joined_at']
|
||
|
||
|
||
class MessageSerializer(serializers.ModelSerializer):
|
||
"""消息序列化器"""
|
||
sender_name = serializers.CharField(source='sender.nickname', read_only=True)
|
||
sender_emoji = serializers.CharField(source='sender.agent_emoji', read_only=True)
|
||
|
||
class Meta:
|
||
model = Message
|
||
fields = [
|
||
'id', 'meeting', 'sender', 'sender_name', 'sender_emoji',
|
||
'content', 'created_at', 'is_broadcast', 'requires_response',
|
||
'in_reply_to', 'read_by'
|
||
]
|
||
read_only_fields = ['sender', 'created_at']
|
||
|
||
|
||
class InboxSerializer(serializers.Serializer):
|
||
"""信箱序列化器"""
|
||
unread_count = serializers.IntegerField()
|
||
messages = MessageSerializer(many=True)
|
||
|
||
|
||
class MeetingMinutesSerializer(serializers.ModelSerializer):
|
||
"""会议纪要序列化器"""
|
||
class Meta:
|
||
model = MeetingMinutes
|
||
fields = ['meeting', 'content', 'generated_at', 'exported_at']
|
||
read_only_fields = ['meeting', 'generated_at']
|