fix: 修复【应用编排】授权给其他用户的应用编排,其他用户查看的时候不应该提示函数不存在

This commit is contained in:
shaohuzhang1 2024-08-27 14:36:12 +08:00 committed by shaohuzhang1
parent a9443a638c
commit d030a4c87c
6 changed files with 91 additions and 8 deletions

View File

@ -42,6 +42,7 @@ from common.util.file_util import get_file_content
from dataset.models import DataSet, Document, Image
from dataset.serializers.common_serializers import list_paragraph, get_embedding_model_by_dataset_id_list
from embedding.models import SearchMode
from function_lib.serializers.function_lib_serializer import FunctionLibSerializer
from setting.models import AuthOperate
from setting.models.model_management import Model
from setting.models_provider import get_model_credential
@ -575,6 +576,19 @@ class ApplicationSerializer(serializers.Serializer):
data={'user_id': application.user_id, 'model_type': model_type}).list(
with_valid=True)
def list_function_lib(self, with_valid=True):
if with_valid:
self.is_valid(raise_exception=True)
application = QuerySet(Application).filter(id=self.data.get("application_id")).first()
return FunctionLibSerializer.Query(data={'user_id': application.user_id}).list(with_valid=True)
def get_function_lib(self, function_lib_id, with_valid=True):
if with_valid:
self.is_valid(raise_exception=True)
application = QuerySet(Application).filter(id=self.data.get("application_id")).first()
return FunctionLibSerializer.Operate(data={'user_id': application.user_id, 'id': function_lib_id}).one(
with_valid=True)
def delete(self, with_valid=True):
if with_valid:
self.is_valid()

View File

@ -19,6 +19,9 @@ urlpatterns = [
path('application/<str:application_id>/statistics/chat_record_aggregate_trend',
views.ApplicationStatistics.ChatRecordAggregateTrend.as_view()),
path('application/<str:application_id>/model', views.Application.Model.as_view()),
path('application/<str:application_id>/function_lib', views.Application.FunctionLib.as_view()),
path('application/<str:application_id>/function_lib/<str:function_lib_id>',
views.Application.FunctionLib.Operate.as_view()),
path('application/<str:application_id>/hit_test', views.Application.HitTest.as_view()),
path('application/<str:application_id>/api_key', views.Application.ApplicationKey.as_view()),
path("application/<str:application_id>/api_key/<str:api_key_id>",

View File

@ -187,6 +187,43 @@ class Application(APIView):
data={'application_id': application_id,
'user_id': request.user.id}).list_model(request.query_params.get('model_type')))
class FunctionLib(APIView):
authentication_classes = [TokenAuth]
@action(methods=["GET"], detail=False)
@swagger_auto_schema(operation_summary="获取函数库列表",
operation_id="获取函数库列表",
tags=["应用"])
@has_permissions(ViewPermission(
[RoleConstants.ADMIN, RoleConstants.USER],
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
dynamic_tag=keywords.get('application_id'))],
compare=CompareConstants.AND))
def get(self, request: Request, application_id: str):
return result.success(
ApplicationSerializer.Operate(
data={'application_id': application_id,
'user_id': request.user.id}).list_function_lib())
class Operate(APIView):
authentication_classes = [TokenAuth]
@action(methods=["GET"], detail=False)
@swagger_auto_schema(operation_summary="获取函数库列表",
operation_id="获取函数库列表",
tags=["应用"],
)
@has_permissions(ViewPermission(
[RoleConstants.ADMIN, RoleConstants.USER],
[lambda r, keywords: Permission(group=Group.APPLICATION, operate=Operate.USE,
dynamic_tag=keywords.get('application_id'))],
compare=CompareConstants.AND))
def get(self, request: Request, application_id: str, function_lib_id: str):
return result.success(
ApplicationSerializer.Operate(
data={'application_id': application_id,
'user_id': request.user.id}).get_function_lib(function_lib_id))
class Profile(APIView):
authentication_classes = [TokenAuth]

View File

@ -248,7 +248,32 @@ const putPublishApplication: (
) => Promise<Result<any>> = (application_id, data, loading) => {
return put(`${prefix}/${application_id}/publish`, data, undefined, loading)
}
/**
*
* @param application_id id
* @param loading
* @returns
*/
const listFunctionLib: (application_id: String, loading?: Ref<boolean>) => Promise<Result<any>> = (
application_id,
loading
) => {
return get(`${prefix}/${application_id}/function_lib`, undefined, loading)
}
/**
*
* @param application_id
* @param function_lib_id
* @param loading
* @returns
*/
const getFunctionLib: (
application_id: String,
function_lib_id: String,
loading?: Ref<boolean>
) => Promise<Result<any>> = (application_id, function_lib_id, loading) => {
return get(`${prefix}/${application_id}/function_lib/${function_lib_id}`, undefined, loading)
}
export default {
getAllAppilcation,
getApplication,
@ -268,5 +293,7 @@ export default {
getApplicationHitTest,
getApplicationModel,
putPublishApplication,
postWorkflowChatOpen
postWorkflowChatOpen,
listFunctionLib,
getFunctionLib
}

View File

@ -157,7 +157,6 @@ import { datetimeFormat } from '@/utils/time'
import useStore from '@/stores'
import { WorkFlowInstance } from '@/workflow/common/validate'
import { hasPermission } from '@/utils/permission'
import functionLibApi from '@/api/function-lib'
const { user, application } = useStore()
const router = useRouter()
@ -300,7 +299,7 @@ function saveApplication() {
}
function getList() {
functionLibApi.getAllFunctionLib({}, loading).then((res: any) => {
applicationApi.listFunctionLib(id, loading).then((res: any) => {
functionLibList.value = res.data
})
}

View File

@ -80,11 +80,14 @@ import NodeCascader from '@/workflow/common/NodeCascader.vue'
import type { FormInstance } from 'element-plus'
import { ref, computed, onMounted } from 'vue'
import { isLastNode } from '@/workflow/common/data'
import functionLibApi from '@/api/function-lib'
import applicationApi from '@/api/application'
import { app } from '@/main'
const props = defineProps<{ nodeModel: any }>()
const nodeCascaderRef = ref()
const {
params: { id }
} = app.config.globalProperties.$route as any
const form = {
input_field_list: [],
is_result: false
@ -113,8 +116,8 @@ const validate = () => {
}
const update_field = () => {
functionLibApi
.getFunctionLibById(props.nodeModel.properties.node_data.function_lib_id)
applicationApi
.getFunctionLib(id, props.nodeModel.properties.node_data.function_lib_id)
.then((ok) => {
const old_input_field_list = props.nodeModel.properties.node_data.input_field_list
const merge_input_field_list = ok.data.input_field_list.map((item: any) => {