import json import logging from django.contrib.auth import authenticate from django.contrib.auth.hashers import make_password from django.db import transaction from django.shortcuts import render # Create your views here. from rest_framework import viewsets from rest_framework.response import Response from rest_framework.views import APIView from django.contrib.auth.models import Group from app.pagination import MyPageNumberPagination from app.utils import generate_token, decode_token_exp_time from department.models import Department from .models import UserProfile from .serializers import UserSerializer from .utils import update_user_querydict logger = logging.getLogger('mylogger') class UserViewSet(viewsets.GenericViewSet): def tp_login(self, request, *args, **kwargs): """登录 POST""" data = request.data username = data.get('username') password = data.get('password') login_user = authenticate(username=username, password=password) if login_user and login_user.is_active and login_user.status == 1: # 生成token token = generate_token(login_user) response = { 'success': True, 'msg': '登录成功', 'data': { 'username': login_user.username, 'roles': ['admin'] if login_user.is_superuser else ['common'], 'accessToken': token, 'expires': decode_token_exp_time(token) } } return Response(response) else: response = { 'success': False, 'msg': '登录失败', 'data': { 'username': None, 'roles': [], 'accessToken': None, 'expires': None } } return Response(response) def create(self, request, *args, **kwargs): """注册 POST 用户名 手机号 状态 性别 部门""" data = request.data username = data.get('username') if not username: return Response({'msg': '用户名不能为空'}) phone_number = data.get('phone_number') gender = data.get('gender') password = data.get('password', '#Yaxin0504') # role = data.get('role') # role_obj = Group.objects.filter(name=role).first() department_id = data.get('department_id') department_obj = Department.objects.filter(id=department_id).first() status = data.get('status', 1) try: if UserProfile.objects.filter(username=username).first(): return Response({'msg': '该用户名已存在,请换一个'}) user = UserProfile.objects.create_user(username=username, password=password, department=department_obj, status=status, gender=gender, phone_number=phone_number) # user.groups.add(role_obj) # user.save() return Response({'msg': '添加成功', 'success': True}) except Exception as e: response = { "msg": f'添加失败, 原因:{e}' } return Response(response) def query_users(self, request, *args, **kwargs): """查询所有用户,默认全部,可根据部门查询""" query_params = dict(request.query_params) logger.info(query_params) querydict = update_user_querydict(query_params) logger.info(querydict) if query_params.get('department_id') and query_params.get('department_id') != ['']: department_id = ''.join(query_params.get('department_id')) depart_obj = Department.objects.filter(id=department_id).first() if not depart_obj.parent_id: # 父级部门 dp_ids = list(Department.objects.filter(parent_id=depart_obj.id).values_list('id', flat=True).distinct()) else: dp_ids = [depart_obj.id] queryset = UserProfile.objects.filter(department_id__in=dp_ids, **querydict).order_by('-id') else: queryset = UserProfile.objects.filter(**querydict).order_by('-id') paginator = MyPageNumberPagination() paginated_queryset = paginator.paginate_queryset(queryset, request) serializer = UserSerializer(paginated_queryset, many=True) paginator_response = paginator.get_paginated_response(serializer.data) response_data = { 'count': paginator_response.data['count'], 'next': paginator_response.data['next'], 'previous': paginator_response.data['previous'], 'results': list(paginator_response.data['results']), } results = response_data.get('results') res_list = json.loads(json.dumps(results)) for res_dict in res_list: department_obj = Department.objects.filter(id=res_dict.get('department')).first() if department_obj: res_dict['department_name'] = department_obj.name res_dict['department_id'] = res_dict.pop('department') else: res_dict['department_name'] = '暂无部门' res_dict['department_id'] = '暂无' response_data['results'] = res_list return Response(response_data) # def set_user_role(self, request, *args, **kwargs): # try: # user_id = request.data.get('user_id') # user = UserProfile.objects.get(id=user_id) # group = Group.objects.get(name=request.data.get('role_name')) # is_member = group.user_set.filter(id=user.id).exists() # if is_member: # return Response({'msg': f'用户{user.username}已经是{group.name}啦'}) # user.groups.add(group) # user.save() # return Response({'msg': '修改用户角色成功'}) # except UserProfile.DoesNotExist: # return Response({'msg': '该用户不存在'}) # except Group.DoesNotExist: # return Response({'msg': '该角色不存在'}) # except Exception as e: # return Response({'msg': f'更改用户角色失败: {e}'}) def update_user(self, request, pk, *args, **kwargs): data = request.data if 'username' in data: user_obj = UserProfile.objects.exclude(id=pk).filter(username=data.get('username')).first() if user_obj: return Response({'msg': '更新失败,该用户名已存在,请换一个'}) # user_id = data.pop('user_id', None) if 'password' in data: # hashed_pwd = make_password(data.get('password')) data['password'] = make_password(data.pop('password')) try: with transaction.atomic(): user = UserProfile.objects.filter(id=pk).update(**data) return Response({'msg': '更新成功', 'success': True}) except UserProfile.DoesNotExist: return Response({'msg': '该用户不存在'}) except Exception as e: return Response({'msg': f'更新失败,原因{e}'}) def delete_user(self, request, pk, *args, **kwargs): try: with transaction.atomic(): user = UserProfile.objects.filter(id=pk).delete() return Response({'msg': '删除成功', 'success': True}) except UserProfile.DoesNotExist: return Response({'msg': '该用户不存在'}) except Exception as e: return Response({'msg': f'删除失败,原因{e}'}) # class RoleView(APIView): # def get(self, request): # queryset = Group.objects.all().order_by('-id') # paginator = MyPageNumberPagination() # paginated_queryset = paginator.paginate_queryset(queryset, request) # # results = [] # for group in paginated_queryset: # results.append({ # 'id': group.id, # 'name': group.name, # }) # # response = { # 'count': paginator.page.paginator.count, # 'next': paginator.get_next_link(), # 'previous': paginator.get_previous_link(), # 'results': results # } # # return Response(response) # # def post(self, request, *args, **kwargs): # """添加角色""" # data = request.data # group_name = data.get('role_name') # try: # old_group = Group.objects.filter(name=group_name).first() # if old_group: # return Response({"msg": "该角色名已存在"}) # with transaction.atomic(): # group = Group.objects.create(name=group_name) # group.save() # return Response({"msg": "创建成功"}) # except Exception as e: # return Response({"msg": f"创建失败:{e}"}) # # # # def put(self, request, pk): # group_name = request.data.get('role_name') # try: # with transaction.atomic(): # 开启事务 # group = Group.objects.get(id=pk) # group.name = group_name # group.save() # return Response({'success': True, 'msg': 'Group updated successfully'}) # except Group.DoesNotExist: # return Response({'success': False, 'msg': 'Group not found'}) # except Exception as e: # return Response({'success': False, 'msg': str(e)}) # # def delete(self, request, pk): # try: # with transaction.atomic(): # 开启事务 # group = Group.objects.get(id=pk) # group.delete() # return Response({'success': True, 'msg': 'Group deleted successfully'}) # except Group.DoesNotExist: # return Response({'success': False, 'msg': 'Group not found'}) # except Exception as e: # return Response({'success': False, 'msg': str(e)}) # # def modify_permission(self, request, *args, **kwargs): # pass