0003_alter_workspaceuserresourcepermission_target.py 4.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. # Generated by Django 5.2.6 on 2025-10-11 02:54
  2. from concurrent.futures import ThreadPoolExecutor
  3. from functools import reduce
  4. from django.db import migrations, models
  5. from django.db.models import QuerySet
  6. from common.constants.permission_constants import WorkspaceUserRoleMapping
  7. from common.utils.common import group_by
  8. def workspace_user_role_mapping_model_exists(workspace_user_role_mapping_model):
  9. try:
  10. QuerySet(workspace_user_role_mapping_model).first()
  11. except Exception as e:
  12. return False
  13. return False
  14. def delete_auth(apps,folder_model):
  15. workspace_user_resource_permission_model = apps.get_model('system_manage', 'WorkspaceUserResourcePermission')
  16. QuerySet(workspace_user_resource_permission_model).filter(target__in=QuerySet(folder_model).values_list('id')).delete()
  17. def get_workspace_user_resource_permission_list(apps, auth_target_type, workspace_user_role_mapping_model_workspace_dict,
  18. folder_model):
  19. workspace_user_resource_permission_model = apps.get_model('system_manage', 'WorkspaceUserResourcePermission')
  20. return reduce(lambda x, y: [*x, *y], [
  21. [workspace_user_resource_permission_model(target=f.id, workspace_id=f.workspace_id, user_id=wurm.user_id,
  22. auth_target_type=auth_target_type, auth_type="RESOURCE_PERMISSION_GROUP",
  23. permission_list=['VIEW','MANAGE'] if wurm.user_id == f.user_id else ['VIEW']) for wurm in
  24. workspace_user_role_mapping_model_workspace_dict.get(f.workspace_id, [])] for f in
  25. QuerySet(folder_model).all()], [])
  26. def auth_folder(apps, schema_editor):
  27. from common.database_model_manage.database_model_manage import DatabaseModelManage
  28. DatabaseModelManage.init()
  29. user_model = apps.get_model('users', 'User')
  30. application_folder_model = apps.get_model('application', 'ApplicationFolder')
  31. knowledge_folder_model = apps.get_model('knowledge', 'KnowledgeFolder')
  32. tool_folder_model = apps.get_model('tools', 'ToolFolder')
  33. workspace_user_resource_permission_model = apps.get_model('system_manage', 'WorkspaceUserResourcePermission')
  34. workspace_user_role_mapping_model = DatabaseModelManage.get_model("workspace_user_role_mapping")
  35. with ThreadPoolExecutor(max_workers=3) as executor:
  36. future = executor.submit(workspace_user_role_mapping_model_exists, workspace_user_role_mapping_model)
  37. exists = future.result()
  38. if not exists:
  39. workspace_user_role_mapping_model = None
  40. if workspace_user_role_mapping_model is None:
  41. workspace_user_role_mapping_model_workspace_dict = {
  42. 'default': [WorkspaceUserRoleMapping('default', '', u.id) for u in QuerySet(user_model).all()]}
  43. else:
  44. workspace_user_role_mapping_model_workspace_dict = group_by(
  45. [v for v in {str(wurm.user_id) + str(wurm.workspace_id): wurm for wurm in
  46. QuerySet(workspace_user_role_mapping_model)}.values()],
  47. lambda item: item.workspace_id)
  48. workspace_user_resource_permission_list = get_workspace_user_resource_permission_list(apps,"APPLICATION",
  49. workspace_user_role_mapping_model_workspace_dict,
  50. application_folder_model)
  51. workspace_user_resource_permission_list += get_workspace_user_resource_permission_list(apps,"TOOL",
  52. workspace_user_role_mapping_model_workspace_dict,
  53. tool_folder_model)
  54. workspace_user_resource_permission_list += get_workspace_user_resource_permission_list(apps,"KNOWLEDGE",
  55. workspace_user_role_mapping_model_workspace_dict,
  56. knowledge_folder_model)
  57. delete_auth(apps,application_folder_model)
  58. delete_auth(apps,knowledge_folder_model)
  59. delete_auth(apps,tool_folder_model)
  60. QuerySet(workspace_user_resource_permission_model).bulk_create(workspace_user_resource_permission_list)
  61. class Migration(migrations.Migration):
  62. dependencies = [
  63. ('system_manage', '0002_refresh_collation_reindex'),
  64. ('tools', '0001_initial'),
  65. ('application', '0001_initial'),
  66. ('knowledge', '0001_initial'),
  67. ]
  68. operations = [
  69. migrations.AlterField(
  70. model_name='workspaceuserresourcepermission',
  71. name='target',
  72. field=models.CharField(db_index=True, max_length=128, verbose_name='知识库/应用id'),
  73. ),
  74. migrations.RunPython(auth_folder, atomic=False)
  75. ]