独角鲸同步合作方公司数据项目
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.

139 lines
5.0 KiB

10 months ago
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