# -*- coding: utf-8 -*- """ @Remark: 用户管理 """ from django.contrib.auth.hashers import make_password from rest_framework import serializers from mysystem.models import Users,Role from utils.jsonResponse import SuccessResponse, ErrorResponse from utils.permission import CustomPermission from utils.serializers import CustomModelSerializer from utils.validator import CustomUniqueValidator from utils.viewset import CustomModelViewSet from rest_framework.permissions import IsAuthenticated from django.db.models import Q from utils.filters import UsersManageTimeFilter class UserSerializer(CustomModelSerializer): """ 用户管理-序列化器 """ roleNames = serializers.SerializerMethodField(read_only=True) # 新增自定义字段 deptName = serializers.SerializerMethodField(read_only=True) # 新增自定义字段 def get_deptName(self,obj): try: return obj.dept.name except: return "" def get_roleNames(self,obj): return list(obj.role.values_list('name', flat=True)) class Meta: model = Users read_only_fields = ["id"] exclude = ['password','user_permissions','groups'] extra_kwargs = { 'post': {'required': False}, } class UserCreateSerializer(CustomModelSerializer): """ 管理员用户新增-序列化器 """ username = serializers.CharField(max_length=50,validators=[CustomUniqueValidator(queryset=Users.objects.all(), message="账号必须唯一")]) password = serializers.CharField(required=False, default=make_password("123456")) is_staff = serializers.BooleanField(required=False,default=True)#是否允许登录后台 def create(self, validated_data): if "password" in validated_data.keys(): if validated_data['password']: validated_data['password'] = make_password(validated_data['password']) validated_data['identity'] = 1 return super().create(validated_data) def save(self, **kwargs): data = super().save(**kwargs) data.post.set(self.initial_data.get('post', [])) return data class Meta: model = Users fields = "__all__" read_only_fields = ["id"] extra_kwargs = { 'post': {'required': False}, } class UserUpdateSerializer(CustomModelSerializer): """ 用户修改-序列化器 """ username = serializers.CharField(max_length=50,validators=[CustomUniqueValidator(queryset=Users.objects.all(), message="账号必须唯一")]) password = serializers.CharField(required=False, allow_blank=True) def update(self, instance, validated_data): if "password" in validated_data.keys(): if validated_data['password']: validated_data['password'] = make_password(validated_data['password']) return super().update(instance,validated_data) def save(self, **kwargs): data = super().save(**kwargs) data.post.set(self.initial_data.get('post', [])) return data class Meta: model = Users read_only_fields = ["id"] fields = "__all__" extra_kwargs = { 'post': {'required': False, 'read_only': True}, } class UserViewSet(CustomModelViewSet): """ 后台管理员用户接口: """ queryset = Users.objects.filter(identity=1,is_delete=False).order_by('-create_datetime') serializer_class = UserSerializer create_serializer_class = UserCreateSerializer update_serializer_class = UserUpdateSerializer search_fields = ('name','username') filterset_class = UsersManageTimeFilter def user_info(self,request): """获取当前用户信息""" user = request.user role_list = user.role.values_list('id',"name") role_ids = [i[0] for i in role_list] role_names = "" if user.identity == 0: role_names = "超级管理员" else: role_names_list = [i[1] for i in role_list] role_names = ','.join(role_names_list) dept = getattr(user, 'dept', None) dept_info = {} if dept: dept_info = { 'dept_id': dept.id, 'dept_name': dept.name } result = { "name":user.name, "mobile":user.mobile, "gender":user.gender, "email":user.email, "username":user.username, "identity":user.identity, "avatar": user.avatar, "dept": user.dept_id, "dept_info":dept_info, "is_superuser": user.is_superuser, "role_ids": role_ids, "role_names":role_names, } return SuccessResponse(data=result,msg="获取成功") def update_user_info(self,request): """修改当前用户信息""" user = request.user reqData = request.data Users.objects.filter(id=user.id).update(email=reqData.get('email'),name=reqData.get('name'),gender=reqData.get('gender'),mobile=reqData.get('mobile')) return SuccessResponse(data=None, msg="修改成功") def change_password(self,request,*args, **kwargs): """密码修改""" user = request.user instance = Users.objects.filter(id=user.id,identity__in=[0,1]).first() data = request.data old_pwd = data.get('oldPassword') new_pwd = data.get('newPassword') new_pwd2 = data.get('newPassword2') if instance: if new_pwd != new_pwd2: return ErrorResponse(msg="2次密码不匹配") elif instance.check_password(old_pwd): instance.password = make_password(new_pwd) instance.save() return SuccessResponse(data=None, msg="修改成功") else: return ErrorResponse(msg="旧密码不正确") else: return ErrorResponse(msg="未获取到用户")