shared_resource_auth.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. """
  2. @project: MaxKB-xpack-ee
  3. @Author: niu
  4. @file: shared_resource_auth.py
  5. @date: 2026/3/11 11:22
  6. @desc:
  7. """
  8. from typing import List
  9. from django.db.models import QuerySet
  10. from common.database_model_manage.database_model_manage import DatabaseModelManage
  11. from knowledge.models import Knowledge
  12. from tools.models import Tool
  13. def filter_authorized_ids(resource_type: str, ids: List[str], workspace_id: str) -> List[str]:
  14. """
  15. 通用授权过滤函数
  16. @param resource_type: 资源类型 ('model', 'tool', 'knowledge')
  17. @param ids: 待过滤的ID列表
  18. @param workspace_id: 工作空间ID
  19. @return: 授权通过的ID列表
  20. """
  21. if not ids:
  22. return []
  23. auth_func = DatabaseModelManage.get_model(f"get_authorized_{resource_type}")
  24. model_class = {'tool': Tool, 'knowledge': Knowledge}.get(resource_type)
  25. if model_class is None:
  26. return ids
  27. same_workspace_ids = list(
  28. QuerySet(model_class).filter(id__in=ids, workspace_id=workspace_id)
  29. .values_list('id', flat=True)
  30. )
  31. cross_workspace_ids = [i for i in ids if i not in set(map(str, same_workspace_ids))]
  32. authorized_ids = set(map(str, same_workspace_ids))
  33. if cross_workspace_ids and auth_func is not None:
  34. cross_queryset = QuerySet(model_class).filter(id__in=cross_workspace_ids)
  35. authorized = auth_func(cross_queryset, workspace_id)
  36. authorized_ids.update(str(r.id) for r in authorized)
  37. return [i for i in ids if i in authorized_ids]