2025-04-29 10:22:57 +08:00
|
|
|
|
from rest_framework import serializers
|
|
|
|
|
from user_management.models import OperatorAccount, PlatformAccount, Video, KnowledgeBase, KnowledgeBaseDocument
|
|
|
|
|
import uuid
|
2025-05-07 16:12:35 +08:00
|
|
|
|
from django.db.models import Q
|
2025-04-29 10:22:57 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class OperatorAccountSerializer(serializers.ModelSerializer):
|
|
|
|
|
id = serializers.UUIDField(read_only=False, required=False) # 允许前端不提供ID,但如果提供则必须是有效的UUID
|
|
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
model = OperatorAccount
|
|
|
|
|
fields = ['id', 'username', 'password', 'real_name', 'email', 'phone', 'position', 'department', 'is_active', 'created_at', 'updated_at']
|
|
|
|
|
read_only_fields = ['created_at', 'updated_at']
|
|
|
|
|
extra_kwargs = {
|
|
|
|
|
'password': {'write_only': True}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
def create(self, validated_data):
|
|
|
|
|
# 如果没有提供ID,则生成一个UUID
|
|
|
|
|
if 'id' not in validated_data:
|
|
|
|
|
validated_data['id'] = uuid.uuid4()
|
|
|
|
|
|
|
|
|
|
password = validated_data.pop('password', None)
|
|
|
|
|
instance = self.Meta.model(**validated_data)
|
|
|
|
|
if password:
|
|
|
|
|
instance.password = password # 在实际应用中应该加密存储密码
|
|
|
|
|
instance.save()
|
|
|
|
|
return instance
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class PlatformAccountSerializer(serializers.ModelSerializer):
|
|
|
|
|
operator_name = serializers.CharField(source='operator.real_name', read_only=True)
|
|
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
model = PlatformAccount
|
|
|
|
|
fields = ['id', 'operator', 'operator_name', 'platform_name', 'account_name', 'account_id',
|
|
|
|
|
'status', 'followers_count', 'account_url', 'description',
|
2025-04-29 14:56:10 +08:00
|
|
|
|
'tags', 'profile_image', 'last_posting',
|
2025-04-29 10:22:57 +08:00
|
|
|
|
'created_at', 'updated_at', 'last_login']
|
|
|
|
|
read_only_fields = ['id', 'created_at', 'updated_at']
|
|
|
|
|
|
|
|
|
|
def to_internal_value(self, data):
|
|
|
|
|
# 处理operator字段,可能是字符串格式的UUID
|
|
|
|
|
if 'operator' in data and isinstance(data['operator'], str):
|
|
|
|
|
try:
|
|
|
|
|
# 尝试获取对应的运营账号对象
|
|
|
|
|
operator = OperatorAccount.objects.get(id=data['operator'])
|
|
|
|
|
data['operator'] = operator.id # 确保使用正确的ID格式
|
|
|
|
|
except OperatorAccount.DoesNotExist:
|
|
|
|
|
# 如果找不到对应的运营账号,保持原值,让验证器捕获此错误
|
|
|
|
|
pass
|
|
|
|
|
except Exception as e:
|
|
|
|
|
# 其他类型的错误,如ID格式不正确等
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
return super().to_internal_value(data)
|
|
|
|
|
|
|
|
|
|
|
2025-05-07 16:12:35 +08:00
|
|
|
|
class PlatformDetailSerializer(serializers.Serializer):
|
|
|
|
|
"""平台详情序列化器,用于多平台账号创建"""
|
|
|
|
|
platform_name = serializers.ChoiceField(choices=PlatformAccount.PLATFORM_CHOICES)
|
|
|
|
|
platform_url = serializers.URLField()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class MultiPlatformAccountSerializer(serializers.Serializer):
|
|
|
|
|
"""多平台账号创建序列化器"""
|
|
|
|
|
operator = serializers.PrimaryKeyRelatedField(queryset=OperatorAccount.objects.all())
|
|
|
|
|
account_name = serializers.CharField(max_length=100)
|
|
|
|
|
account_id = serializers.CharField(max_length=100)
|
|
|
|
|
status = serializers.ChoiceField(choices=PlatformAccount.STATUS_CHOICES, default='active')
|
|
|
|
|
followers_count = serializers.IntegerField(default=0)
|
|
|
|
|
description = serializers.CharField(required=False, allow_blank=True, allow_null=True)
|
|
|
|
|
tags = serializers.CharField(required=False, allow_blank=True, allow_null=True, max_length=255)
|
|
|
|
|
profile_image = serializers.URLField(required=False, allow_blank=True, allow_null=True)
|
|
|
|
|
last_posting = serializers.DateTimeField(required=False, allow_null=True)
|
|
|
|
|
platforms = PlatformDetailSerializer(many=True)
|
|
|
|
|
|
|
|
|
|
def to_internal_value(self, data):
|
|
|
|
|
# 处理operator字段,可能是字符串类型的ID
|
|
|
|
|
if 'operator' in data and isinstance(data['operator'], str):
|
|
|
|
|
try:
|
|
|
|
|
# 尝试通过ID查找运营账号
|
|
|
|
|
operator_id = data['operator']
|
|
|
|
|
try:
|
|
|
|
|
# 先尝试通过整数ID查找
|
|
|
|
|
operator_id_int = int(operator_id)
|
|
|
|
|
operator = OperatorAccount.objects.get(id=operator_id_int)
|
|
|
|
|
data['operator'] = operator.id
|
|
|
|
|
except (ValueError, OperatorAccount.DoesNotExist):
|
|
|
|
|
# 如果无法转换为整数或找不到对应账号,尝试通过用户名或真实姓名查找
|
|
|
|
|
operator = OperatorAccount.objects.filter(
|
|
|
|
|
Q(username=operator_id) | Q(real_name=operator_id)
|
|
|
|
|
).first()
|
|
|
|
|
|
|
|
|
|
if operator:
|
|
|
|
|
data['operator'] = operator.id
|
|
|
|
|
except Exception as e:
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
return super().to_internal_value(data)
|
|
|
|
|
|
|
|
|
|
|
2025-04-29 10:22:57 +08:00
|
|
|
|
class VideoSerializer(serializers.ModelSerializer):
|
|
|
|
|
platform_account_name = serializers.CharField(source='platform_account.account_name', read_only=True)
|
|
|
|
|
platform_name = serializers.CharField(source='platform_account.platform_name', read_only=True)
|
|
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
model = Video
|
|
|
|
|
fields = ['id', 'platform_account', 'platform_account_name', 'platform_name', 'title',
|
|
|
|
|
'description', 'video_url', 'local_path', 'thumbnail_url', 'status',
|
|
|
|
|
'views_count', 'likes_count', 'comments_count', 'shares_count', 'tags',
|
|
|
|
|
'publish_time', 'scheduled_time', 'created_at', 'updated_at']
|
|
|
|
|
read_only_fields = ['id', 'created_at', 'updated_at', 'views_count', 'likes_count',
|
|
|
|
|
'comments_count', 'shares_count']
|
|
|
|
|
|
|
|
|
|
def to_internal_value(self, data):
|
|
|
|
|
# 处理platform_account字段,可能是字符串格式的UUID
|
|
|
|
|
if 'platform_account' in data and isinstance(data['platform_account'], str):
|
|
|
|
|
try:
|
|
|
|
|
# 尝试获取对应的平台账号对象
|
|
|
|
|
platform_account = PlatformAccount.objects.get(id=data['platform_account'])
|
|
|
|
|
data['platform_account'] = platform_account.id # 确保使用正确的ID格式
|
|
|
|
|
except PlatformAccount.DoesNotExist:
|
|
|
|
|
# 如果找不到对应的平台账号,保持原值,让验证器捕获此错误
|
|
|
|
|
pass
|
|
|
|
|
except Exception as e:
|
|
|
|
|
# 其他类型的错误,如ID格式不正确等
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
return super().to_internal_value(data)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class KnowledgeBaseSerializer(serializers.ModelSerializer):
|
|
|
|
|
class Meta:
|
|
|
|
|
model = KnowledgeBase
|
|
|
|
|
fields = ['id', 'user_id', 'name', 'desc', 'type', 'department', 'group',
|
|
|
|
|
'external_id', 'create_time', 'update_time']
|
|
|
|
|
read_only_fields = ['id', 'create_time', 'update_time']
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class KnowledgeBaseDocumentSerializer(serializers.ModelSerializer):
|
|
|
|
|
class Meta:
|
|
|
|
|
model = KnowledgeBaseDocument
|
|
|
|
|
fields = ['id', 'knowledge_base', 'document_id', 'document_name',
|
|
|
|
|
'external_id', 'uploader_name', 'status', 'create_time', 'update_time']
|
|
|
|
|
read_only_fields = ['id', 'create_time', 'update_time']
|