operations_project/apps/gmail/serializers.py
2025-05-20 15:57:10 +08:00

96 lines
4.0 KiB
Python
Raw 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 GmailCredential, GmailConversation, GmailAttachment, UserGoal, AutoReplyConfig
from apps.accounts.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