feat: 调整permission以支持后端路由2
This commit is contained in:
parent
28d89176e6
commit
7e578b52c2
|
@ -225,6 +225,18 @@ class PermissionSerializer(CustomModelSerializer):
|
|||
class Meta:
|
||||
model = Permission
|
||||
fields = '__all__'
|
||||
|
||||
def validate(self, attrs):
|
||||
type = attrs["type"]
|
||||
if type in [Permission.PERM_TYPE_MODULE, Permission.PERM_TYPE_API]:
|
||||
attrs.pop("component", None)
|
||||
attrs.pop("is_hidden", None)
|
||||
attrs.pop("is_fullpage", None)
|
||||
if type == Permission.PERM_TYPE_API:
|
||||
attrs.pop("route_name", None)
|
||||
attrs.pop("icon", None)
|
||||
attrs.pop("path", None)
|
||||
return super().validate(attrs)
|
||||
|
||||
|
||||
class PermissionCreateUpdateSerializer(CustomModelSerializer):
|
||||
|
|
|
@ -44,6 +44,7 @@ from drf_yasg.utils import swagger_auto_schema
|
|||
from server.settings import get_sysconfig, update_sysconfig, update_dict
|
||||
from apps.utils.constants import DEFAULT_PWD
|
||||
from django.core.cache import cache
|
||||
from apps.utils.permission import get_user_route
|
||||
|
||||
# logger.info('请求成功! response_code:{};response_headers:{};
|
||||
# response_body:{}'.format(response_code, response_headers, response_body[:251]))
|
||||
|
@ -543,6 +544,14 @@ class UserViewSet(CustomModelViewSet):
|
|||
"""
|
||||
user = request.user
|
||||
return Response(UserFullInfoSerializer(user).data)
|
||||
|
||||
@action(methods=['get'], detail=False, permission_classes=[IsAuthenticated])
|
||||
def route(self, request, pk=None):
|
||||
"""登录用户路由
|
||||
|
||||
获取登录用户路由
|
||||
"""
|
||||
return Response(get_user_route(request.user))
|
||||
|
||||
@action(methods=['post'], detail=False, permission_classes=[IsAuthenticated])
|
||||
def bind_wxmp(self, request, pk=None):
|
||||
|
|
|
@ -4,6 +4,7 @@ from apps.utils.queryset import get_child_queryset2
|
|||
from apps.system.models import DataFilter, Dept, Permission, PostRole, UserPost, User
|
||||
from django.db.models.query import QuerySet
|
||||
from typing import List
|
||||
from apps.utils.tools import build_tree_from_list
|
||||
|
||||
# 后端代码里有的权限标识
|
||||
ALL_PERMS = [
|
||||
|
@ -21,6 +22,40 @@ def get_alld_perms(update_cache=False) -> List[str]:
|
|||
cache.set(key, perms_alld_list, timeout=60*5)
|
||||
return perms_alld_list
|
||||
|
||||
def get_user_route(user: User) -> List[str]:
|
||||
"""
|
||||
获取用户PC前端路由
|
||||
"""
|
||||
perm_qs = Permission.objects.filter(type__in=[Permission.PERM_TYPE_MODULE, Permission.PERM_TYPE_PAGE])
|
||||
user_routes_qs = None
|
||||
if user.is_superuser:
|
||||
user_routes_qs = perm_qs
|
||||
else:
|
||||
user_routes_qs = perm_qs.filter(role_perms__in=PostRole.objects.filter(
|
||||
post__in=UserPost.objects.filter(user=user).values_list("post", flat=True)).values_list("role", flat=True))
|
||||
user_routes_qs = user_routes_qs.order_by('sort')
|
||||
user_routes_list = list(user_routes_qs.values("id", "name", "type", "route_name", "icon", "path", "component", "is_hidden", "is_fullpage", "parent"))
|
||||
for item in user_routes_list:
|
||||
item["meta"] = {}
|
||||
item["meta"]["title"] = item["name"]
|
||||
item.pop("name")
|
||||
item["meta"]["icon"] = item["icon"]
|
||||
item.pop("icon")
|
||||
if item["type"] == Permission.PERM_TYPE_MODULE:
|
||||
item["meta"]["type"] = "menu"
|
||||
item.pop("component", None)
|
||||
item.pop("type")
|
||||
item["meta"]["hidden"] = item["is_hidden"]
|
||||
item.pop("is_hidden")
|
||||
item["meta"]["fullpage"] = item["is_fullpage"]
|
||||
item.pop("is_fullpage")
|
||||
item["name"] = item["route_name"]
|
||||
item.pop("route_name")
|
||||
return build_tree_from_list(user_routes_list)
|
||||
|
||||
|
||||
|
||||
|
||||
def get_user_perms_map(user, update_cache=False):
|
||||
"""
|
||||
获取权限字典,可用redis存取(包括功能和数据权限)
|
||||
|
|
|
@ -290,3 +290,21 @@ def compare_values(val1, val2, ignore_order=False):
|
|||
return compare_dicts(val1, val2, ignore_order)
|
||||
else:
|
||||
return val1 == val2
|
||||
|
||||
|
||||
def build_tree_from_list(data, parent_field="parent"):
|
||||
id_map = {item["id"]: item for item in data}
|
||||
tree = []
|
||||
|
||||
for item in data:
|
||||
parent_id = item.get(parent_field, None)
|
||||
if parent_id is None:
|
||||
tree.append(item)
|
||||
else:
|
||||
parent = id_map.get(parent_id, None)
|
||||
if parent:
|
||||
parent.setdefault("children", []).append(item)
|
||||
else:
|
||||
tree.append(item)
|
||||
|
||||
return tree
|
Loading…
Reference in New Issue