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