You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

243 lines
9.9 KiB
Python

1 year ago
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