fix: Application import (#3566)
This commit is contained in:
parent
109e8507f1
commit
592ae54e82
@ -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'),
|
||||||
|
|||||||
@ -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()),
|
||||||
|
|||||||
@ -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]
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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')
|
||||||
|
|||||||
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -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 = []
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user