Merge branch 'v2' into pr@v2@fix_knowledge_workflow

This commit is contained in:
shaohuzhang1 2025-12-03 11:46:37 +08:00 committed by GitHub
commit ad697d7f0b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
17 changed files with 110 additions and 14 deletions

View File

@ -19,8 +19,8 @@ from common.utils.logger import maxkb_logger
class BaseDataSourceWebNodeForm(BaseForm):
source_url = forms.TextInputField('source url', required=True)
selector = forms.TextInputField('knowledge selector', required=False,default_value="body")
source_url = forms.TextInputField(_('Web source url'), required=True)
selector = forms.TextInputField(_('Web knowledge selector'), required=False,attrs={'placeholder': _('The default is body, you can enter .classname/#idname/tagname')})
def get_collect_handler():

View File

@ -300,8 +300,9 @@ def smart_split_paragraph(content: str, limit: int):
# 优先级:句号 > 感叹号/问号 > 回车
split_chars = [
('', 0), ('!', 0), ('?', 0), # 句子结束符,包含在当前段
('\n', 0), # 回车符
('', 0), ('.', 0), # 中英文句号
('!', 0), ('!', 0), # 中英文感叹号
('?', 0), ('?', 0), # 中英文问号
]
# 从后往前找分割点

View File

@ -210,6 +210,7 @@ exec({dedent(code)!a})
'-c',
f'import base64,gzip; exec(gzip.decompress(base64.b64decode(\'{compressed_and_base64_encoded_code_str}\')).decode())',
],
'cwd': self.sandbox_path,
'env': {
'LD_PRELOAD': self.sandbox_so_path,
},

View File

@ -73,8 +73,8 @@ class KnowledgeWorkflowActionView(APIView):
tags=[_('Knowledge Base')] # type: ignore
)
@has_permissions(
PermissionConstants.KNOWLEDGE_READ.get_workspace_knowledge_permission(),
PermissionConstants.KNOWLEDGE_READ.get_workspace_permission_workspace_manage_role(),
PermissionConstants.KNOWLEDGE_DOCUMENT_CREATE.get_workspace_knowledge_permission(),
PermissionConstants.KNOWLEDGE_DOCUMENT_CREATE.get_workspace_permission_workspace_manage_role(),
RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
ViewPermission(
[RoleConstants.USER.get_workspace_role()],
@ -148,8 +148,8 @@ class KnowledgeWorkflowView(APIView):
responses=DefaultResultSerializer,
tags=[_('Knowledge')] # type: ignore
)
@has_permissions(PermissionConstants.KNOWLEDGE_EDIT.get_workspace_knowledge_permission(),
PermissionConstants.KNOWLEDGE_EDIT.get_workspace_permission_workspace_manage_role(),
@has_permissions(PermissionConstants.KNOWLEDGE_WORKFLOW_EDIT.get_workspace_knowledge_permission(),
PermissionConstants.KNOWLEDGE_WORKFLOW_EDIT.get_workspace_permission_workspace_manage_role(),
ViewPermission([RoleConstants.USER.get_workspace_role()],
[PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()],
CompareConstants.AND),

View File

@ -8784,4 +8784,13 @@ msgid "SAML2 SSO"
msgstr ""
msgid "Workflow"
msgstr ""
msgid "Web source url"
msgstr ""
msgid "Web knowledge selector"
msgstr ""
msgid "The default is body, you can enter .classname/#idname/tagname"
msgstr ""

View File

@ -8911,3 +8911,12 @@ msgstr "SAML2 单点登录"
msgid "Workflow"
msgstr "工作流"
msgid "Web source url"
msgstr "Web 根地址"
msgid "Web knowledge selector"
msgstr "选择器"
msgid "The default is body, you can enter .classname/#idname/tagname"
msgstr "默认为 body可输入 .classname/#idname/tagname"

View File

@ -8910,4 +8910,13 @@ msgid "SAML2 SSO"
msgstr "SAML2 單點登入"
msgid "Workflow"
msgstr "工作流"
msgstr "工作流"
msgid "Web source url"
msgstr "Web 根地址"
msgid "Web knowledge selector"
msgstr "選擇器"
msgid "The default is body, you can enter .classname/#idname/tagname"
msgstr "默認為 body可輸入 .classname/#idname/tagname"

View File

@ -96,4 +96,29 @@ export default {
])
},
},
'app-import-doc': {
iconReader: () => {
return h('i', [
h(
'svg',
{
style: { height: '100%', width: '100%' },
viewBox: '0 0 1024 1024',
version: '1.1',
xmlns: 'http://www.w3.org/2000/svg',
},
[
h('path', {
d: 'M128 935.594667A45.653333 45.653333 0 0 0 173.482667 981.333333h338.346666v-85.76H213.248V128H810.24v426.666667h85.333333V87.978667A45.653333 45.653333 0 0 0 850.005333 42.24H173.482667A45.653333 45.653333 0 0 0 128 87.978667v847.616z',
fill: 'currentColor',
}),
h('path', {
d: 'M298.922667 480.768c0-6.314667 5.12-11.434667 11.392-11.434667h403.626666c6.314667 0 11.392 5.12 11.392 11.434667v62.890667c0 6.314667-5.12 11.434667-11.392 11.434666h-403.626666a11.392 11.392 0 0 1-11.392-11.434666v-62.890667zM310.4 298.666667a11.392 11.392 0 0 0-11.392 11.434666v62.890667c0 6.314667 5.12 11.434667 11.392 11.434667h190.208c6.314667 0 11.392-5.12 11.392-11.434667V310.101333A11.392 11.392 0 0 0 500.608 298.666667H310.4zM725.333333 661.333333a21.333333 21.333333 0 0 1 21.333334-21.333333h42.666666a21.333333 21.333333 0 0 1 21.333334 21.333333V768h106.666666a21.333333 21.333333 0 0 1 21.333334 21.333333v42.666667a21.333333 21.333333 0 0 1-21.333334 21.333333H810.666667v106.666667a21.333333 21.333333 0 0 1-21.333334 21.333333h-42.666666a21.333333 21.333333 0 0 1-21.333334-21.333333V853.333333h-106.666666a21.333333 21.333333 0 0 1-21.333334-21.333333v-42.666667a21.333333 21.333333 0 0 1 21.333334-21.333333H725.333333v-106.666667z',
fill: 'currentColor',
}),
],
),
])
},
},
}

View File

@ -26,6 +26,7 @@ export default {
'The Community Edition supports up to 5 APP. If you need more APP, please upgrade to the Professional Edition.',
saveErrorMessage: 'Saving failed, please check your input or try again later',
loadingErrorMessage: 'Failed to load configuration, please check your input or try again later',
noDocPermission: 'No permission to create documents',
},
form: {

View File

@ -26,6 +26,7 @@ export default {
professionalMessage: '社区版最多支持 5 个应用,如需拥有更多应用,请升级为专业版。',
saveErrorMessage: '保存失败,请检查输入或稍后再试',
loadingErrorMessage: '加载配置失败,请检查输入或稍后再试',
noDocPermission: '无文档创建权限',
},
form: {
appName: {

View File

@ -23,6 +23,7 @@ export default {
professionalMessage: '社群版最多支援 5 個應用,如需擁有更多應用,請升級為專業版。',
saveErrorMessage: '儲存失敗,請檢查輸入或稍後再試',
loadingErrorMessage: '載入配置失敗,請檢查輸入或稍後再試',
noDocPermission: '無文檔創建權限',
},
form: {
appName: {

View File

@ -191,6 +191,12 @@ const systemManage = {
PermissionConst.RESOURCE_KNOWLEDGE_WORKFLOW_READ
],'OR'
),
workflow_edit: () =>
hasPermission([
RoleConst.ADMIN,
PermissionConst.RESOURCE_KNOWLEDGE_WORKFLOW_EDIT
],'OR'
),
chat_user_edit: () =>false,

View File

@ -58,6 +58,9 @@ const share = {
hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_TAG_DELETE], 'OR'),
debug: () =>
hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_WORKFLOW_READ], 'OR'),
workflow_edit: () =>
hasPermission([RoleConst.ADMIN, PermissionConst.SHARED_KNOWLEDGE_WORKFLOW_EDIT], 'OR'),
chat_user_edit: () => false,
auth: () => false,

View File

@ -48,6 +48,7 @@ const workspaceShare = {
folderDelete: () => false,
hit_test: () => false,
debug: () => true,
workflow_edit: () => true,
}
export default workspaceShare

View File

@ -572,6 +572,21 @@ const workspace = {
],
'OR',
),
workflow_edit: (source_id: string) =>
hasPermission(
[
new ComplexPermission(
[RoleConst.USER],
[PermissionConst.KNOWLEDGE.getKnowledgeWorkspaceResourcePermission(source_id)],
[],
'AND',
),
RoleConst.WORKSPACE_MANAGE.getWorkspaceRole,
PermissionConst.KNOWLEDGE_WORKFLOW_EDIT.getKnowledgeWorkspaceResourcePermission(source_id),
PermissionConst.KNOWLEDGE_WORKFLOW_EDIT.getWorkspacePermissionWorkspaceManageRole,
],
'OR',
),
hit_test: () => false,
}

View File

@ -58,7 +58,11 @@ import Result from '@/views/knowledge-workflow/component/action/Result.vue'
import applicationApi from '@/api/application/application'
import KnowledgeBase from '@/views/knowledge-workflow/component/action/KnowledgeBase.vue'
import { WorkflowType } from '@/enums/application'
import { loadSharedApi } from '@/utils/dynamics-api/shared-api'
import permissionMap from '@/permission'
import { MsgError } from '@/utils/message'
import { t } from '@/locales'
import { useRoute, useRouter } from 'vue-router'
provide('upload', (file: any, loading?: Ref<boolean>) => {
return applicationApi.postUploadFile(file, id, 'KNOWLEDGE', loading)
@ -121,8 +125,14 @@ const up = () => {
active.value = 'data_source'
})
}
const permissionPrecise = computed(() => {
return permissionMap['knowledge'][apiType.value]
})
const upload = () => {
ActionRef.value.validate().then(() => {
if (permissionPrecise.value.doc_create(id)) {
ActionRef.value.validate().then(() => {
form_data.value[active.value] = ActionRef.value.get_data()
loadSharedApi({ type: 'knowledge', systemType: apiType.value })
.workflowAction(id, form_data.value, loading)
@ -131,6 +141,9 @@ const upload = () => {
active.value = 'result'
})
})
} else {
MsgError(t('views.application.tip.noDocPermission'))
}
}
const continueImporting = () => {
active.value = 'data_source'

View File

@ -34,11 +34,12 @@
<AppIcon iconName="app-debug-outlined" class="mr-4"></AppIcon>
{{ $t('common.debug') }}
</el-button>
<el-button @click="saveknowledge(true)">
<el-button v-if="permissionPrecise.workflow_edit(id)"
@click="saveknowledge(true)">
<AppIcon iconName="app-save-outlined" class="mr-4"></AppIcon>
{{ $t('common.save') }}
</el-button>
<el-button type="primary" @click="publish">
<el-button type="primary" v-if="permissionPrecise.workflow_edit(id)" @click="publish">
{{ $t('common.publish') }}
</el-button>
@ -49,7 +50,7 @@
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item @click="toImportDoc">
<AppIcon iconName="app-create-chat" class="color-secondary"></AppIcon>
<AppIcon iconName="app-import-doc" class="color-secondary"></AppIcon>
{{ $t('views.workflow.operation.toImportDoc') }}
</el-dropdown-item>
@ -57,7 +58,7 @@
<AppIcon iconName="app-history-outlined" class="color-secondary"></AppIcon>
{{ $t('views.workflow.setting.releaseHistory') }}
</el-dropdown-item>
<el-dropdown-item>
<el-dropdown-item v-if="permissionPrecise.workflow_edit(id)">
<AppIcon iconName="app-save-outlined" class="color-secondary"></AppIcon>
{{ $t('views.workflow.setting.autoSave') }}
<div class="ml-4">