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.
138 lines
5.0 KiB
138 lines
5.0 KiB
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
|
|
|