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.
270 lines
9.2 KiB
Python
270 lines
9.2 KiB
Python
import logging
|
|
from rest_framework import viewsets
|
|
from rest_framework.response import Response
|
|
from rest_framework import status
|
|
from app.pagination import MyPageNumberPagination
|
|
from user.models import UserProfile, Department
|
|
from django.contrib.auth import authenticate, login, logout
|
|
from app.utils import generate_token, decode_token_exp_time
|
|
from user.serializers import UserSerializer, UserFilter, DepartmentSerializer, DepartmentFilter
|
|
from rest_framework.exceptions import NotFound
|
|
|
|
# Create your views here.
|
|
logger = logging.getLogger('mylogger')
|
|
|
|
|
|
class UserViewSet(viewsets.GenericViewSet):
|
|
# 查询类
|
|
queryset = UserProfile.objects.filter(status=1).all().order_by("-id") # 按照uid倒序
|
|
# 序列化类
|
|
serializer_class = UserSerializer
|
|
# # 分页类
|
|
pagination_class = MyPageNumberPagination
|
|
#
|
|
# 条件筛选
|
|
filterset_class = UserFilter
|
|
|
|
def create(self, request, *args, **kwargs):
|
|
department = request.data.pop("department_id", None)
|
|
request.data["department"] = department
|
|
|
|
serializer = self.get_serializer(data=request.data)
|
|
serializer.is_valid(raise_exception=True)
|
|
serializer.save()
|
|
return Response({
|
|
"success": True,
|
|
"msg": "新增用户成功",
|
|
"data": serializer.data
|
|
}, status=status.HTTP_201_CREATED)
|
|
|
|
def list(self, request, *args, **kwargs):
|
|
department_id = dict(request.query_params).get("department_id", None)
|
|
if department_id and department_id != [""]:
|
|
department_id_list = self.get_children_department(department_id)
|
|
department_id_list.extend(department_id)
|
|
|
|
queryset = self.filter_queryset(self.get_queryset().filter(department_id__in=department_id_list).all())
|
|
else:
|
|
queryset = self.filter_queryset(self.get_queryset())
|
|
|
|
try:
|
|
page = self.paginate_queryset(queryset)
|
|
except NotFound as exc:
|
|
page = None
|
|
if page is not None:
|
|
serializer = self.get_serializer(page, many=True)
|
|
return self.get_paginated_response(serializer.data)
|
|
|
|
serializer = self.get_serializer(queryset, many=True)
|
|
return Response(serializer.data)
|
|
|
|
def retrieve(self, request, *args, **kwargs):
|
|
instance = self.get_object()
|
|
serializer = self.get_serializer(instance)
|
|
return Response(serializer.data)
|
|
|
|
def update(self, request, *args, **kwargs):
|
|
department = request.data.pop("department_id", None)
|
|
request.data["department"] = department
|
|
partial = kwargs.pop('partial', True)
|
|
instance = self.get_object()
|
|
serializer = self.get_serializer(instance, data=request.data, partial=partial)
|
|
serializer.is_valid(raise_exception=True)
|
|
serializer.save()
|
|
|
|
if getattr(instance, '_prefetched_objects_cache', None):
|
|
# If 'prefetch_related' has been applied to a queryset, we need to
|
|
# forcibly invalidate the prefetch cache on the instance.
|
|
instance._prefetched_objects_cache = {}
|
|
|
|
return Response({
|
|
"success": True,
|
|
"msg": "新增修改成功",
|
|
"data": serializer.data
|
|
})
|
|
|
|
def destroy(self, request, *args, **kwargs):
|
|
instance = self.get_object() # type: UserProfile
|
|
instance.status = 0
|
|
instance.save()
|
|
return Response({"success": True, "msg": "用户删除成功"})
|
|
|
|
def get_children_department(self, parents):
|
|
|
|
res = []
|
|
for parent in parents:
|
|
|
|
children_list = Department.objects.filter(parent_id=parent).values_list('id', flat=True).distinct()
|
|
if children_list:
|
|
res.extend(children_list)
|
|
children_ids = self.get_children_department(children_list)
|
|
res.extend(children_ids)
|
|
|
|
return res
|
|
|
|
|
|
class LoginView(viewsets.ModelViewSet):
|
|
|
|
def 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:
|
|
# 生成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 logout(self, request, *args, **kwargs):
|
|
"""登出 GET"""
|
|
pass
|
|
|
|
|
|
class RegisterLoginViewSet(viewsets.ModelViewSet):
|
|
def register(self, request, *args, **kwargs):
|
|
"""注册 POST"""
|
|
# 判断用户是否为管理员
|
|
# user = request.user
|
|
# if not user.is_superuser:
|
|
# return Response({'msg': '您不是管理员,无权限添加成员'})
|
|
data = request.data
|
|
username = data.get('username')
|
|
password = data.get('password')
|
|
try:
|
|
if UserProfile.objects.filter(username=username).first():
|
|
return Response({'msg': '该用户名已存在,请换一个'})
|
|
UserProfile.objects.create_user(username=username, password=password)
|
|
return Response({'msg': '注册成功'})
|
|
except Exception as e:
|
|
logger.info(e)
|
|
response = {
|
|
"msg": f'注册失败, 原因:{e}'
|
|
}
|
|
return Response(response)
|
|
|
|
|
|
class DepartmentViewSet(viewsets.ModelViewSet):
|
|
# 查询类
|
|
queryset = Department.objects.filter(status=1).all()
|
|
# 序列化类
|
|
serializer_class = DepartmentSerializer
|
|
# # 分页类
|
|
pagination_class = MyPageNumberPagination
|
|
# 条件筛选
|
|
filterset_class = DepartmentFilter
|
|
|
|
def create(self, request, *args, **kwargs):
|
|
name = request.data.pop("department_name", None)
|
|
if not name:
|
|
return Response({"msg": "部门名称必须存在", "success": False})
|
|
|
|
parent_id = request.data.pop("department_id", None) or None
|
|
flag = self.is_exist(name, parent_id)
|
|
|
|
if flag:
|
|
return Response({"msg": "该部门已存在", "success": False})
|
|
|
|
request.data["name"] = name
|
|
request.data["parent_id"] = parent_id
|
|
|
|
response = super().create(request, *args, **kwargs)
|
|
data = response.data
|
|
res = {
|
|
"success": True,
|
|
"msg": "部门创建成功",
|
|
"data": data
|
|
}
|
|
response.data = res
|
|
return response
|
|
|
|
def update(self, request, *args, **kwargs):
|
|
name = request.data.get("name", None)
|
|
department = request.data.get("department_id", None)
|
|
|
|
instance = self.get_object()
|
|
if name and department != instance.parent_id:
|
|
flag = self.is_exist(name, department)
|
|
if flag:
|
|
return Response({"msg": "该部门已存在", "success": False})
|
|
|
|
# request.data["name"] = name
|
|
kwargs["partial"] = True
|
|
response = super().update(request, *args, **kwargs)
|
|
|
|
data = response.data
|
|
res = {
|
|
"success": True,
|
|
"msg": "部门更新成功",
|
|
"data": data
|
|
}
|
|
response.data = res
|
|
|
|
return response
|
|
|
|
def destroy(self, request, *args, **kwargs):
|
|
instance = self.get_object() # type: Department
|
|
instance.status = 0
|
|
instance.save()
|
|
return Response({"success": True, "msg": "部门删除成功"})
|
|
|
|
def is_exist(self, name, parent_id):
|
|
is_exist = self.get_queryset().filter(status=1, name=name, parent_id=parent_id).exists()
|
|
return is_exist
|
|
|
|
def get_trees(self, request, *args, **kwargs):
|
|
flag = request.query_params.get("users", False)
|
|
roots = self.get_queryset().filter(parent_id=None)
|
|
res = self.get_children(roots, flag)
|
|
|
|
response = {
|
|
'success': True,
|
|
'msg': '查询成功',
|
|
'data': res
|
|
}
|
|
|
|
return Response(response)
|
|
|
|
def get_children(self, parents, users_flag=False):
|
|
|
|
res = []
|
|
for parent in parents:
|
|
parent_data = self.serializer_class(parent).data
|
|
if users_flag:
|
|
users = UserProfile.objects.filter(status=1).filter(department=parent.id).all()
|
|
users_data = UserSerializer(users, many=True).data
|
|
parent_data["users"] = users_data
|
|
|
|
children = self.get_queryset().filter(parent_id=parent.id)
|
|
children_data = []
|
|
if children:
|
|
children_data = self.get_children(children, users_flag)
|
|
parent_data["children"] = children_data
|
|
|
|
res.append(parent_data)
|
|
|
|
return res
|
|
|