Files
meeting-room/backend/meetings/serializers.py

77 lines
2.5 KiB
Python
Raw Normal View History

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'
]
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']