import logging import traceback from rest_framework.viewsets import ModelViewSet from ChaCeRndTrans.basic import CCAIResponse from ChaCeRndTrans.code import OK from utils.custom import CommonPagination, RbacPermission, TreeAPIView, CustomViewBase from ..models import Menu from ..serializers.menu_serializer import MenuSerializer from rest_framework.filters import SearchFilter, OrderingFilter from rest_framework_jwt.authentication import JSONWebTokenAuthentication from operator import itemgetter err_logger = logging.getLogger('error') class MenuViewSet(ModelViewSet, TreeAPIView): """ 菜单管理:增删改查 """ perms_map = ({"*": "admin"}, {"*": "menu_all"}, {"get": "menu_list"}, {"post": "menu_create"}, {"put": "menu_edit"}, {"delete": "menu_delete"}) queryset = Menu.objects.all() serializer_class = MenuSerializer pagination_class = CommonPagination filter_backends = (SearchFilter, OrderingFilter) search_fields = ("name",) ordering_fields = ("sort",) authentication_classes = (JSONWebTokenAuthentication,) permission_classes = (RbacPermission,) class MenuTreeView(TreeAPIView): """ 菜单树 """ queryset = Menu.objects.all() def list(self, request, *args, **kwargs): """ 根据是否前后台用户返回除去内部权限 """ if 1 == request.user.label: # 前台用户 self.queryset = Menu.objects.filter(label=1).distinct() response = super().list(request, *args, **kwargs) return response def get_all_menu_dict(): """ 获取所有菜单数据,重组结构 """ try: menus = Menu.objects.all() serializer = MenuSerializer(menus, many=True) tree_dict = {} for item in serializer.data: if item["pid"] is None: if item["is_frame"]: # 判断是否外部链接 top_menu = { "id": item["id"], "path": item["path"], "component": "Layout", "children": [{ "path": item["path"], "meta": { "name": item["name"], "icon": item["icon"] } }], "pid": item["pid"], "sort": item["sort"] } else: top_menu = { "id": item["id"], "route_name": item["route_name"], "path": "/" + item["path"], "redirect": "noredirect", "component": "", "alwaysShow": True, "meta": { "name": item["name"], "icon": item["icon"] }, "pid": item["pid"], "sort": item["sort"], "children": [] } tree_dict[item["id"]] = top_menu else: if item["is_frame"]: children_menu = { "id": item["id"], "route_name": item["route_name"], "path": item["path"], "component": "Layout", "meta": { "name": item["name"], "icon": item["icon"], }, "pid": item["pid"], "sort": item["sort"] } elif item["is_show"]: children_menu = { "id": item["id"], "route_name": item["route_name"], "path": item["path"], "component": item["component"], "meta": { "name": item["name"], "icon": item["icon"], }, "pid": item["pid"], "sort": item["sort"] } else: children_menu = { "id": item["id"], "route_name": item["route_name"], "path": item["path"], "component": item["component"], "meta": { "name": item["name"], "noCache": True, }, "hidden": True, "pid": item["pid"], "sort": item["sort"] } tree_dict[item["id"]] = children_menu return tree_dict except Exception as e: err_logger.error("get all menu from role failed: \n%s" % traceback.format_exc()) return tree_dict