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.

126 lines
5.1 KiB

2 years ago
from drf_yasg import openapi
from drf_yasg.utils import swagger_auto_schema
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet
from erp_system.models import PermissionsModel, RolesModel
from erp_system.serializers.permission_serializer import PermissionsSerializer
import logging
logger = logging.getLogger('my')
class PermissionViewSet(ModelViewSet):
"""
create:
权限--新增
权限新增, status: 201(成功), return: 新增权限信息
destroy:
权限--删除
权限删除, status: 204(成功), return: None
multiple_delete:
权限--批量删除,必传参数ids=[1,2,3,4...]
权限批量删除, status: 204(成功), return: None
update:
权限--修改
权限修改, status: 200(成功), return: 修改增权限信息
partial_update:
权限--局部修改
权限局部修改, status: 200(成功), return: 修改增权限信息
list:
权限--获取所有的权限
find_permissions_by_menu:
获取当前菜单的所有权限设置 列表,必传参数menu_id
例如http://127.0.0.1:8000/permissions/find_permissions_by_menu/?menu_id=2
权限列表信息, status: 200(成功), return: 权限信息列表
find_permissions:
打开授权页面的时候首先请求的接口获取当前角色已经授予的权限ID列表和整个项目的所有权限(树形)列表,必传参数rid(角色ID)
例如http://127.0.0.1:8000/permissions/find_permissions/?rid=2
树形权限列表信息, status: 200(成功), return: 权限信息列表
retrieve:
查询某一个指定的权限信息
查询指定ID的权限, status: 200(成功), return: 权限信息
"""
queryset = PermissionsModel.objects.all()
serializer_class = PermissionsSerializer
# 定义好了一个swagger的参数
menu_param = openapi.Parameter(name='menu_id', in_=openapi.IN_QUERY, description='所选的菜单ID',
type=openapi.TYPE_INTEGER)
@swagger_auto_schema(method='GET', manual_parameters=[menu_param], operation_description='单一授权或者取消单一权限')
@action(methods=['GET'], detail=False)
def find_permissions_by_menu(self, request, *args, **kwargs):
menu_id = request.query_params.get('menu_id')
permission_list = PermissionsModel.objects.filter(menu__id=menu_id).all()
return Response(data=self.get_serializer(instance=permission_list, many=True).data)
# 定义好了一个swagger的参数
menu_param2 = openapi.Parameter(name='rid', in_=openapi.IN_QUERY, description='所选的角色ID',
type=openapi.TYPE_INTEGER)
@swagger_auto_schema(method='GET', manual_parameters=[menu_param2])
@action(methods=['GET'], detail=False)
def find_permissions(self, request, *args, **kwargs):
# 获取当前角色已经授予的权限ID列表和整个项目的所有权限(树形)列表
result = {} # 返回的整个字典数据,
rid = request.query_params.get('rid', None)
if rid: # 查询当前角色的所有已经授权的ID
ids = RolesModel.objects.filter(id=rid).values_list('permissions', flat=True).distinct()
result['ids'] = ids # 存入返回字典中
# 整个ERP系统中所有权限列表而且要树形展示
permissions_list = PermissionsModel.objects.values('id', 'name', 'menu__parent__id', 'menu__name', 'menu__id')
tree_dict = {} # 一个父节点权限(里面是树形嵌套)
tree_data = [] # 所有权限
"""
[
{父节点1的内容children=[{子节点内容}{子节点内容}...]},
{父节点2的内容children=[{子节点内容}{子节点内容}...]},
...
]
"""
# 第一步构建一颗二级树
for item in permissions_list:
tree_dict[item['menu__id']] = item
for i in tree_dict:
if tree_dict[i]['menu__parent__id']: # 表示子权限
pid = tree_dict[i]['menu__parent__id']
parent = tree_dict[pid]
child = dict() # 创建一个空字典(二级)第二级只要menu__id, menu__name, permissions(权限列表)
child['menu__id'] = tree_dict[i]['menu__id']
child['menu__name'] = tree_dict[i]['menu__name']
child.setdefault('permissions', [])
parent.setdefault('children', []).append(child)
else:
tree_data.append(tree_dict[i])
# 第二步:在前面二级树形结构的基础上,添加子权限。得到三级树
for parent in tree_data:
if 'children' in parent:
for child in parent['children']:
for node in permissions_list:
if node['menu__parent__id'] and node['menu__id'] == child['menu__id']:
child['permissions'].append(node)
logger.info(tree_data)
result['tree_data'] = tree_data # 把三级树结构,加入到结果中
return Response(result)