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