diff --git a/backend/application/settings.py b/backend/application/settings.py index 1d0adf79b43c695cbb576518c213ea2837303a07..e6bdec5eaa5fa6bc0778592ace87c8da995262ef 100644 --- a/backend/application/settings.py +++ b/backend/application/settings.py @@ -404,7 +404,7 @@ PLUGINS_URL_PATTERNS = [] # ********** 一键导入插件配置开始 ********** # 例如: # from dvadmin_upgrade_center.settings import * # 升级中心 -from dvadmin3_celery.settings import * # celery 异步任务 +# from dvadmin3_celery.settings import * # celery 异步任务 # from dvadmin_third.settings import * # 第三方用户管理 # from dvadmin_ak_sk.settings import * # 秘钥管理管理 # from dvadmin_tenants.settings import * # 租户管理 diff --git a/backend/dvadmin/utils/field_permission.py b/backend/dvadmin/utils/field_permission.py index 7c259f6820b2040171c9db8f2d06b25b35ea9d95..b20cb4b6c6702879b2a5d543d1dfaf67674e644b 100644 --- a/backend/dvadmin/utils/field_permission.py +++ b/backend/dvadmin/utils/field_permission.py @@ -1,7 +1,5 @@ # -*- coding: utf-8 -*- -from itertools import groupby - from django.db.models import F from rest_framework.decorators import action from rest_framework.permissions import IsAuthenticated @@ -12,7 +10,7 @@ from dvadmin.utils.models import get_custom_app_models class FieldPermissionMixin: - @action(methods=['get'], detail=False,permission_classes=[IsAuthenticated]) + @action(methods=['get'], detail=False, permission_classes=[IsAuthenticated]) def field_permission(self, request): """ 获取字段权限 @@ -27,45 +25,30 @@ class FieldPermissionMixin: if finded is False: return [] user = request.user - if user.is_superuser==1: - data = MenuField.objects.filter( model=model['model']).values('field_name') + # 创建一个默认字典来存储最终的结果 + result = {} + if user.is_superuser == 1: + data = MenuField.objects.filter(model=model['model']).values('field_name') for item in data: - item['is_create'] = True - item['is_query'] = True - item['is_update'] = True - else: - roles = request.user.role.values_list('id', flat=True) - data= FieldPermission.objects.filter( - field__model=model['model'],role__in=roles - ).values( 'is_create', 'is_query', 'is_update',field_name=F('field__field_name')) - + field_name = item.pop('field_name') + result[field_name] = {} + result[field_name]['is_create'] = True + result[field_name]['is_query'] = True + result[field_name]['is_update'] = True + else: + roles = request.user.role.values_list('id', flat=True) + data = FieldPermission.objects.filter( + field__model=model['model'], role__in=roles + ).values('is_create', 'is_query', 'is_update', field_name=F('field__field_name')) """ 合并权限 - - 这段代码首先根据 field_name 对列表进行排序, - 然后使用 groupby 按 field_name 进行分组。 - 对于每个组,它创建一个新的字典 merged, - 并遍历组中的每个字典,将布尔值字段使用逻辑或(or)操作符进行合并(如果 merged 中还没有该字段,则默认为 False), - 其他字段(如 field_name)则直接取组的关键字(即 key) """ - - # 使用field_name对列表进行分组, # groupby 需要先对列表进行排序,因为它只能对连续相同的元素进行分组。 - grouped = groupby(sorted(list(data), key=lambda x: x['field_name']), key=lambda x: x['field_name']) - - data = [] - - # 遍历分组,合并权限 - for key, group in grouped: - - # 初始化一个空字典来存储合并后的结果 - merged = {} - for item in group: - # 合并权限, True值优先 - merged['is_create'] = merged.get('is_create', False) or item['is_create'] - merged['is_query'] = merged.get('is_query', False) or item['is_query'] - merged['is_update'] = merged.get('is_update', False) or item['is_update'] - merged['field_name'] = key - - data.append(merged) - - return DetailResponse(data=data) \ No newline at end of file + # 遍历原始数据并填充结果字典 + for item in data: + field_name = item.pop('field_name') + if field_name not in result: + result[field_name] = item + else: + for key, value in item.items(): + result[field_name][key] = result[field_name][key] or value + return DetailResponse(data=result) diff --git a/web/src/utils/columnPermission.ts b/web/src/utils/columnPermission.ts index adff4e1fef8c539e3dba8e6fe8e79a5f26439e73..e58c9347cb428b6993089abcf35f560244da8ad4 100644 --- a/web/src/utils/columnPermission.ts +++ b/web/src/utils/columnPermission.ts @@ -1,3 +1,4 @@ +import XEUtils from 'xe-utils'; import {useColumnPermission} from '/@/stores/columnPermission'; type permissionType = 'is_create' | 'is_query' | 'is_update'; @@ -23,25 +24,17 @@ export const handleColumnPermission = async (func: Function, crudOptions: any,ex } const columns = crudOptions.columns; const excludeColumns = ['checked','_index','id', 'create_datetime', 'update_datetime'].concat(excludeColumn) - for (let col in columns) { - for (let item of res.data) { - if (excludeColumns.includes(item.field_name)) { - continue - } else if(item.field_name === col) { - // 如果列表不可见,则禁止在列设置中选择 - // 只有列表不可见,才修改列配置,这样才不影响默认的配置 - if(!item['is_query']){ - columns[col].column.show = false - columns[col].column.columnSetDisabled = true - } - columns[col].addForm = { - show: item['is_create'] - } - columns[col].editForm = { - show: item['is_update'] - } + XEUtils.eachTree(columns, (item, key) => { + if (!excludeColumns.includes(String(key)) && key in res.data) { + // 如果列表不可见,则禁止在列设置中选择 + // 只有列表不可见,才修改列配置,这样才不影响默认的配置 + if (!res.data[key]['is_query']) { + item.column.show = false; + item.column.columnSetDisabled = true; } + item.addForm = { show: res.data[key]['is_create'] }; + item.editForm = { show: res.data[key]['is_update'] }; } - } + }); return crudOptions }