diff --git a/apps/application/flow/step_node/data_source_web_node/impl/base_data_source_web_node.py b/apps/application/flow/step_node/data_source_web_node/impl/base_data_source_web_node.py index 5943b3c3e..9a5b6c604 100644 --- a/apps/application/flow/step_node/data_source_web_node/impl/base_data_source_web_node.py +++ b/apps/application/flow/step_node/data_source_web_node/impl/base_data_source_web_node.py @@ -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(): diff --git a/apps/common/utils/split_model.py b/apps/common/utils/split_model.py index 8bf2df59e..158f6a204 100644 --- a/apps/common/utils/split_model.py +++ b/apps/common/utils/split_model.py @@ -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), # 中英文问号 ] # 从后往前找分割点 diff --git a/apps/common/utils/tool_code.py b/apps/common/utils/tool_code.py index 48d62ac1a..e9f5c8c2e 100644 --- a/apps/common/utils/tool_code.py +++ b/apps/common/utils/tool_code.py @@ -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, }, diff --git a/apps/knowledge/views/knowledge_workflow.py b/apps/knowledge/views/knowledge_workflow.py index 2289499c9..b7cb7ac5b 100644 --- a/apps/knowledge/views/knowledge_workflow.py +++ b/apps/knowledge/views/knowledge_workflow.py @@ -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), diff --git a/apps/locales/en_US/LC_MESSAGES/django.po b/apps/locales/en_US/LC_MESSAGES/django.po index b583a2dd8..15f25abfc 100644 --- a/apps/locales/en_US/LC_MESSAGES/django.po +++ b/apps/locales/en_US/LC_MESSAGES/django.po @@ -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 "" \ No newline at end of file diff --git a/apps/locales/zh_CN/LC_MESSAGES/django.po b/apps/locales/zh_CN/LC_MESSAGES/django.po index 95d0536d3..ed82821cd 100644 --- a/apps/locales/zh_CN/LC_MESSAGES/django.po +++ b/apps/locales/zh_CN/LC_MESSAGES/django.po @@ -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" \ No newline at end of file diff --git a/apps/locales/zh_Hant/LC_MESSAGES/django.po b/apps/locales/zh_Hant/LC_MESSAGES/django.po index 8262f3340..4c58fecfb 100644 --- a/apps/locales/zh_Hant/LC_MESSAGES/django.po +++ b/apps/locales/zh_Hant/LC_MESSAGES/django.po @@ -8910,4 +8910,13 @@ msgid "SAML2 SSO" msgstr "SAML2 單點登入" msgid "Workflow" -msgstr "工作流" \ No newline at end of file +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" \ No newline at end of file diff --git a/ui/src/components/app-icon/icons/document.ts b/ui/src/components/app-icon/icons/document.ts index 0f4b5ccbe..3846dec4f 100644 --- a/ui/src/components/app-icon/icons/document.ts +++ b/ui/src/components/app-icon/icons/document.ts @@ -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', + }), + ], + ), + ]) + }, + }, } diff --git a/ui/src/locales/lang/en-US/views/application.ts b/ui/src/locales/lang/en-US/views/application.ts index 69d47545b..0f24ab2f0 100644 --- a/ui/src/locales/lang/en-US/views/application.ts +++ b/ui/src/locales/lang/en-US/views/application.ts @@ -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: { diff --git a/ui/src/locales/lang/zh-CN/views/application.ts b/ui/src/locales/lang/zh-CN/views/application.ts index 0bed65422..b71d23ec3 100644 --- a/ui/src/locales/lang/zh-CN/views/application.ts +++ b/ui/src/locales/lang/zh-CN/views/application.ts @@ -26,6 +26,7 @@ export default { professionalMessage: '社区版最多支持 5 个应用,如需拥有更多应用,请升级为专业版。', saveErrorMessage: '保存失败,请检查输入或稍后再试', loadingErrorMessage: '加载配置失败,请检查输入或稍后再试', + noDocPermission: '无文档创建权限', }, form: { appName: { diff --git a/ui/src/locales/lang/zh-Hant/views/application.ts b/ui/src/locales/lang/zh-Hant/views/application.ts index 431c35338..570067a4d 100644 --- a/ui/src/locales/lang/zh-Hant/views/application.ts +++ b/ui/src/locales/lang/zh-Hant/views/application.ts @@ -23,6 +23,7 @@ export default { professionalMessage: '社群版最多支援 5 個應用,如需擁有更多應用,請升級為專業版。', saveErrorMessage: '儲存失敗,請檢查輸入或稍後再試', loadingErrorMessage: '載入配置失敗,請檢查輸入或稍後再試', + noDocPermission: '無文檔創建權限', }, form: { appName: { diff --git a/ui/src/permission/knowledge/system-manage.ts b/ui/src/permission/knowledge/system-manage.ts index bb8a1dad0..2fc98040f 100644 --- a/ui/src/permission/knowledge/system-manage.ts +++ b/ui/src/permission/knowledge/system-manage.ts @@ -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, diff --git a/ui/src/permission/knowledge/system-share.ts b/ui/src/permission/knowledge/system-share.ts index 646030b48..24cc3ea2e 100644 --- a/ui/src/permission/knowledge/system-share.ts +++ b/ui/src/permission/knowledge/system-share.ts @@ -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, diff --git a/ui/src/permission/knowledge/workspace-share.ts b/ui/src/permission/knowledge/workspace-share.ts index ccb9c5808..e0ad36f54 100644 --- a/ui/src/permission/knowledge/workspace-share.ts +++ b/ui/src/permission/knowledge/workspace-share.ts @@ -48,6 +48,7 @@ const workspaceShare = { folderDelete: () => false, hit_test: () => false, debug: () => true, + workflow_edit: () => true, } export default workspaceShare diff --git a/ui/src/permission/knowledge/workspace.ts b/ui/src/permission/knowledge/workspace.ts index f381ca8b2..c944d2cf2 100644 --- a/ui/src/permission/knowledge/workspace.ts +++ b/ui/src/permission/knowledge/workspace.ts @@ -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, } diff --git a/ui/src/views/knowledge-workflow/component/DebugDrawer.vue b/ui/src/views/knowledge-workflow/component/DebugDrawer.vue index 018ee3890..4922e7476 100644 --- a/ui/src/views/knowledge-workflow/component/DebugDrawer.vue +++ b/ui/src/views/knowledge-workflow/component/DebugDrawer.vue @@ -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) => { 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' diff --git a/ui/src/views/knowledge-workflow/index.vue b/ui/src/views/knowledge-workflow/index.vue index 3537a947d..7e34f0ae0 100644 --- a/ui/src/views/knowledge-workflow/index.vue +++ b/ui/src/views/knowledge-workflow/index.vue @@ -34,11 +34,12 @@ {{ $t('common.debug') }} - + {{ $t('common.save') }} - + {{ $t('common.publish') }} @@ -49,7 +50,7 @@