新增用户、部门接口
parent
9171178d92
commit
3ac5761bc8
@ -0,0 +1,17 @@
|
||||
from django.urls import path, include, re_path
|
||||
from rest_framework.routers import DefaultRouter
|
||||
from user import views
|
||||
|
||||
router = DefaultRouter()
|
||||
router.register('departments', views.DepartmentViewSet)
|
||||
|
||||
urlpatterns = [
|
||||
path('trees/', views.DepartmentViewSet.as_view({"get": "get_trees"})),
|
||||
path('login/', views.LoginView.as_view({"post": "login"})),
|
||||
path('users/', views.UserViewSet.as_view({"post": "create", "get": "list"})),
|
||||
path('users/<str:pk>/', views.UserViewSet.as_view({'get': 'retrieve',
|
||||
'put': 'update',
|
||||
'delete': 'destroy'})),
|
||||
]
|
||||
|
||||
urlpatterns += router.urls
|
@ -1,3 +1,269 @@
|
||||
from django.shortcuts import render
|
||||
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
|
||||
|
||||
|
Loading…
Reference in New Issue