96 lines
4.0 KiB
Python
96 lines
4.0 KiB
Python
from rest_framework import serializers
|
||
from .models import GmailCredential, GmailConversation, GmailAttachment, UserGoal, AutoReplyConfig
|
||
from apps.user.models import User
|
||
import json
|
||
|
||
class GmailCredentialSerializer(serializers.ModelSerializer):
|
||
"""Gmail账号凭证的序列化器"""
|
||
|
||
# 额外字段,用于OAuth流程
|
||
client_secret_json = serializers.CharField(write_only=True, required=False)
|
||
auth_code = serializers.CharField(write_only=True, required=False, allow_blank=True)
|
||
|
||
class Meta:
|
||
model = GmailCredential
|
||
fields = ['id', 'user', 'email', 'is_default', 'is_valid', 'created_at', 'updated_at', 'client_secret_json', 'auth_code']
|
||
read_only_fields = ['id', 'user', 'email', 'is_valid', 'created_at', 'updated_at']
|
||
|
||
def validate_client_secret_json(self, value):
|
||
"""验证client_secret_json是否为有效的JSON"""
|
||
try:
|
||
json.loads(value)
|
||
return value
|
||
except Exception as e:
|
||
raise serializers.ValidationError(f"Invalid JSON: {str(e)}")
|
||
|
||
def to_representation(self, instance):
|
||
"""自定义数据表示方式,确保不泄露敏感数据"""
|
||
data = super().to_representation(instance)
|
||
# 移除敏感字段
|
||
if 'client_secret_json' in data:
|
||
del data['client_secret_json']
|
||
if 'auth_code' in data:
|
||
del data['auth_code']
|
||
return data
|
||
|
||
class SimpleGmailConversationSerializer(serializers.ModelSerializer):
|
||
"""Gmail对话的简易序列化器"""
|
||
class Meta:
|
||
model = GmailConversation
|
||
fields = ['conversation_id', 'user_email', 'influencer_email', 'title', 'created_at', 'updated_at', 'is_active']
|
||
|
||
class GmailAttachmentSerializer(serializers.ModelSerializer):
|
||
"""Gmail附件的序列化器"""
|
||
url = serializers.SerializerMethodField()
|
||
|
||
class Meta:
|
||
model = GmailAttachment
|
||
fields = ['id', 'filename', 'content_type', 'size', 'sender_email', 'created_at', 'url']
|
||
|
||
def get_url(self, obj):
|
||
"""获取附件URL"""
|
||
return obj.get_absolute_url()
|
||
|
||
class UserGoalSerializer(serializers.ModelSerializer):
|
||
"""用户目标的序列化器"""
|
||
conversation_id = serializers.CharField(write_only=True, required=False)
|
||
|
||
class Meta:
|
||
model = UserGoal
|
||
fields = ['id', 'user', 'conversation', 'description', 'status', 'is_active',
|
||
'created_at', 'updated_at', 'completion_time', 'last_activity_time',
|
||
'conversation_id', 'metadata']
|
||
read_only_fields = ['id', 'user', 'created_at', 'updated_at', 'completion_time', 'last_activity_time']
|
||
|
||
def to_representation(self, instance):
|
||
"""自定义数据表示方式"""
|
||
data = super().to_representation(instance)
|
||
# 添加conversation_id方便前端使用
|
||
if instance.conversation:
|
||
data['conversation_id'] = instance.conversation.conversation_id
|
||
return data
|
||
|
||
class AutoReplyConfigSerializer(serializers.ModelSerializer):
|
||
"""自动回复配置的序列化器"""
|
||
|
||
class Meta:
|
||
model = AutoReplyConfig
|
||
fields = ['id', 'user', 'user_email', 'influencer_email', 'is_enabled',
|
||
'goal_description', 'reply_template', 'max_replies', 'current_replies',
|
||
'last_reply_time', 'created_at', 'updated_at', 'metadata']
|
||
read_only_fields = ['id', 'user', 'current_replies', 'last_reply_time', 'created_at', 'updated_at']
|
||
|
||
def validate(self, data):
|
||
"""验证用户邮箱是否已授权"""
|
||
user = self.context['request'].user
|
||
user_email = data.get('user_email')
|
||
|
||
if user_email:
|
||
# 检查用户是否已授权该邮箱
|
||
credential = GmailCredential.objects.filter(user=user, email=user_email, is_valid=True).first()
|
||
if not credential:
|
||
raise serializers.ValidationError({"user_email": f"邮箱 {user_email} 未授权或授权已失效"})
|
||
|
||
return data
|
||
|