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

104 lines
3.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

from django.db.models import Q
from rest_framework import status
from rest_framework.decorators import action
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet
from erp_system.tasks import create_menus_permissions
from erp_system.models import Menu, PermissionsModel
from erp_system.serializers.menus_serializer import MenuSerializer
class MenuViewSet(ModelViewSet):
"""
create:
功能菜单--新增
功能菜单新增, status: 201(成功), return: 新增功能菜单信息
destroy:
功能菜单--删除
功能菜单删除, status: 204(成功), return: None
update:
功能菜单--修改,全局修改
功能菜单修改, status: 200(成功), return: 修改后的功能菜单信息
partial_update:
功能菜单--局部修改
功能菜单批修改 status: 200(成功), return: 修改后的功能菜单信息
list:
功能菜单--获取列表
功能菜单列表信息, status: 200(成功), return: 功能菜单信息列表
retrieve:
查询某一个功能菜单
查询指定ID的功能菜单, status: 200(成功), return: 用户功能菜单
find_parent:
查询所有的顶级功能菜单, 不需要传参。
get_menus_by_permission:
查询当前登录的用户所有的拥有GET权限的菜单列表而且这些菜单列表必须是树形结构
返回树形菜单列表, status: 200(成功)
"""
serializer_class = MenuSerializer
queryset = Menu.objects.all()
# 必须是登录成功之后才能访问所有功能菜单的接口
# permission_classes = [IsAuthenticated]
@action(methods=['get'], detail=False)
def find_parent(self, request, *args, **kwargs):
lst = self.get_queryset().filter(parent__isnull=True)
ser = self.get_serializer(instance=lst, many=True)
return Response(ser.data)
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
menu = serializer.save()
# 发布异步的任务
if menu and menu.id:
create_menus_permissions.delay(menu.id)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
@action(methods=['get'], detail=False)
def get_menus_by_permission(self, request, *args, **kwargs):
# 得到当前登录用户
user = request.user
# 查询该用户所拥有的权限ID列表
permission_id = user.roles.values_list('permissions', flat=True).distinct()
# 过滤那些GET的或者是顶级菜单权限
menu_ids = PermissionsModel.objects.filter(Q(method='GET') | Q(is_menu=True)).filter(id__in=permission_id)\
.values_list('menu', flat=True)
# 根据menu_id得到菜单接口对象
menu_list = Menu.objects.filter(id__in=menu_ids, delete_flag=0).all()
serializer = MenuSerializer(instance=menu_list, many=True)
# 定义 Element
tree_dict = {} # 代表一个父菜单
tree_data = []
try:
for item in serializer.data:
tree_dict[item['id']] = item
for i in tree_dict:
if tree_dict[i]['parent']:
pid = tree_dict[i]['parent']
parent = tree_dict[pid]
parent.setdefault('children', []).append(tree_dict[i])
else:
tree_data.append(tree_dict[i])
results = tree_data
except KeyError:
results = serializer.data
return Response(results)