1616import uuid_utils .compat as uuid
1717from django .core import validators
1818from django .db import models , transaction
19- from django .db .models import QuerySet
19+ from django .db .models import QuerySet , Q
2020from django .http import HttpResponse
2121from django .utils .translation import gettext_lazy as _
2222from rest_framework import serializers , status
3232from common .exception .app_exception import AppApiException
3333from common .field .common import UploadedFileField
3434from common .utils .common import get_file_content , valid_license , restricted_loads
35- from knowledge .models import Knowledge
35+ from knowledge .models import Knowledge , KnowledgeScope
36+ from knowledge .serializers .knowledge import KnowledgeSerializer , KnowledgeModelSerializer
3637from maxkb .conf import PROJECT_DIR
3738from models_provider .models import Model
3839from system_manage .models import WorkspaceUserResourcePermission
@@ -703,7 +704,7 @@ def edit(self, instance: Dict, with_valid=True):
703704 if 'knowledge_id_list' in instance :
704705 knowledge_id_list = instance .get ('knowledge_id_list' )
705706 # 当前用户可修改关联的知识库列表
706- application_knowledge_id_list = [str (knowledge .id ) for knowledge in
707+ application_knowledge_id_list = [str (knowledge .get ( 'id' ) ) for knowledge in
707708 self .list_knowledge (with_valid = False )]
708709 for knowledge_id in knowledge_id_list :
709710 if not application_knowledge_id_list .__contains__ (knowledge_id ):
@@ -723,7 +724,7 @@ def one(self, with_valid=True):
723724 mapping_knowledge_id_list = [akm .knowledge_id for akm in
724725 QuerySet (ApplicationKnowledgeMapping ).filter (application_id = application_id )]
725726 knowledge_id_list = [d .id for d in
726- list (filter (lambda row : mapping_knowledge_id_list .__contains__ (row .id ),
727+ list (filter (lambda row : mapping_knowledge_id_list .__contains__ (row .get ( 'id' ) ),
727728 knowledge_list ))]
728729 return {** ApplicationSerializerModel (application ).data ,
729730 'knowledge_id_list' : knowledge_id_list }
@@ -732,8 +733,28 @@ def list_knowledge(self, with_valid=True):
732733 if with_valid :
733734 self .is_valid (raise_exception = True )
734735 workspace_id = self .data .get ("workspace_id" )
735- knowledge_list = QuerySet (Knowledge ).filter (workspace_id = workspace_id )
736- return knowledge_list
736+ user_id = self .data .get ('user_id' )
737+ knowledge_workspace_authorization_model = DatabaseModelManage .get_model ('knowledge_workspace_authorization' )
738+ share_knowledge_list = []
739+ if knowledge_workspace_authorization_model is not None :
740+ white_list_condition = Q (authentication_type = 'WHITE_LIST' ) & Q (
741+ workspace_id_list__contains = [workspace_id ])
742+ default_condition = ~ Q (authentication_type = 'WHITE_LIST' ) & ~ Q (
743+ workspace_id_list__contains = [workspace_id ])
744+ # 组合查询
745+ query = white_list_condition | default_condition
746+ inner = QuerySet (knowledge_workspace_authorization_model ).filter (query )
747+ share_knowledge_list = [KnowledgeModelSerializer (k ).data for k in QuerySet (Knowledge ).filter (id__in = inner )]
748+ workspace_knowledge_list = [k for k in KnowledgeSerializer .Query (
749+ data = {
750+ 'folder_id' : 'default' ,
751+ 'workspace_id' : workspace_id ,
752+ 'scope' : KnowledgeScope .WORKSPACE ,
753+ 'user_id' : user_id
754+ }
755+ ).list () if k .get ('resource_type' ) == 'knowledge' ]
756+
757+ return [* workspace_knowledge_list , * share_knowledge_list ]
737758
738759 @staticmethod
739760 def save_application_knowledge_mapping (application_knowledge_id_list , knowledge_id_list , application_id ):
0 commit comments