All checks were successful
Build and Deploy / build-and-deploy (push) Successful in 17m15s
【主副管理员】
①User 加 is_team_owner 字段,现有团管自动升为主管
②主管可指定/取消副管理员,副管不能再指定别人
③副管不能禁用/修改其他管理员
④超管团队详情支持三种角色显示和切换
【素材引用 bug 修复】
⑤span.replaceWith('') → span.remove(),删除引用后标签真正移除
⑥switchMode 时清空 assetMentions,切换模式不带旧素材
⑦fallback 只在纯文本时生效,用户删标签后不再偷偷加回
⑧后端跳过未解析的 asset:// URL,不发给火山 API
【admin 保护】
⑨admin 账号不可被任何人禁用
⑩admin 密码不可被其他超管重置
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
57 lines
1.9 KiB
Python
57 lines
1.9 KiB
Python
from rest_framework import serializers
|
|
from django.contrib.auth import get_user_model
|
|
from rest_framework_simplejwt.tokens import RefreshToken
|
|
|
|
User = get_user_model()
|
|
|
|
|
|
class UserSerializer(serializers.ModelSerializer):
|
|
role = serializers.CharField(read_only=True)
|
|
team_name = serializers.CharField(source='team.name', read_only=True, default=None)
|
|
|
|
class Meta:
|
|
model = User
|
|
fields = ('id', 'username', 'email', 'is_staff', 'is_team_admin', 'is_team_owner', 'role', 'team_name', 'must_change_password')
|
|
|
|
|
|
class RegisterSerializer(serializers.Serializer):
|
|
username = serializers.CharField(min_length=3, max_length=20)
|
|
email = serializers.EmailField()
|
|
password = serializers.CharField(min_length=6, write_only=True)
|
|
|
|
def validate_username(self, value):
|
|
if User.objects.filter(username=value).exists():
|
|
raise serializers.ValidationError('该用户名已被注册')
|
|
return value
|
|
|
|
def validate_email(self, value):
|
|
if User.objects.filter(email=value).exists():
|
|
raise serializers.ValidationError('该邮箱已被注册')
|
|
return value
|
|
|
|
def create(self, validated_data):
|
|
user = User.objects.create_user(
|
|
username=validated_data['username'],
|
|
email=validated_data['email'],
|
|
password=validated_data['password'],
|
|
)
|
|
return user
|
|
|
|
|
|
class LoginSerializer(serializers.Serializer):
|
|
username = serializers.CharField()
|
|
password = serializers.CharField(write_only=True)
|
|
|
|
|
|
class TokenResponseSerializer(serializers.Serializer):
|
|
"""Response serializer for auth endpoints."""
|
|
user = UserSerializer()
|
|
tokens = serializers.SerializerMethodField()
|
|
|
|
def get_tokens(self, obj):
|
|
refresh = RefreshToken.for_user(obj)
|
|
return {
|
|
'access': str(refresh.access_token),
|
|
'refresh': str(refresh),
|
|
}
|