From 44480e71b27aa9d4cb8441f50c873f1b110e9691 Mon Sep 17 00:00:00 2001
From: hyb <kk_huangyangbo@163.com>
Date: Fri, 30 Jan 2026 07:20:06 +0000
Subject: [PATCH] fix: 修复部分已知问题

---
 测试组/Test_platform/Interface_automation/backend/apps/lunaruser/serializers.py |  170 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 170 insertions(+), 0 deletions(-)

diff --git "a/\346\265\213\350\257\225\347\273\204/Test_platform/Interface_automation/backend/apps/lunaruser/serializers.py" "b/\346\265\213\350\257\225\347\273\204/Test_platform/Interface_automation/backend/apps/lunaruser/serializers.py"
index 0f05856..5bcac19 100644
--- "a/\346\265\213\350\257\225\347\273\204/Test_platform/Interface_automation/backend/apps/lunaruser/serializers.py"
+++ "b/\346\265\213\350\257\225\347\273\204/Test_platform/Interface_automation/backend/apps/lunaruser/serializers.py"
@@ -10,6 +10,7 @@
 
 from rest_framework import serializers
 from django.contrib.auth import get_user_model
+from django.contrib.auth.models import Group
 
 from lunarlink.models import LoginLog
 
@@ -67,3 +68,172 @@
         if attrs['new_password'] != attrs['confirm_password']:
             raise serializers.ValidationError("两次输入的新密码不一致")
         return attrs
+
+
+class UserCreateSerializer(serializers.ModelSerializer):
+    """
+    创建用户序列化
+    """
+    password = serializers.CharField(required=True, min_length=6, max_length=128, write_only=True)
+    confirm_password = serializers.CharField(required=True, max_length=128, write_only=True)
+    groups = serializers.PrimaryKeyRelatedField(
+        many=True,
+        queryset=Group.objects.all(),
+        required=False
+    )
+
+    class Meta:
+        model = User
+        fields = ['id', 'username', 'password', 'confirm_password', 'name', 'phone', 'is_staff', 'is_superuser', 'is_active', 'groups', 'show_hosts']
+
+    def validate(self, attrs):
+        if attrs['password'] != attrs['confirm_password']:
+            raise serializers.ValidationError("两次输入的密码不一致")
+        return attrs
+
+    def create(self, validated_data):
+        validated_data.pop('confirm_password')
+        password = validated_data.pop('password')
+        groups = validated_data.pop('groups', None)
+        user = User(**validated_data)
+        user.set_password(password)
+        user.save()
+        if groups:
+            user.groups.set(groups)
+        return user
+
+
+class UserUpdateSerializer(serializers.ModelSerializer):
+    """
+    更新用户序列化
+    """
+    groups = serializers.PrimaryKeyRelatedField(
+        many=True,
+        queryset=Group.objects.all(),
+        required=False
+    )
+
+    class Meta:
+        model = User
+        fields = ['id', 'username', 'name', 'phone', 'is_staff', 'is_superuser', 'is_active', 'groups', 'show_hosts']
+
+    def update(self, instance, validated_data):
+        groups = validated_data.pop('groups', None)
+        for attr, value in validated_data.items():
+            setattr(instance, attr, value)
+        instance.save()
+        if groups is not None:
+            instance.groups.set(groups)
+        return instance
+
+
+class UserDetailSerializer(serializers.ModelSerializer):
+    """
+    用户详情序列化
+    """
+    groups = serializers.SerializerMethodField()
+    accessible_projects = serializers.SerializerMethodField()
+    status_display = serializers.CharField(source='get_status_display', read_only=True)
+
+    class Meta:
+        model = User
+        fields = ['id', 'username', 'name', 'phone', 'is_staff', 'is_superuser', 'is_active', 'groups', 'show_hosts', 'date_joined', 'last_login', 'accessible_projects', 'status', 'status_display']
+
+    def get_groups(self, obj):
+        return [g.name for g in obj.groups.all()]
+
+    def get_accessible_projects(self, obj):
+        from lunarlink.models import Project
+        user_groups = obj.groups.all()
+        return list(Project.objects.filter(groups__in=user_groups).distinct().values_list("name", flat=True))
+
+
+class UserRegisterSerializer(serializers.ModelSerializer):
+    """
+    用户注册序列化
+    """
+    password = serializers.CharField(required=True, min_length=6, max_length=128, write_only=True)
+    confirm_password = serializers.CharField(required=True, max_length=128, write_only=True)
+    groups = serializers.PrimaryKeyRelatedField(
+        many=True,
+        queryset=Group.objects.all(),
+        required=False
+    )
+
+    class Meta:
+        model = User
+        fields = ['username', 'password', 'confirm_password', 'name', 'phone', 'groups']
+        extra_kwargs = {
+            'username': {'validators': []},
+            'phone': {'validators': []}
+        }
+
+    def validate_username(self, value):
+        existing_user = User.objects.filter(username=value).first()
+        if existing_user and existing_user.status != 'rejected':
+            raise serializers.ValidationError("用户名已存在")
+        return value
+
+    def validate_phone(self, value):
+        if value:
+            existing_user = User.objects.filter(phone=value).first()
+            if existing_user and existing_user.status != 'rejected':
+                raise serializers.ValidationError("手机号已存在")
+        return value
+
+    def validate(self, attrs):
+        if attrs['password'] != attrs['confirm_password']:
+            raise serializers.ValidationError("两次输入的密码不一致")
+        return attrs
+
+    def create(self, validated_data):
+        validated_data.pop('confirm_password')
+        password = validated_data.pop('password')
+        groups = validated_data.pop('groups', None)
+        
+        username = validated_data['username']
+        phone = validated_data.get('phone')
+        
+        existing_user = User.objects.filter(username=username).first()
+        if existing_user and existing_user.status == 'rejected':
+            user = existing_user
+            user.name = validated_data.get('name', user.name)
+            user.phone = phone
+            user.set_password(password)
+            user.status = 'pending'
+            user.is_active = False
+            user.save()
+            if groups:
+                user.groups.set(groups)
+            return user
+        
+        if phone:
+            existing_phone_user = User.objects.filter(phone=phone).first()
+            if existing_phone_user and existing_phone_user.status == 'rejected':
+                user = existing_phone_user
+                user.username = username
+                user.name = validated_data.get('name', user.name)
+                user.set_password(password)
+                user.status = 'pending'
+                user.is_active = False
+                user.save()
+                if groups:
+                    user.groups.set(groups)
+                return user
+        
+        user = User(**validated_data)
+        user.set_password(password)
+        user.status = 'pending'
+        user.is_active = False
+        user.save()
+        if groups:
+            user.groups.set(groups)
+        return user
+
+
+class UserApprovalSerializer(serializers.Serializer):
+    """
+    用户审批序列化
+    """
+    action = serializers.ChoiceField(choices=['approve', 'reject'])
+    reason = serializers.CharField(required=False, allow_blank=True, max_length=500)

--
Gitblit v1.9.1