operations_project/apps/gmail/serializers.py

96 lines
4.0 KiB
Python
Raw Permalink Normal View History

2025-05-13 11:58:17 +08:00
from rest_framework import serializers
2025-05-20 15:57:10 +08:00
from .models import GmailCredential, GmailConversation, GmailAttachment, UserGoal, AutoReplyConfig
from apps.accounts.models import User
2025-05-13 11:58:17 +08:00
import json
class GmailCredentialSerializer(serializers.ModelSerializer):
2025-05-20 15:57:10 +08:00
"""Gmail账号凭证的序列化器"""
# 额外字段用于OAuth流程
client_secret_json = serializers.CharField(write_only=True, required=False)
2025-05-13 11:58:17 +08:00
auth_code = serializers.CharField(write_only=True, required=False, allow_blank=True)
2025-05-20 15:57:10 +08:00
2025-05-13 11:58:17 +08:00
class Meta:
model = GmailCredential
2025-05-20 15:57:10 +08:00
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
2025-05-13 11:58:17 +08:00
2025-05-20 15:57:10 +08:00
class SimpleGmailConversationSerializer(serializers.ModelSerializer):
"""Gmail对话的简易序列化器"""
class Meta:
model = GmailConversation
fields = ['conversation_id', 'user_email', 'influencer_email', 'title', 'created_at', 'updated_at', 'is_active']
2025-05-13 11:58:17 +08:00
2025-05-20 15:57:10 +08:00
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()
2025-05-13 11:58:17 +08:00
2025-05-20 15:57:10 +08:00
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
2025-05-13 11:58:17 +08:00
return data
2025-05-20 15:57:10 +08:00
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):
"""验证用户邮箱是否已授权"""
2025-05-13 11:58:17 +08:00
user = self.context['request'].user
2025-05-20 15:57:10 +08:00
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