Skip to content

Commit 974aafa

Browse files
committed
feat: Resource dependency and resource dependent dialog view
1 parent 2b7b519 commit 974aafa

16 files changed

Lines changed: 1185 additions & 524 deletions

File tree

apps/application/flow/tools.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -845,7 +845,8 @@ async def anext_async(agen):
845845
},
846846
'KNOWLEDGE': {'search-knowledge-node': lambda n: n.get('properties').get('node_data').get('knowledge_id_list')},
847847
'APPLICATION': {
848-
'application-node': lambda n: [n.get('properties').get('node_data').get('application_id')]
848+
'application-node': lambda n: [n.get('properties').get('node_data').get('application_id')],
849+
'ai-chat-node': lambda n: [*(n.get('properties').get('node_data').get('application_ids') or [])],
849850
}
850851
}
851852

apps/common/constants/permission_constants.py

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -708,15 +708,15 @@ class PermissionConstants(Enum):
708708
parent_group=[WorkspaceGroup.KNOWLEDGE, UserGroup.KNOWLEDGE]
709709
)
710710
KNOWLEDGE_BATCH_DELETE = Permission(group=Group.KNOWLEDGE, operate=Operate.BATCH_DELETE,
711-
role_list=[RoleConstants.ADMIN, RoleConstants.USER],
712-
resource_permission_group_list=[ResourcePermissionConst.KNOWLEDGE_MANGE],
713-
parent_group=[WorkspaceGroup.KNOWLEDGE, UserGroup.KNOWLEDGE],
714-
)
711+
role_list=[RoleConstants.ADMIN, RoleConstants.USER],
712+
resource_permission_group_list=[ResourcePermissionConst.KNOWLEDGE_MANGE],
713+
parent_group=[WorkspaceGroup.KNOWLEDGE, UserGroup.KNOWLEDGE],
714+
)
715715
KNOWLEDGE_BATCH_MOVE = Permission(group=Group.KNOWLEDGE, operate=Operate.BATCH_MOVE,
716-
role_list=[RoleConstants.ADMIN, RoleConstants.USER],
717-
resource_permission_group_list=[ResourcePermissionConst.KNOWLEDGE_MANGE],
718-
parent_group=[WorkspaceGroup.KNOWLEDGE, UserGroup.KNOWLEDGE],
719-
)
716+
role_list=[RoleConstants.ADMIN, RoleConstants.USER],
717+
resource_permission_group_list=[ResourcePermissionConst.KNOWLEDGE_MANGE],
718+
parent_group=[WorkspaceGroup.KNOWLEDGE, UserGroup.KNOWLEDGE],
719+
)
720720
KNOWLEDGE_RESOURCE_AUTHORIZATION = Permission(
721721
group=Group.KNOWLEDGE, operate=Operate.AUTH, role_list=[RoleConstants.ADMIN, RoleConstants.USER],
722722
resource_permission_group_list=[ResourcePermissionConst.KNOWLEDGE_MANGE],
@@ -1055,21 +1055,26 @@ class PermissionConstants(Enum):
10551055
parent_group=[WorkspaceGroup.APPLICATION, UserGroup.APPLICATION],
10561056
)
10571057
APPLICATION_BATCH_DELETE = Permission(group=Group.APPLICATION, operate=Operate.BATCH_DELETE,
1058-
role_list=[RoleConstants.ADMIN, RoleConstants.USER],
1059-
resource_permission_group_list=[ResourcePermissionConst.APPLICATION_MANGE],
1060-
parent_group=[WorkspaceGroup.APPLICATION, UserGroup.APPLICATION],
1061-
)
1058+
role_list=[RoleConstants.ADMIN, RoleConstants.USER],
1059+
resource_permission_group_list=[ResourcePermissionConst.APPLICATION_MANGE],
1060+
parent_group=[WorkspaceGroup.APPLICATION, UserGroup.APPLICATION],
1061+
)
10621062
APPLICATION_BATCH_MOVE = Permission(group=Group.APPLICATION, operate=Operate.BATCH_MOVE,
1063-
role_list=[RoleConstants.ADMIN, RoleConstants.USER],
1064-
resource_permission_group_list=[ResourcePermissionConst.APPLICATION_MANGE],
1065-
parent_group=[WorkspaceGroup.APPLICATION, UserGroup.APPLICATION],
1066-
)
1063+
role_list=[RoleConstants.ADMIN, RoleConstants.USER],
1064+
resource_permission_group_list=[ResourcePermissionConst.APPLICATION_MANGE],
1065+
parent_group=[WorkspaceGroup.APPLICATION, UserGroup.APPLICATION],
1066+
)
10671067
APPLICATION_RESOURCE_AUTHORIZATION = Permission(group=Group.APPLICATION, operate=Operate.AUTH,
10681068
role_list=[RoleConstants.ADMIN, RoleConstants.USER],
10691069
parent_group=[WorkspaceGroup.APPLICATION, UserGroup.APPLICATION],
10701070
resource_permission_group_list=[
10711071
ResourcePermissionConst.APPLICATION_MANGE],
10721072
)
1073+
APPLICATION_RELATE_RESOURCE_VIEW = Permission(
1074+
group=Group.APPLICATION, operate=Operate.RELATE_VIEW, role_list=[RoleConstants.ADMIN, RoleConstants.USER],
1075+
parent_group=[WorkspaceGroup.APPLICATION, UserGroup.APPLICATION],
1076+
resource_permission_group_list=[ResourcePermissionConst.APPLICATION_MANGE]
1077+
)
10731078
APPLICATION_TRIGGER_READ = Permission(
10741079
group=Group.APPLICATION, operate=Operate.TRIGGER_READ, role_list=[RoleConstants.ADMIN, RoleConstants.USER],
10751080
parent_group=[WorkspaceGroup.APPLICATION, UserGroup.APPLICATION],
@@ -1592,6 +1597,10 @@ class PermissionConstants(Enum):
15921597
group=Group.SYSTEM_RES_APPLICATION, operate=Operate.TRIGGER_DELETE, role_list=[RoleConstants.ADMIN],
15931598
parent_group=[SystemGroup.RESOURCE_APPLICATION], is_ee=settings.edition == "EE"
15941599
)
1600+
RESOURCE_APPLICATION_RELATE_RESOURCE_VIEW = Permission(
1601+
group=Group.SYSTEM_RES_APPLICATION, operate=Operate.RELATE_VIEW, role_list=[RoleConstants.ADMIN],
1602+
parent_group=[SystemGroup.RESOURCE_APPLICATION], is_ee=settings.edition == "EE"
1603+
)
15951604
RESOURCE_APPLICATION_OVERVIEW_READ = Permission(
15961605
group=Group.SYSTEM_RES_APPLICATION_OVERVIEW, operate=Operate.READ, role_list=[RoleConstants.ADMIN],
15971606
parent_group=[SystemGroup.RESOURCE_APPLICATION], is_ee=settings.edition == "EE"

apps/system_manage/serializers/resource_mapping_serializers.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,3 +101,54 @@ def get_resource_count(self, result_list):
101101
model['resource_count'] = count_dict.get(model_id, 0)
102102

103103
return result_list
104+
105+
106+
class MappingResourceSerializer(serializers.Serializer):
107+
resource = serializers.CharField(required=True, label=_('resource'))
108+
resource_id = serializers.UUIDField(required=True, label=_('resource Id'))
109+
110+
resource_name = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_('resource Name'))
111+
target_type = serializers.ListField(
112+
label=_('target Type'),
113+
child=serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_('target Type')))
114+
user_name = serializers.CharField(required=True, allow_null=True, allow_blank=True, label=_('creator'))
115+
workspace_ids = serializers.CharField(required=False, label=_('workspace_ids'))
116+
117+
def get_query_set(self):
118+
queryset = QuerySet(model=get_dynamics_model({
119+
'tdc.name': models.CharField(),
120+
'source_id': models.CharField(),
121+
"source_type": models.CharField(),
122+
"u.username": models.CharField(),
123+
'rm.target_type': models.CharField(),
124+
'workspace_id': models.CharField(),
125+
}))
126+
127+
queryset = queryset.filter(source_id=self.data.get('resource_id'),
128+
source_type=self.data.get('resource'))
129+
130+
if self.data.get('resource_name'):
131+
queryset = queryset.filter(**{'tdc.name__icontains': self.data.get('resource_name')})
132+
if self.data.get('user_name'):
133+
queryset = queryset.filter(**{'u.username__icontains': self.data.get('user_name')})
134+
if self.data.get("target_type"):
135+
queryset = queryset.filter(**{'rm.target_type__in': self.data.get('target_type')})
136+
if self.data.get('workspace_ids') is not None and len(self.data.get('workspace_ids')) > 0:
137+
workspace_ids = json.loads(self.data.get('workspace_ids'))
138+
queryset = queryset.filter(**{'workspace_id__in': workspace_ids})
139+
140+
return queryset
141+
142+
@staticmethod
143+
def is_x_pack_ee():
144+
workspace_model = DatabaseModelManage.get_model("workspace_model")
145+
return workspace_model is not None
146+
147+
def page(self, current_page, page_size):
148+
is_x_pack_ee = self.is_x_pack_ee()
149+
150+
return native_page_search(current_page, page_size, self.get_query_set(), get_file_content(
151+
os.path.join(PROJECT_DIR, "apps", "system_manage",
152+
'sql', 'list_mapping_resource_ee.sql' if is_x_pack_ee else 'list_mapping_resource.sql')),
153+
with_table_name=False
154+
)
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
WITH target_data_cte AS (SELECT 'APPLICATION' as target_type,
2+
id,
3+
"name",
4+
"desc",
5+
"user_id",
6+
"workspace_id",
7+
"icon",
8+
"type",
9+
"folder_id"
10+
FROM application
11+
UNION ALL
12+
SELECT 'KNOWLEDGE' as target_type,
13+
id,
14+
"name",
15+
"desc",
16+
"user_id",
17+
"workspace_id",
18+
"type"::text as "icon" , "type"::text as "type", "folder_id"
19+
FROM knowledge
20+
UNION ALL
21+
SELECT 'TOOL' as target_type,
22+
id,
23+
"name",
24+
"desc",
25+
"user_id",
26+
"workspace_id",
27+
"icon",
28+
"tool_type" as "type",
29+
"folder_id"
30+
FROM tool
31+
UNION ALL
32+
SELECT 'MODEL' as target_type,
33+
id,
34+
"name",
35+
''::text as "desc", "user_id",
36+
"workspace_id",
37+
"provider" as "icon",
38+
"model_type" as "type",
39+
''::text as "folder_id"
40+
FROM model)
41+
SELECT rm.*,
42+
tdc.*,
43+
u.nick_name as username
44+
FROM resource_mapping rm
45+
LEFT JOIN target_data_cte tdc
46+
ON rm.target_type = tdc.target_type
47+
AND rm.target_id::uuid = tdc.id
48+
LEFT JOIN "public"."user" u
49+
ON u.id = tdc.user_id
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
WITH target_data_cte AS (SELECT 'APPLICATION' as target_type,
2+
id,
3+
"name",
4+
"desc",
5+
"user_id",
6+
"workspace_id",
7+
"icon",
8+
"type",
9+
"folder_id"
10+
FROM application
11+
UNION ALL
12+
SELECT 'KNOWLEDGE' as target_type,
13+
id,
14+
"name",
15+
"desc",
16+
"user_id",
17+
"workspace_id",
18+
"type"::text as "icon" , "type"::text as "type", "folder_id"
19+
FROM knowledge
20+
UNION ALL
21+
SELECT 'TOOL' as target_type,
22+
id,
23+
"name",
24+
"desc",
25+
"user_id",
26+
"workspace_id",
27+
"icon",
28+
"tool_type" as "type",
29+
"folder_id"
30+
FROM tool
31+
UNION ALL
32+
SELECT 'MODEL' as target_type,
33+
id,
34+
"name",
35+
''::text as "desc", "user_id",
36+
"workspace_id",
37+
"provider" as "icon",
38+
"model_type" as "type",
39+
''::text as "folder_id"
40+
FROM model)
41+
SELECT rm.*,
42+
tdc.*,
43+
u.nick_name as username,
44+
w.name as workspace_name
45+
FROM resource_mapping rm
46+
LEFT JOIN target_data_cte tdc
47+
ON rm.target_type = tdc.target_type
48+
AND rm.target_id::uuid = tdc.id
49+
LEFT JOIN "public"."user" u
50+
ON u.id = tdc.user_id
51+
LEFT JOIN "public"."workspace" w
52+
ON w.id = tdc.workspace_id

apps/system_manage/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
path('workspace/<str:workspace_id>/resource_user_permission/resource/<str:target>/resource/<str:resource>', views.WorkspaceResourceUserPermissionView.as_view()),
1111
path('workspace/<str:workspace_id>/resource_user_permission/resource/<str:target>/resource/<str:resource>/<int:current_page>/<int:page_size>', views.WorkspaceResourceUserPermissionView.Page.as_view()),
1212
path('workspace/<str:workspace_id>/resource_mapping/<str:resource>/<str:resource_id>/<int:current_page>/<int:page_size>', views.ResourceMappingView.as_view()),
13+
path('workspace/<str:workspace_id>/mapping_resource/<str:resource>/<str:resource_id>/<int:current_page>/<int:page_size>', views.MappingResourceView.as_view()),
1314
path('email_setting', views.SystemSetting.Email.as_view()),
1415
path('profile', views.SystemProfile.as_view()),
1516
path('valid/<str:valid_type>/<int:valid_count>', views.Valid.as_view())

apps/system_manage/views/resource_mapping.py

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
from common.constants.permission_constants import Permission, Group, Operate, RoleConstants, ViewPermission, \
1919
CompareConstants
2020
from system_manage.api.resource_mapping import ResourceMappingAPI
21-
from system_manage.serializers.resource_mapping_serializers import ResourceMappingSerializer
21+
from system_manage.serializers.resource_mapping_serializers import ResourceMappingSerializer, MappingResourceSerializer
2222

2323

2424
class ResourceMappingView(APIView):
@@ -53,3 +53,37 @@ def get(self, request: Request, workspace_id: str, resource: str, resource_id: s
5353
'user_name': request.query_params.get('user_name'),
5454
'source_type': request.query_params.getlist('source_type[]'),
5555
}).page(current_page, page_size))
56+
57+
58+
class MappingResourceView(APIView):
59+
authentication_classes = [TokenAuth]
60+
61+
@extend_schema(
62+
methods=['GET'],
63+
description=_('Retrieve the pagination list of resource relationships'),
64+
operation_id=_('Retrieve the pagination list of resource relationships'), # type: ignore
65+
responses=ResourceMappingAPI.get_response(),
66+
parameters=ResourceMappingAPI.get_parameters(),
67+
tags=[_('Mapping Resource')] # type: ignore
68+
)
69+
@has_permissions(
70+
lambda r, kwargs: Permission(group=Group(kwargs.get('resource')),
71+
operate=Operate.RELATE_VIEW,
72+
resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}:ROLE/WORKSPACE_MANAGE"),
73+
lambda r, kwargs: Permission(group=Group(kwargs.get('resource')),
74+
operate=Operate.RELATE_VIEW,
75+
resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}/{kwargs.get('resource')}/{kwargs.get('resource_id')}"),
76+
ViewPermission([RoleConstants.USER.get_workspace_role()],
77+
[lambda r, kwargs: Permission(group=Group(kwargs.get('resource')),
78+
operate=Operate.SELF,
79+
resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}/{kwargs.get('resource')}/{kwargs.get('resource_id')}")],
80+
CompareConstants.AND),
81+
RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
82+
def get(self, request: Request, workspace_id: str, resource: str, resource_id: str, current_page, page_size):
83+
return result.success(MappingResourceSerializer({
84+
'resource': resource,
85+
'resource_id': resource_id,
86+
'resource_name': request.query_params.get('resource_name'),
87+
'user_name': request.query_params.get('user_name'),
88+
'target_type': request.query_params.getlist('target_type[]'),
89+
}).page(current_page, page_size))

ui/src/api/workspace/resource-mapping.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,32 @@ const getResourceMapping: (
2222
loading,
2323
)
2424
}
25+
/**
26+
* 依赖项
27+
* @param workspace_id
28+
* @param resource
29+
* @param resource_id
30+
* @param page
31+
* @param params
32+
* @param loading
33+
* @returns
34+
*/
35+
const getMappingResource: (
36+
workspace_id: string,
37+
resource: string,
38+
resource_id: string,
39+
page: pageRequest,
40+
params?: any,
41+
loading?: Ref<boolean>,
42+
) => Promise<Result<any>> = (workspace_id, resource, resource_id, page, params, loading) => {
43+
return get(
44+
`${prefix}/${workspace_id}/mapping_resource/${resource}/${resource_id}/${page.current_page}/${page.page_size}`,
45+
params,
46+
loading,
47+
)
48+
}
2549

2650
export default {
2751
getResourceMapping,
52+
getMappingResource,
2853
}

0 commit comments

Comments
 (0)