fix: application page (#3233)

This commit is contained in:
shaohuzhang1 2025-06-11 12:21:13 +08:00 committed by GitHub
parent c07fd323bf
commit f5baae4117
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 90 additions and 17 deletions

View File

@ -38,6 +38,7 @@ from models_provider.models import Model
from tools.models import Tool, ToolScope from tools.models import Tool, ToolScope
from tools.serializers.tool import ToolModelSerializer from tools.serializers.tool import ToolModelSerializer
from users.models import User from users.models import User
from users.serializers.user import is_workspace_manage
def get_base_node_work_flow(work_flow): def get_base_node_work_flow(work_flow):
@ -290,9 +291,10 @@ class ApplicationListResponse(serializers.Serializer):
class Query(serializers.Serializer): class Query(serializers.Serializer):
workspace_id = serializers.CharField(required=False, label=_('workspace id')) workspace_id = serializers.CharField(required=False, label=_('Workspace ID'))
user_id = serializers.UUIDField(required=True, label=_("User ID"))
def get_query_set(self, instance: Dict): def get_query_set(self, instance: Dict, workspace_manage: bool):
folder_query_set = QuerySet(ApplicationFolder) folder_query_set = QuerySet(ApplicationFolder)
application_query_set = QuerySet(Application) application_query_set = QuerySet(Application)
workspace_id = self.data.get('workspace_id') workspace_id = self.data.get('workspace_id')
@ -315,11 +317,14 @@ class Query(serializers.Serializer):
if desc is not None: if desc is not None:
folder_query_set = folder_query_set.filter(desc__contains=desc) folder_query_set = folder_query_set.filter(desc__contains=desc)
application_query_set = application_query_set.filter(desc__contains=desc) application_query_set = application_query_set.filter(desc__contains=desc)
application_custom_sql_query_set = application_query_set
application_query_set = application_query_set.order_by("-update_time") application_query_set = application_query_set.order_by("-update_time")
return { return {
'folder_query_set': folder_query_set, 'folder_query_set': folder_query_set,
'application_query_set': application_query_set 'application_query_set': application_query_set,
} 'application_custom_sql': application_custom_sql_query_set
} if workspace_manage else {'folder_query_set': folder_query_set,
'application_query_set': application_query_set}
@staticmethod @staticmethod
def is_x_pack_ee(): def is_x_pack_ee():
@ -329,17 +334,28 @@ class Query(serializers.Serializer):
def list(self, instance: Dict): def list(self, instance: Dict):
self.is_valid(raise_exception=True) self.is_valid(raise_exception=True)
workspace_id = self.data.get('workspace_id')
user_id = self.data.get("user_id")
ApplicationQueryRequest(data=instance).is_valid(raise_exception=True) ApplicationQueryRequest(data=instance).is_valid(raise_exception=True)
return native_search(self.get_query_set(instance), select_string=get_file_content( workspace_manage = is_workspace_manage(user_id, workspace_id)
return native_search(self.get_query_set(instance, workspace_manage), select_string=get_file_content(
os.path.join(PROJECT_DIR, "apps", "application", 'sql', os.path.join(PROJECT_DIR, "apps", "application", 'sql',
'list_application_ee.sql' if self.is_x_pack_ee() else 'list_application.sql'))) 'list_application.sql' if workspace_manage else (
'list_application_user_ee.sql' if self.is_x_pack_ee() else 'list_application_user.sql')
)))
def page(self, current_page: int, page_size: int, instance: Dict): def page(self, current_page: int, page_size: int, instance: Dict):
self.is_valid(raise_exception=True) self.is_valid(raise_exception=True)
ApplicationQueryRequest(data=instance).is_valid(raise_exception=True) ApplicationQueryRequest(data=instance).is_valid(raise_exception=True)
return native_page_search(current_page, page_size, self.get_query_set(instance), get_file_content( workspace_id = self.data.get('workspace_id')
os.path.join(PROJECT_DIR, "apps", "application", 'sql', user_id = self.data.get("user_id")
'list_application_ee.sql' if self.is_x_pack_ee() else 'list_application.sql')), workspace_manage = is_workspace_manage(user_id, workspace_id)
return native_page_search(current_page, page_size, self.get_query_set(instance, workspace_manage),
get_file_content(
os.path.join(PROJECT_DIR, "apps", "application", 'sql',
'list_application.sql' if workspace_manage else (
'list_application_user_ee.sql' if self.is_x_pack_ee() else 'list_application_user.sql'))),
) )

View File

@ -11,10 +11,7 @@ from (select "id"::text,
"create_time", "create_time",
"update_time" "update_time"
from application from application
where id in (select target ${application_custom_sql}
from workspace_user_resource_permission
where auth_target_type = 'APPLICATION'
and 'VIEW' = any (permission_list))
UNION UNION
select "id", select "id",
"name", "name",

View File

@ -0,0 +1,31 @@
select *
from (select "id"::text,
"name",
"desc",
"is_publish",
"type",
'application' as "resource_type",
"workspace_id",
"folder_id",
"user_id",
"create_time",
"update_time"
from application
where id in (select target
from workspace_user_resource_permission
where auth_target_type = 'APPLICATION'
and 'VIEW' = any (permission_list))
UNION
select "id",
"name",
"desc",
true as "is_publish",
'folder' as "type",
'folder' as "resource_type",
"workspace_id",
"parent_id" as "folder_id",
"user_id",
"create_time",
"update_time"
from application_folder ${folder_query_set}) temp
${application_query_set}

View File

@ -18,7 +18,7 @@ from application.serializers.application_chat_record import ApplicationChatRecor
from common import result from common import result
from common.auth import TokenAuth from common.auth import TokenAuth
from common.auth.authentication import has_permissions from common.auth.authentication import has_permissions
from common.constants.permission_constants import PermissionConstants from common.constants.permission_constants import PermissionConstants, RoleConstants
from common.utils.common import query_params_to_single_dict from common.utils.common import query_params_to_single_dict
@ -35,7 +35,8 @@ class ApplicationChatRecord(APIView):
responses=ApplicationChatRecordQueryAPI.get_response(), responses=ApplicationChatRecordQueryAPI.get_response(),
tags=[_("Application/Conversation Log")] # type: ignore tags=[_("Application/Conversation Log")] # type: ignore
) )
@has_permissions(PermissionConstants.APPLICATION_CHAT_LOG.get_workspace_application_permission()) @has_permissions(PermissionConstants.APPLICATION_CHAT_LOG.get_workspace_application_permission(),
RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
def get(self, request: Request, workspace_id: str, application_id: str, chat_id: str): def get(self, request: Request, workspace_id: str, application_id: str, chat_id: str):
return result.success(ApplicationChatRecordQuerySerializers( return result.success(ApplicationChatRecordQuerySerializers(
data={**query_params_to_single_dict(request.query_params), 'application_id': application_id, data={**query_params_to_single_dict(request.query_params), 'application_id': application_id,

View File

@ -19,7 +19,8 @@ from common.constants.authentication_type import AuthenticationType
from common.constants.cache_version import Cache_Version from common.constants.cache_version import Cache_Version
from common.constants.permission_constants import Auth, PermissionConstants, ResourcePermissionGroup, \ from common.constants.permission_constants import Auth, PermissionConstants, ResourcePermissionGroup, \
get_permission_list_by_resource_group, ResourceAuthType, \ get_permission_list_by_resource_group, ResourceAuthType, \
ResourcePermissionRole, get_default_role_permission_mapping_list, get_default_workspace_user_role_mapping_list ResourcePermissionRole, get_default_role_permission_mapping_list, get_default_workspace_user_role_mapping_list, \
RoleConstants
from common.database_model_manage.database_model_manage import DatabaseModelManage from common.database_model_manage.database_model_manage import DatabaseModelManage
from common.exception.app_exception import AppAuthenticationFailed from common.exception.app_exception import AppAuthenticationFailed
from common.utils.common import group_by from common.utils.common import group_by
@ -50,6 +51,18 @@ def get_workspace_permission(permission_id, workspace_id):
return f"{permission_id}:/WORKSPACE/{workspace_id}" return f"{permission_id}:/WORKSPACE/{workspace_id}"
def get_role_permission(role, workspace_id):
"""
获取工作空间角色
@param role: 角色
@param workspace_id: 工作空间id
@return:
"""
if isinstance(role, RoleConstants):
role = role.value
return f"{role}:/WORKSPACE/{workspace_id}"
def get_workspace_permission_list(role_permission_mapping_dict, workspace_user_role_mapping_list): def get_workspace_permission_list(role_permission_mapping_dict, workspace_user_role_mapping_list):
""" """
获取工作空间下所有的权限 获取工作空间下所有的权限
@ -212,7 +225,7 @@ def get_role_list(user,
workspace_user_role_mapping_list] + [user.role], version=version) workspace_user_role_mapping_list] + [user.role], version=version)
else: else:
cache.set(key, [user.role], version=version) cache.set(key, [user.role], version=version)
return [user.role] return [user.role, get_role_permission(RoleConstants.WORKSPACE_MANAGE, 'default')]
return workspace_list return workspace_list

View File

@ -184,6 +184,10 @@ class Role:
def __eq__(self, other): def __eq__(self, other):
return str(self) == str(other) return str(self) == str(other)
def get_workspace_role(self):
return lambda r, kwargs: Role(self.name, self.decs, self.group,
resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}")
class RoleConstants(Enum): class RoleConstants(Enum):
ADMIN = Role("ADMIN", '超级管理员', RoleGroup.SYSTEM_USER) ADMIN = Role("ADMIN", '超级管理员', RoleGroup.SYSTEM_USER)

View File

@ -60,6 +60,17 @@ class CreateUserSerializer(serializers.Serializer):
phone = serializers.CharField(required=False, label=_('Phone')) phone = serializers.CharField(required=False, label=_('Phone'))
def is_workspace_manage(user_id: str, workspace_id: str):
workspace_user_role_mapping_model = DatabaseModelManage.get_model("workspace_user_role_mapping")
role_permission_mapping_model = DatabaseModelManage.get_model("role_permission_mapping_model")
is_x_pack_ee = workspace_user_role_mapping_model is not None and role_permission_mapping_model is not None
if is_x_pack_ee:
return QuerySet(workspace_user_role_mapping_model).select_related('role', 'user').filter(
workspace_id=workspace_id, user_id=user_id,
role_type=RoleConstants.WORKSPACE_MANAGE.value.__str__()).exists()
return QuerySet(User).filter(id=user_id, role=RoleConstants.ADMIN.value.__str__()).exists()
class UserProfileSerializer(serializers.Serializer): class UserProfileSerializer(serializers.Serializer):
@staticmethod @staticmethod
def profile(user: User, auth: Auth): def profile(user: User, auth: Auth):