fix: Application import (#3566)

This commit is contained in:
shaohuzhang1 2025-07-11 21:45:08 +08:00 committed by GitHub
parent 109e8507f1
commit 592ae54e82
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 233 additions and 99 deletions

View File

@ -34,7 +34,7 @@ from common.database_model_manage.database_model_manage import DatabaseModelMana
from common.db.search import native_search, native_page_search from common.db.search import native_search, native_page_search
from common.exception.app_exception import AppApiException from common.exception.app_exception import AppApiException
from common.field.common import UploadedFileField from common.field.common import UploadedFileField
from common.utils.common import get_file_content, valid_license, restricted_loads, generate_uuid from common.utils.common import get_file_content, restricted_loads, generate_uuid
from knowledge.models import Knowledge, KnowledgeScope from knowledge.models import Knowledge, KnowledgeScope
from knowledge.serializers.knowledge import KnowledgeSerializer, KnowledgeModelSerializer from knowledge.serializers.knowledge import KnowledgeSerializer, KnowledgeModelSerializer
from maxkb.conf import PROJECT_DIR from maxkb.conf import PROJECT_DIR
@ -377,6 +377,7 @@ class Query(serializers.Serializer):
class ApplicationImportRequest(serializers.Serializer): class ApplicationImportRequest(serializers.Serializer):
file = UploadedFileField(required=True, label=_("file")) file = UploadedFileField(required=True, label=_("file"))
folder_id = serializers.CharField(required=True, label=_("Folder ID"))
class ApplicationEditSerializer(serializers.Serializer): class ApplicationEditSerializer(serializers.Serializer):
@ -478,16 +479,14 @@ class ApplicationSerializer(serializers.Serializer):
QuerySet(ApplicationKnowledgeMapping).bulk_create(application_knowledge_mapping_model_list) QuerySet(ApplicationKnowledgeMapping).bulk_create(application_knowledge_mapping_model_list)
return ApplicationCreateSerializer.ApplicationResponse(application_model).data return ApplicationCreateSerializer.ApplicationResponse(application_model).data
@valid_license(model=Application, count=5,
message=_(
'The community version supports up to 5 applications. If you need more applications, please contact us (https://fit2cloud.com/).'))
@transaction.atomic @transaction.atomic
def import_(self, instance: dict, with_valid=True): def import_(self, instance: dict, is_import_tool, with_valid=True):
if with_valid: if with_valid:
self.is_valid() self.is_valid()
ApplicationImportRequest(data=instance).is_valid(raise_exception=True) ApplicationImportRequest(data=instance).is_valid(raise_exception=True)
user_id = self.data.get('user_id') user_id = self.data.get('user_id')
workspace_id = self.data.get("workspace_id") workspace_id = self.data.get("workspace_id")
folder_id = instance.get('folder_id')
mk_instance_bytes = instance.get('file').read() mk_instance_bytes = instance.get('file').read()
try: try:
mk_instance = restricted_loads(mk_instance_bytes) mk_instance = restricted_loads(mk_instance_bytes)
@ -498,7 +497,7 @@ class ApplicationSerializer(serializers.Serializer):
update_tool_map = {} update_tool_map = {}
if len(tool_list) > 0: if len(tool_list) > 0:
tool_id_list = reduce(lambda x, y: [*x, *y], tool_id_list = reduce(lambda x, y: [*x, *y],
[[tool.get('id'), generate_uuid((tool.get('id') + tool.get('workspace_id') or ''))] [[tool.get('id'), generate_uuid((tool.get('id') + workspace_id or ''))]
for tool for tool
in in
tool_list], []) tool_list], [])
@ -506,7 +505,7 @@ class ApplicationSerializer(serializers.Serializer):
exits_tool_id_list = [str(tool.id) for tool in exits_tool_id_list = [str(tool.id) for tool in
QuerySet(Tool).filter(id__in=tool_id_list, workspace_id=workspace_id)] QuerySet(Tool).filter(id__in=tool_id_list, workspace_id=workspace_id)]
# 需要更新的工具集合 # 需要更新的工具集合
update_tool_map = {tool.get('id'): generate_uuid((tool.get('id') + tool.get('workspace_id') or '')) for tool update_tool_map = {tool.get('id'): generate_uuid((tool.get('id') + workspace_id or '')) for tool
in in
tool_list if tool_list if
not exits_tool_id_list.__contains__( not exits_tool_id_list.__contains__(
@ -515,8 +514,8 @@ class ApplicationSerializer(serializers.Serializer):
tool_list = [{**tool, 'id': update_tool_map.get(tool.get('id'))} for tool in tool_list if tool_list = [{**tool, 'id': update_tool_map.get(tool.get('id'))} for tool in tool_list if
not exits_tool_id_list.__contains__( not exits_tool_id_list.__contains__(
tool.get('id')) and not exits_tool_id_list.__contains__( tool.get('id')) and not exits_tool_id_list.__contains__(
generate_uuid((tool.get('id') + tool.get('workspace_id') or '')))] generate_uuid((tool.get('id') + workspace_id or '')))]
application_model = self.to_application(application, workspace_id, user_id, update_tool_map) application_model = self.to_application(application, workspace_id, user_id, update_tool_map, folder_id)
tool_model_list = [self.to_tool(f, workspace_id, user_id) for f in tool_list] tool_model_list = [self.to_tool(f, workspace_id, user_id) for f in tool_list]
application_model.save() application_model.save()
# 插入授权数据 # 插入授权数据
@ -528,7 +527,14 @@ class ApplicationSerializer(serializers.Serializer):
# 插入认证信息 # 插入认证信息
ApplicationAccessToken(application_id=application_model.id, ApplicationAccessToken(application_id=application_model.id,
access_token=hashlib.md5(str(uuid.uuid7()).encode()).hexdigest()[8:24]).save() access_token=hashlib.md5(str(uuid.uuid7()).encode()).hexdigest()[8:24]).save()
QuerySet(Tool).bulk_create(tool_model_list) if len(tool_model_list) > 0 else None if is_import_tool:
if len(tool_model_list) > 0:
QuerySet(Tool).bulk_create(tool_model_list)
UserResourcePermissionSerializer(data={
'workspace_id': self.data.get('workspace_id'),
'user_id': self.data.get('user_id'),
'auth_target_type': AuthTargetType.APPLICATION.value
}).auth_resource_batch([t.id for t in tool_model_list])
return True return True
@staticmethod @staticmethod
@ -550,7 +556,7 @@ class ApplicationSerializer(serializers.Serializer):
workspace_id=workspace_id) workspace_id=workspace_id)
@staticmethod @staticmethod
def to_application(application, workspace_id, user_id, update_tool_map): def to_application(application, workspace_id, user_id, update_tool_map, folder_id):
work_flow = application.get('work_flow') work_flow = application.get('work_flow')
for node in work_flow.get('nodes', []): for node in work_flow.get('nodes', []):
if node.get('type') == 'tool-lib-node': if node.get('type') == 'tool-lib-node':
@ -563,7 +569,7 @@ class ApplicationSerializer(serializers.Serializer):
user_id=user_id, user_id=user_id,
name=application.get('name'), name=application.get('name'),
workspace_id=workspace_id, workspace_id=workspace_id,
folder_id=workspace_id, folder_id=folder_id,
desc=application.get('desc'), desc=application.get('desc'),
prologue=application.get('prologue'), dialogue_number=application.get('dialogue_number'), prologue=application.get('prologue'), dialogue_number=application.get('dialogue_number'),
knowledge_setting=application.get('knowledge_setting'), knowledge_setting=application.get('knowledge_setting'),

View File

@ -7,7 +7,7 @@ app_name = 'application'
urlpatterns = [ urlpatterns = [
path('workspace/<str:workspace_id>/application', views.ApplicationAPI.as_view(), name='application'), path('workspace/<str:workspace_id>/application', views.ApplicationAPI.as_view(), name='application'),
path('workspace/<str:workspace_id>/application/import', views.ApplicationAPI.Import.as_view()), path('workspace/<str:workspace_id>/application/folder/<str:folder_id>/import', views.ApplicationAPI.Import.as_view()),
path('workspace/<str:workspace_id>/application/<int:current_page>/<int:page_size>', views.ApplicationAPI.Page.as_view(), name='application_page'), path('workspace/<str:workspace_id>/application/<int:current_page>/<int:page_size>', views.ApplicationAPI.Page.as_view(), name='application_page'),
path('workspace/<str:workspace_id>/application/<str:application_id>', views.ApplicationAPI.Operate.as_view()), path('workspace/<str:workspace_id>/application/<str:application_id>', views.ApplicationAPI.Operate.as_view()),
path('workspace/<str:workspace_id>/application/<str:application_id>/publish', views.ApplicationAPI.Publish.as_view()), path('workspace/<str:workspace_id>/application/<str:application_id>/publish', views.ApplicationAPI.Publish.as_view()),

View File

@ -21,7 +21,7 @@ from application.models import Application
from application.serializers.application import ApplicationSerializer, Query, ApplicationOperateSerializer from application.serializers.application import ApplicationSerializer, Query, ApplicationOperateSerializer
from common import result from common import result
from common.auth import TokenAuth from common.auth import TokenAuth
from common.auth.authentication import has_permissions from common.auth.authentication import has_permissions, get_is_permissions
from common.constants.permission_constants import PermissionConstants, RoleConstants, ViewPermission, CompareConstants from common.constants.permission_constants import PermissionConstants, RoleConstants, ViewPermission, CompareConstants
from common.log.log import log from common.log.log import log
@ -112,10 +112,15 @@ class ApplicationAPI(APIView):
RoleConstants.USER.get_workspace_role(), RoleConstants.USER.get_workspace_role(),
RoleConstants.WORKSPACE_MANAGE.get_workspace_role()) RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
@log(menu='Application', operate="Import Application", ) @log(menu='Application', operate="Import Application", )
def post(self, request: Request, workspace_id: str): def post(self, request: Request, workspace_id: str, folder_id: str):
is_import_tool = get_is_permissions(request, workspace_id=workspace_id, folder_id=folder_id)(
PermissionConstants.TOOL_IMPORT.get_workspace_permission(),
PermissionConstants.TOOL_IMPORT.get_workspace_permission_workspace_manage_role(),
RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), RoleConstants.USER.get_workspace_role()
)
return result.success(ApplicationSerializer( return result.success(ApplicationSerializer(
data={'user_id': request.user.id, 'workspace_id': workspace_id, data={'user_id': request.user.id, 'workspace_id': workspace_id,
}).import_({'file': request.FILES.get('file')})) }).import_({'file': request.FILES.get('file'), 'folder_id': folder_id}, is_import_tool))
class Export(APIView): class Export(APIView):
authentication_classes = [TokenAuth] authentication_classes = [TokenAuth]

View File

@ -49,10 +49,10 @@ def exist_permissions_by_view_permission(user_role: List[RoleConstants],
:return: 是否存在 True False :return: 是否存在 True False
""" """
role_list = [user_r(request, kwargs) if callable(user_r) else user_r for user_r in role_list = [user_r(request, kwargs) if callable(user_r) else user_r for user_r in
permission.roleList] permission.roleList]
role_ok = any(list(map(lambda up: role_list.__contains__(up), role_ok = any(list(map(lambda up: role_list.__contains__(up),
user_role))) user_role)))
permission_list = [user_p(request, kwargs) if callable(user_p) else user_p for user_p in permission_list = [user_p(request, kwargs) if callable(user_p) else user_p for user_p in
permission.permissionList permission.permissionList
] ]
@ -79,10 +79,20 @@ def exist_permissions(user_role: List[RoleConstants], user_permission: List[Perm
def exist(user_role: List[RoleConstants], user_permission: List[PermissionConstants], permission, request, **kwargs): def exist(user_role: List[RoleConstants], user_permission: List[PermissionConstants], permission, request, **kwargs):
if callable(permission): if callable(permission):
p = permission(request, kwargs) p = permission(request, kwargs)
return exist_permissions(user_role, user_permission, p, request,**kwargs) return exist_permissions(user_role, user_permission, p, request, **kwargs)
return exist_permissions(user_role, user_permission, permission, request, **kwargs) return exist_permissions(user_role, user_permission, permission, request, **kwargs)
def get_is_permissions(request, **kwargs):
def is_permissions(*permission, compare=CompareConstants.OR):
exit_list = list(
map(lambda p: exist(request.auth.role_list, request.auth.permission_list, p, request, **kwargs),
permission))
return any(exit_list) if compare == CompareConstants.OR else all(exit_list)
return is_permissions
def has_permissions(*permission, compare=CompareConstants.OR): def has_permissions(*permission, compare=CompareConstants.OR):
""" """
权限 role or permission 权限 role or permission

View File

@ -130,6 +130,32 @@ class UserResourcePermissionSerializer(serializers.Serializer):
else: else:
return wurp.permission_list.__contains__(ResourcePermission.VIEW.value) return wurp.permission_list.__contains__(ResourcePermission.VIEW.value)
def auth_resource_batch(self, resource_id_list: list):
self.is_valid(raise_exception=True)
auth_target_type = self.data.get('auth_target_type')
workspace_id = self.data.get('workspace_id')
user_id = self.data.get('user_id')
wurp = QuerySet(WorkspaceUserResourcePermission).filter(auth_target_type=auth_target_type,
workspace_id=workspace_id, user_id=user_id).first()
auth_type = wurp.auth_type if wurp else (
ResourceAuthType.RESOURCE_PERMISSION_GROUP if edition == 'CE' else ResourceAuthType.ROLE)
workspace_user_resource_permission = [WorkspaceUserResourcePermission(
target=resource_id,
auth_target_type=auth_target_type,
permission_list=[ResourcePermission.VIEW,
ResourcePermission.MANAGE] if auth_type == ResourceAuthType.RESOURCE_PERMISSION_GROUP else [
ResourcePermissionRole.ROLE],
workspace_id=workspace_id,
user_id=user_id,
auth_type=auth_type
) for resource_id in resource_id_list]
QuerySet(WorkspaceUserResourcePermission).bulk_create(workspace_user_resource_permission)
# 刷新缓存
version = Cache_Version.PERMISSION_LIST.get_version()
key = Cache_Version.PERMISSION_LIST.get_key(user_id=user_id)
cache.delete(key, version=version)
return True
def auth_resource(self, resource_id: str): def auth_resource(self, resource_id: str):
self.is_valid(raise_exception=True) self.is_valid(raise_exception=True)
auth_target_type = self.data.get('auth_target_type') auth_target_type = self.data.get('auth_target_type')

View File

@ -140,7 +140,6 @@ const putXpackAccessToken: (
return put(`${prefix.value}/${application_id}/setting`, data, undefined, loading) return put(`${prefix.value}/${application_id}/setting`, data, undefined, loading)
} }
/** /**
* *
*/ */
@ -161,11 +160,12 @@ const exportApplication = (
/** /**
* *
*/ */
const importApplication: (data: any, loading?: Ref<boolean>) => Promise<Result<any>> = ( const importApplication: (
data, folder_id: string,
loading, data: any,
) => { loading?: Ref<boolean>,
return post(`${prefix.value}/import`, data, undefined, loading) ) => Promise<Result<any>> = (folder_id, data, loading) => {
return post(`${prefix.value}/folder/${folder_id}/import`, data, undefined, loading)
} }
/** /**

View File

@ -13,7 +13,7 @@
</template> </template>
<ContentContainer> <ContentContainer>
<template #header> <template #header>
<FolderBreadcrumb :folderList="folderList" @click="folderClickHandle"/> <FolderBreadcrumb :folderList="folderList" @click="folderClickHandle" />
</template> </template>
<template #search> <template #search>
<div class="flex"> <div class="flex">
@ -24,9 +24,9 @@
style="width: 120px" style="width: 120px"
@change="search_type_change" @change="search_type_change"
> >
<el-option :label="$t('common.creator')" value="create_user"/> <el-option :label="$t('common.creator')" value="create_user" />
<el-option :label="$t('common.name')" value="name"/> <el-option :label="$t('common.name')" value="name" />
</el-select> </el-select>
<el-input <el-input
v-if="search_type === 'name'" v-if="search_type === 'name'"
@ -44,14 +44,14 @@
clearable clearable
style="width: 220px" style="width: 220px"
> >
<el-option v-for="u in user_options" :key="u.id" :value="u.id" :label="u.nick_name"/> <el-option v-for="u in user_options" :key="u.id" :value="u.id" :label="u.nick_name" />
</el-select> </el-select>
</div> </div>
<el-dropdown trigger="click" v-if="permissionPrecise.create()"> <el-dropdown trigger="click" v-if="permissionPrecise.create()">
<el-button type="primary" class="ml-8"> <el-button type="primary" class="ml-8">
{{ $t('common.create') }} {{ $t('common.create') }}
<el-icon class="el-icon--right"> <el-icon class="el-icon--right">
<arrow-down/> <arrow-down />
</el-icon> </el-icon>
</el-button> </el-button>
<template #dropdown> <template #dropdown>
@ -68,7 +68,7 @@
<div class="pre-wrap ml-8"> <div class="pre-wrap ml-8">
<div class="lighter">{{ $t('views.application.simple') }}</div> <div class="lighter">{{ $t('views.application.simple') }}</div>
<el-text type="info" size="small" <el-text type="info" size="small"
>{{ $t('views.application.simplePlaceholder') }} >{{ $t('views.application.simplePlaceholder') }}
</el-text> </el-text>
</div> </div>
</div> </div>
@ -85,7 +85,7 @@
<div class="pre-wrap ml-8"> <div class="pre-wrap ml-8">
<div class="lighter">{{ $t('views.application.workflow') }}</div> <div class="lighter">{{ $t('views.application.workflow') }}</div>
<el-text type="info" size="small" <el-text type="info" size="small"
>{{ $t('views.application.workflowPlaceholder') }} >{{ $t('views.application.workflowPlaceholder') }}
</el-text> </el-text>
</div> </div>
</div> </div>
@ -104,7 +104,7 @@
<el-dropdown-item> <el-dropdown-item>
<div class="flex align-center w-full"> <div class="flex align-center w-full">
<el-avatar shape="square" class="mt-4" :size="36" style="background: none"> <el-avatar shape="square" class="mt-4" :size="36" style="background: none">
<img src="@/assets/icon_import.svg" alt=""/> <img src="@/assets/icon_import.svg" alt="" />
</el-avatar> </el-avatar>
<div class="pre-wrap ml-8"> <div class="pre-wrap ml-8">
<div class="lighter">{{ $t('common.importCreate') }}</div> <div class="lighter">{{ $t('common.importCreate') }}</div>
@ -176,7 +176,7 @@
@click="goApp(item)" @click="goApp(item)"
> >
<template #icon> <template #icon>
<LogoIcon height="32px"/> <LogoIcon height="32px" />
</template> </template>
<template #subTitle> <template #subTitle>
<el-text class="color-secondary" size="small"> <el-text class="color-secondary" size="small">
@ -197,14 +197,14 @@
<template #footer> <template #footer>
<div v-if="item.is_publish" class="flex align-center"> <div v-if="item.is_publish" class="flex align-center">
<el-icon class="color-success mr-8" style="font-size: 16px"> <el-icon class="color-success mr-8" style="font-size: 16px">
<SuccessFilled/> <SuccessFilled />
</el-icon> </el-icon>
<span class="color-secondary"> <span class="color-secondary">
{{ $t('views.application.status.published') }} {{ $t('views.application.status.published') }}
</span> </span>
<el-divider direction="vertical"/> <el-divider direction="vertical" />
<el-icon class="mr-8"> <el-icon class="mr-8">
<Clock/> <Clock />
</el-icon> </el-icon>
<span class="color-secondary">{{ dateFormat(item.update_time) }}</span> <span class="color-secondary">{{ dateFormat(item.update_time) }}</span>
</div> </div>
@ -220,14 +220,12 @@
<el-dropdown trigger="click"> <el-dropdown trigger="click">
<el-button text @click.stop> <el-button text @click.stop>
<el-icon> <el-icon>
<MoreFilled/> <MoreFilled />
</el-icon> </el-icon>
</el-button> </el-button>
<template #dropdown> <template #dropdown>
<el-dropdown-menu> <el-dropdown-menu>
<el-dropdown-item <el-dropdown-item @click.stop="getAccessToken(item.id)">
@click.stop="getAccessToken(item.id)"
>
<AppIcon iconName="app-create-chat"></AppIcon> <AppIcon iconName="app-create-chat"></AppIcon>
{{ $t('views.application.operation.toChat') }} {{ $t('views.application.operation.toChat') }}
</el-dropdown-item> </el-dropdown-item>
@ -236,7 +234,7 @@
v-if="permissionPrecise.edit(item.id)" v-if="permissionPrecise.edit(item.id)"
> >
<el-icon> <el-icon>
<Setting/> <Setting />
</el-icon> </el-icon>
{{ $t('common.setting') }} {{ $t('common.setting') }}
</el-dropdown-item> </el-dropdown-item>
@ -267,9 +265,8 @@
icon="Delete" icon="Delete"
@click.stop="deleteApplication(item)" @click.stop="deleteApplication(item)"
v-if="permissionPrecise.delete(item.id)" v-if="permissionPrecise.delete(item.id)"
>{{ $t('common.delete') }} >{{ $t('common.delete') }}
</el-dropdown-item </el-dropdown-item>
>
</el-dropdown-menu> </el-dropdown-menu>
</template> </template>
</el-dropdown> </el-dropdown>
@ -279,13 +276,13 @@
</el-col> </el-col>
</template> </template>
</el-row> </el-row>
<el-empty :description="$t('common.noData')" v-else/> <el-empty :description="$t('common.noData')" v-else />
</InfiniteScroll> </InfiniteScroll>
</div> </div>
</ContentContainer> </ContentContainer>
<CreateApplicationDialog ref="CreateApplicationDialogRef"/> <CreateApplicationDialog ref="CreateApplicationDialogRef" />
<CopyApplicationDialog ref="CopyApplicationDialogRef"/> <CopyApplicationDialog ref="CopyApplicationDialogRef" />
<CreateFolderDialog ref="CreateFolderDialogRef" @refresh="refreshFolder"/> <CreateFolderDialog ref="CreateFolderDialogRef" @refresh="refreshFolder" />
<MoveToDialog <MoveToDialog
ref="MoveToDialogRef" ref="MoveToDialogRef"
:source="SourceTypeEnum.APPLICATION" :source="SourceTypeEnum.APPLICATION"
@ -296,24 +293,24 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import {onMounted, ref, reactive, computed} from 'vue' import { onMounted, ref, reactive, computed } from 'vue'
import CreateApplicationDialog from '@/views/application/component/CreateApplicationDialog.vue' import CreateApplicationDialog from '@/views/application/component/CreateApplicationDialog.vue'
import CreateFolderDialog from '@/components/folder-tree/CreateFolderDialog.vue' import CreateFolderDialog from '@/components/folder-tree/CreateFolderDialog.vue'
import CopyApplicationDialog from '@/views/application/component/CopyApplicationDialog.vue' import CopyApplicationDialog from '@/views/application/component/CopyApplicationDialog.vue'
import MoveToDialog from '@/components/folder-tree/MoveToDialog.vue' import MoveToDialog from '@/components/folder-tree/MoveToDialog.vue'
import ApplicationApi from '@/api/application/application' import ApplicationApi from '@/api/application/application'
import {MsgSuccess, MsgConfirm, MsgError} from '@/utils/message' import { MsgSuccess, MsgConfirm, MsgError } from '@/utils/message'
import useStore from '@/stores' import useStore from '@/stores'
import {t} from '@/locales' import { t } from '@/locales'
import {useRouter, useRoute} from 'vue-router' import { useRouter, useRoute } from 'vue-router'
import {isWorkFlow} from '@/utils/application' import { isWorkFlow } from '@/utils/application'
import {dateFormat} from '@/utils/time' import { dateFormat } from '@/utils/time'
import {SourceTypeEnum, ValidType, ValidCount} from '@/enums/common' import { SourceTypeEnum, ValidType, ValidCount } from '@/enums/common'
import permissionMap from '@/permission' import permissionMap from '@/permission'
import WorkspaceApi from '@/api/workspace/workspace' import WorkspaceApi from '@/api/workspace/workspace'
import {hasPermission} from '@/utils/permission' import { hasPermission } from '@/utils/permission'
import {ComplexPermission} from '@/utils/permission/type' import { ComplexPermission } from '@/utils/permission/type'
import {EditionConst, PermissionConst, RoleConst} from '@/utils/permission/data' import { EditionConst, PermissionConst, RoleConst } from '@/utils/permission/data'
const router = useRouter() const router = useRouter()
const route = useRoute() const route = useRoute()
@ -325,7 +322,7 @@ const permissionPrecise = computed(() => {
return permissionMap['application'][apiType.value] return permissionMap['application'][apiType.value]
}) })
const {folder, application, user, common} = useStore() const { folder, application, user, common } = useStore()
const loading = ref(false) const loading = ref(false)
@ -363,36 +360,127 @@ function refreshApplicationList(row: any) {
} }
const goApp = (item: any) => { const goApp = (item: any) => {
router.push({path: get_route(item)}) router.push({ path: get_route(item) })
} }
const get_route = (item: any) => { const get_route = (item: any) => {
if (hasPermission([new ComplexPermission([RoleConst.USER], [PermissionConst.APPLICATION.getApplicationWorkspaceResourcePermission(item.id)], [], 'AND'), if (
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole, hasPermission(
PermissionConst.APPLICATION_OVERVIEW_READ.getWorkspacePermissionWorkspaceManageRole, [
PermissionConst.APPLICATION_OVERVIEW_READ.getApplicationWorkspaceResourcePermission(item.id)], 'OR')) { new ComplexPermission(
[RoleConst.USER],
[PermissionConst.APPLICATION.getApplicationWorkspaceResourcePermission(item.id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.APPLICATION_OVERVIEW_READ.getWorkspacePermissionWorkspaceManageRole,
PermissionConst.APPLICATION_OVERVIEW_READ.getApplicationWorkspaceResourcePermission(
item.id,
),
],
'OR',
)
) {
return `/application/${item.id}/${item.type}/overview` return `/application/${item.id}/${item.type}/overview`
} else if (hasPermission([new ComplexPermission([RoleConst.USER], [PermissionConst.APPLICATION.getApplicationWorkspaceResourcePermission(item.id)], [], 'AND'), } else if (
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole, hasPermission(
PermissionConst.APPLICATION_EDIT.getWorkspacePermissionWorkspaceManageRole, [
PermissionConst.APPLICATION_EDIT.getApplicationWorkspaceResourcePermission(item.id)], 'OR')) { new ComplexPermission(
[RoleConst.USER],
[PermissionConst.APPLICATION.getApplicationWorkspaceResourcePermission(item.id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.APPLICATION_EDIT.getWorkspacePermissionWorkspaceManageRole,
PermissionConst.APPLICATION_EDIT.getApplicationWorkspaceResourcePermission(item.id),
],
'OR',
)
) {
if (item.type == 'WORK_FLOW') { if (item.type == 'WORK_FLOW') {
return `/application/${item.id}/workflow` return `/application/${item.id}/workflow`
} else { } else {
return `/application/${item.id}/${item.type}/setting` return `/application/${item.id}/${item.type}/setting`
} }
} else if (hasPermission([new ComplexPermission([RoleConst.USER], [PermissionConst.APPLICATION.getApplicationWorkspaceResourcePermission(item.id)], [EditionConst.IS_EE, EditionConst.IS_PE], 'AND'), } else if (
new ComplexPermission([RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,], [PermissionConst.APPLICATION_ACCESS_READ.getWorkspacePermissionWorkspaceManageRole], [EditionConst.IS_EE, EditionConst.IS_PE], 'OR'), hasPermission(
new ComplexPermission([], [PermissionConst.APPLICATION_ACCESS_READ.getApplicationWorkspaceResourcePermission(item.id)], [EditionConst.IS_EE, EditionConst.IS_PE], 'OR'),], 'OR')) { [
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.APPLICATION.getApplicationWorkspaceResourcePermission(item.id)],
[EditionConst.IS_EE, EditionConst.IS_PE],
'AND',
),
new ComplexPermission(
[RoleConst.WORKSPACE_MANAGE.getWorkspaceRole],
[PermissionConst.APPLICATION_ACCESS_READ.getWorkspacePermissionWorkspaceManageRole],
[EditionConst.IS_EE, EditionConst.IS_PE],
'OR',
),
new ComplexPermission(
[],
[
PermissionConst.APPLICATION_ACCESS_READ.getApplicationWorkspaceResourcePermission(
item.id,
),
],
[EditionConst.IS_EE, EditionConst.IS_PE],
'OR',
),
],
'OR',
)
) {
return `/application/${item.id}/${item.type}/access` return `/application/${item.id}/${item.type}/access`
} else if (hasPermission([new ComplexPermission([RoleConst.USER], [PermissionConst.APPLICATION.getApplicationWorkspaceResourcePermission(item.id)], [EditionConst.IS_EE, EditionConst.IS_PE], 'AND'), } else if (
new ComplexPermission([RoleConst.WORKSPACE_MANAGE.getWorkspaceRole], [PermissionConst.APPLICATION_CHAT_USER_READ.getWorkspacePermissionWorkspaceManageRole], [EditionConst.IS_EE, EditionConst.IS_PE], 'OR'), hasPermission(
new ComplexPermission([], [PermissionConst.APPLICATION_CHAT_USER_READ.getApplicationWorkspaceResourcePermission(item.id)], [EditionConst.IS_EE, EditionConst.IS_PE], 'OR'),], 'OR')) { [
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.APPLICATION.getApplicationWorkspaceResourcePermission(item.id)],
[EditionConst.IS_EE, EditionConst.IS_PE],
'AND',
),
new ComplexPermission(
[RoleConst.WORKSPACE_MANAGE.getWorkspaceRole],
[PermissionConst.APPLICATION_CHAT_USER_READ.getWorkspacePermissionWorkspaceManageRole],
[EditionConst.IS_EE, EditionConst.IS_PE],
'OR',
),
new ComplexPermission(
[],
[
PermissionConst.APPLICATION_CHAT_USER_READ.getApplicationWorkspaceResourcePermission(
item.id,
),
],
[EditionConst.IS_EE, EditionConst.IS_PE],
'OR',
),
],
'OR',
)
) {
return `/application/${item.id}/${item.type}/chat-user` return `/application/${item.id}/${item.type}/chat-user`
} else if (hasPermission([new ComplexPermission([RoleConst.USER], [PermissionConst.APPLICATION.getApplicationWorkspaceResourcePermission(item.id)], [], 'AND'), } else if (
PermissionConst.APPLICATION_CHAT_LOG_READ.getWorkspacePermissionWorkspaceManageRole, hasPermission(
PermissionConst.APPLICATION_CHAT_LOG_READ.getApplicationWorkspaceResourcePermission(item.id)], 'OR')) { [
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.APPLICATION.getApplicationWorkspaceResourcePermission(item.id)],
[],
'AND',
),
PermissionConst.APPLICATION_CHAT_LOG_READ.getWorkspacePermissionWorkspaceManageRole,
PermissionConst.APPLICATION_CHAT_LOG_READ.getApplicationWorkspaceResourcePermission(
item.id,
),
],
'OR',
)
) {
return `/application/${item.id}/${item.type}/chat-log` return `/application/${item.id}/${item.type}/chat-log`
} else return `/application/` } else return `/application/`
} }
@ -404,7 +492,7 @@ function openCreateDialog(type?: string) {
} }
const search_type_change = () => { const search_type_change = () => {
search_form.value = {name: '', create_user: ''} search_form.value = { name: '', create_user: '' }
} }
function getAccessToken(id: string) { function getAccessToken(id: string) {
@ -414,20 +502,20 @@ function getAccessToken(id: string) {
.map((v: any) => { .map((v: any) => {
apiInputParams.value = v.properties.api_input_field_list apiInputParams.value = v.properties.api_input_field_list
? v.properties.api_input_field_list.map((v: any) => { ? v.properties.api_input_field_list.map((v: any) => {
return { return {
name: v.variable, name: v.variable,
value: v.default_value, value: v.default_value,
} }
}) })
: v.properties.input_field_list : v.properties.input_field_list
? v.properties.input_field_list ? v.properties.input_field_list
.filter((v: any) => v.assignment_method === 'api_input') .filter((v: any) => v.assignment_method === 'api_input')
.map((v: any) => { .map((v: any) => {
return { return {
name: v.variable, name: v.variable,
value: v.default_value, value: v.default_value,
} }
}) })
: [] : []
}) })
const apiParams = mapToUrlParams(apiInputParams.value) const apiParams = mapToUrlParams(apiInputParams.value)
@ -444,7 +532,7 @@ function copyApplication(row: any) {
application.asyncGetApplicationDetail(row.id, loading).then((res: any) => { application.asyncGetApplicationDetail(row.id, loading).then((res: any) => {
if (res?.data) { if (res?.data) {
CopyApplicationDialogRef.value.open( CopyApplicationDialogRef.value.open(
{...res.data, model_id: res.data.model}, { ...res.data, model_id: res.data.model },
folder.currentFolder?.id || 'default', folder.currentFolder?.id || 'default',
) )
} }
@ -453,9 +541,9 @@ function copyApplication(row: any) {
function settingApplication(row: any) { function settingApplication(row: any) {
if (isWorkFlow(row.type)) { if (isWorkFlow(row.type)) {
router.push({path: `/application/${row.id}/workflow`}) router.push({ path: `/application/${row.id}/workflow` })
} else { } else {
router.push({path: `/application/${row.id}/${row.type}/setting`}) router.push({ path: `/application/${row.id}/${row.type}/setting` })
} }
} }
@ -487,8 +575,7 @@ function deleteApplication(row: any) {
MsgSuccess(t('common.deleteSuccess')) MsgSuccess(t('common.deleteSuccess'))
}) })
}) })
.catch(() => { .catch(() => {})
})
} }
const exportApplication = (application: any) => { const exportApplication = (application: any) => {
@ -506,7 +593,7 @@ const importApplication = (file: any) => {
const formData = new FormData() const formData = new FormData()
formData.append('file', file.raw, file.name) formData.append('file', file.raw, file.name)
elUploadRef.value.clearFiles() elUploadRef.value.clearFiles()
ApplicationApi.importApplication(formData, loading) ApplicationApi.importApplication(folder.currentFolder.id, formData, loading)
.then(async (res: any) => { .then(async (res: any) => {
if (res?.data) { if (res?.data) {
applicationList.value = [] applicationList.value = []