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.
95 lines
3.3 KiB
95 lines
3.3 KiB
import logging
|
|
import traceback
|
|
|
|
from rest_framework.viewsets import ModelViewSet
|
|
|
|
from ChaCeRndTrans.basic import CCAIResponse
|
|
from ChaCeRndTrans.code import OK
|
|
from ..models import Permission
|
|
from ..serializers.permission_serializer import PermissionListSerializer
|
|
from utils.custom import CommonPagination, RbacPermission, TreeAPIView, CustomViewBase
|
|
from rest_framework.filters import SearchFilter, OrderingFilter
|
|
from rest_framework_jwt.authentication import JSONWebTokenAuthentication
|
|
from operator import itemgetter
|
|
|
|
err_logger = logging.getLogger('error')
|
|
|
|
|
|
class PermissionViewSet(CustomViewBase, TreeAPIView):
|
|
"""
|
|
权限:增删改查
|
|
"""
|
|
perms_map = ({"*": "admin"}, {"*": "permission_all"}, {"get": "permission_list"}, {"post": "permission_create"},
|
|
{"put": "permission_edit"}, {"delete": "permission_delete"})
|
|
queryset = Permission.objects.all()
|
|
serializer_class = PermissionListSerializer
|
|
pagination_class = CommonPagination
|
|
filter_backends = (SearchFilter, OrderingFilter)
|
|
search_fields = ("name",)
|
|
ordering_fields = ("id",)
|
|
authentication_classes = (JSONWebTokenAuthentication,)
|
|
permission_classes = (RbacPermission,)
|
|
|
|
def list(self, request, *args, **kwargs):
|
|
tree_dict = get_all_permission_dict()
|
|
tree_data = []
|
|
for i in tree_dict:
|
|
if tree_dict[i]["pid"]:
|
|
pid = tree_dict[i]["pid"]
|
|
parent = tree_dict[pid]
|
|
parent.setdefault("children", []).append(tree_dict[i])
|
|
parent["children"] = sorted(parent["children"], key=itemgetter("id"))
|
|
else:
|
|
tree_data.append(tree_dict[i])
|
|
return CCAIResponse(tree_data, status=OK)
|
|
|
|
|
|
class PermissionTreeView(TreeAPIView):
|
|
"""
|
|
权限树
|
|
"""
|
|
queryset = Permission.objects.all()
|
|
|
|
def list(self, request, *args, **kwargs):
|
|
"""
|
|
根据是否前后台用户返回除去内部权限
|
|
"""
|
|
if 1 == request.user.label:
|
|
self.queryset = Permission.objects.filter(label=1)
|
|
response = super().list(request, *args, **kwargs)
|
|
return response
|
|
|
|
|
|
def get_all_permission_dict():
|
|
"""
|
|
获取所有菜单数据,重组结构
|
|
"""
|
|
try:
|
|
permission = Permission.objects.all()
|
|
serializer = PermissionListSerializer(permission, many=True)
|
|
tree_dict = {}
|
|
for item in serializer.data:
|
|
if item["pid"] is None:
|
|
top_permission = {
|
|
"id": item["id"],
|
|
"name": item["name"],
|
|
"method": item["method"],
|
|
"pid": item["pid"],
|
|
"label": item["label"],
|
|
"children": []
|
|
}
|
|
tree_dict[item["id"]] = top_permission
|
|
else:
|
|
children_permission = {
|
|
"id": item["id"],
|
|
"name": item["name"],
|
|
"pid": item["pid"],
|
|
"method": item["method"],
|
|
"label": item["label"],
|
|
}
|
|
|
|
tree_dict[item["id"]] = children_permission
|
|
return tree_dict
|
|
except Exception as e:
|
|
err_logger.error("get all menu from role failed: \n%s" % traceback.format_exc())
|
|
return tree_dict
|
|
|