| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- """
- @project: MaxKB-xpack-ee
- @Author: niu
- @file: shared_resource_auth.py
- @date: 2026/3/11 11:22
- @desc:
- """
- from typing import List
- from django.db.models import QuerySet
- from common.database_model_manage.database_model_manage import DatabaseModelManage
- from knowledge.models import Knowledge
- from tools.models import Tool
- def filter_authorized_ids(resource_type: str, ids: List[str], workspace_id: str) -> List[str]:
- """
- 通用授权过滤函数
- @param resource_type: 资源类型 ('model', 'tool', 'knowledge')
- @param ids: 待过滤的ID列表
- @param workspace_id: 工作空间ID
- @return: 授权通过的ID列表
- """
- if not ids:
- return []
- auth_func = DatabaseModelManage.get_model(f"get_authorized_{resource_type}")
- model_class = {'tool': Tool, 'knowledge': Knowledge}.get(resource_type)
- if model_class is None:
- return ids
- same_workspace_ids = list(
- QuerySet(model_class).filter(id__in=ids, workspace_id=workspace_id)
- .values_list('id', flat=True)
- )
- cross_workspace_ids = [i for i in ids if i not in set(map(str, same_workspace_ids))]
- authorized_ids = set(map(str, same_workspace_ids))
- if cross_workspace_ids and auth_func is not None:
- cross_queryset = QuerySet(model_class).filter(id__in=cross_workspace_ids)
- authorized = auth_func(cross_queryset, workspace_id)
- authorized_ids.update(str(r.id) for r in authorized)
- return [i for i in ids if i in authorized_ids]
|