| | |
| | | |
| | | 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 |
| | | |
| | |
| | | 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) |