user_resource_permission.py 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529
  1. # coding=utf-8
  2. """
  3. @project: MaxKB
  4. @Author:虎虎
  5. @file: workspace_user_resource_permission.py
  6. @date:2025/4/28 17:17
  7. @desc:
  8. """
  9. import json
  10. import os
  11. from django.contrib.postgres.fields import ArrayField
  12. from django.core.cache import cache
  13. from django.db import models
  14. from django.db.models import QuerySet, Q, TextField
  15. from django.db.models.functions import Cast
  16. from django.utils.translation import gettext_lazy as _
  17. from rest_framework import serializers
  18. from application.models import Application
  19. from common.constants.cache_version import Cache_Version
  20. from common.constants.permission_constants import get_default_workspace_user_role_mapping_list, RoleConstants, \
  21. ResourcePermission, ResourcePermissionRole, ResourceAuthType
  22. from common.database_model_manage.database_model_manage import DatabaseModelManage
  23. from common.db.search import native_search, native_page_search, get_dynamics_model
  24. from common.db.sql_execute import select_list
  25. from common.exception.app_exception import AppApiException
  26. from common.utils.common import get_file_content
  27. from knowledge.models import Knowledge
  28. from maxkb.conf import PROJECT_DIR
  29. from maxkb.settings import edition
  30. from models_provider.models import Model
  31. from system_manage.models import WorkspaceUserResourcePermission
  32. from tools.models import Tool
  33. from users.serializers.user import is_workspace_manage
  34. class PermissionSerializer(serializers.Serializer):
  35. VIEW = serializers.BooleanField(required=True, label="可读")
  36. MANAGE = serializers.BooleanField(required=True, label="管理")
  37. ROLE = serializers.BooleanField(required=True, label="跟随角色")
  38. class UserResourcePermissionItemResponse(serializers.Serializer):
  39. id = serializers.UUIDField(required=True, label="主键id")
  40. name = serializers.CharField(required=True, label="资源名称")
  41. auth_target_type = serializers.CharField(required=True, label="授权资源")
  42. user_id = serializers.UUIDField(required=True, label="用户id")
  43. icon = serializers.CharField(required=True, label="资源图标")
  44. auth_type = serializers.CharField(required=True, label="授权类型")
  45. permission = serializers.ChoiceField(required=False, allow_null=True, allow_blank=True,
  46. choices=['NOT_AUTH', 'MANAGE', 'VIEW', 'ROLE'],
  47. label=_('permission'))
  48. class UserResourcePermissionResponse(serializers.Serializer):
  49. KNOWLEDGE = UserResourcePermissionItemResponse(many=True)
  50. class UpdateTeamMemberItemPermissionSerializer(serializers.Serializer):
  51. target_id = serializers.CharField(required=True, label=_('target id'))
  52. permission = serializers.ChoiceField(required=False, allow_null=True, allow_blank=True,
  53. choices=['NOT_AUTH', 'MANAGE', 'VIEW', 'ROLE'],
  54. label=_('permission'))
  55. class UpdateUserResourcePermissionRequest(serializers.Serializer):
  56. user_resource_permission_list = UpdateTeamMemberItemPermissionSerializer(required=True, many=True)
  57. def is_valid(self, *, auth_target_type=None, workspace_id=None, raise_exception=False):
  58. super().is_valid(raise_exception=True)
  59. user_resource_permission_list = [{'target_id': urp.get('target_id'), 'auth_target_type': auth_target_type} for
  60. urp in
  61. self.data.get("user_resource_permission_list")]
  62. illegal_target_id_list = select_list(
  63. get_file_content(
  64. os.path.join(PROJECT_DIR, "apps", "system_manage", 'sql', 'check_member_permission_target_exists.sql')),
  65. [json.dumps(user_resource_permission_list), workspace_id, workspace_id, workspace_id, workspace_id,
  66. workspace_id, workspace_id, workspace_id])
  67. if illegal_target_id_list is not None and len(illegal_target_id_list) > 0:
  68. raise AppApiException(500,
  69. _('Non-existent id')+'[' + str(illegal_target_id_list) + ']')
  70. m_map = {
  71. "KNOWLEDGE": Knowledge,
  72. 'TOOL': Tool,
  73. 'MODEL': Model,
  74. 'APPLICATION': Application,
  75. }
  76. sql_map = {
  77. "KNOWLEDGE": 'get_knowledge_user_resource_permission.sql',
  78. 'TOOL': 'get_tool_user_resource_permission.sql',
  79. 'MODEL': 'get_model_user_resource_permission.sql',
  80. 'APPLICATION': 'get_application_user_resource_permission.sql'
  81. }
  82. class UserResourcePermissionUserListRequest(serializers.Serializer):
  83. name = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_('resource name'))
  84. permission = serializers.MultipleChoiceField(required=False, allow_null=True, allow_blank=True,
  85. choices=['NOT_AUTH', 'MANAGE', 'VIEW', 'ROLE'],
  86. label=_('permission'))
  87. class UserResourcePermissionSerializer(serializers.Serializer):
  88. workspace_id = serializers.CharField(required=True, label=_('workspace id'))
  89. user_id = serializers.CharField(required=True, label=_('user id'))
  90. auth_target_type = serializers.CharField(required=True, label=_('resource'))
  91. def get_queryset(self, instance):
  92. resource_query_set = QuerySet(
  93. model=get_dynamics_model({
  94. 'name': models.CharField(),
  95. "permission": models.CharField(),
  96. }))
  97. name = instance.get('name')
  98. permission = instance.get('permission')
  99. query_p_list = [None if p == "NOT_AUTH" else p for p in permission]
  100. if name:
  101. resource_query_set = resource_query_set.filter(name__contains=name)
  102. if permission:
  103. if all([p is None for p in query_p_list]):
  104. resource_query_set = resource_query_set.filter(permission=None)
  105. else:
  106. if any([p is None for p in query_p_list]):
  107. resource_query_set = resource_query_set.filter(
  108. Q(permission__in=query_p_list) | Q(permission=None))
  109. else:
  110. resource_query_set = resource_query_set.filter(
  111. permission__in=query_p_list)
  112. return {
  113. 'query_set': QuerySet(m_map.get(self.data.get('auth_target_type'))).filter(
  114. workspace_id=self.data.get('workspace_id')),
  115. 'folder_query_set': QuerySet(m_map.get(self.data.get('auth_target_type'))).filter(
  116. workspace_id=self.data.get('workspace_id')),
  117. 'workspace_user_resource_permission_query_set': QuerySet(WorkspaceUserResourcePermission).filter(
  118. workspace_id=self.data.get('workspace_id'), user=self.data.get('user_id'),
  119. auth_target_type=self.data.get('auth_target_type')),
  120. 'resource_query_set': resource_query_set
  121. }
  122. def is_auth(self, resource_id: str):
  123. self.is_valid(raise_exception=True)
  124. auth_target_type = self.data.get('auth_target_type')
  125. workspace_id = self.data.get('workspace_id')
  126. user_id = self.data.get('user_id')
  127. workspace_manage = is_workspace_manage(user_id, workspace_id)
  128. if workspace_manage:
  129. return True
  130. wurp = QuerySet(WorkspaceUserResourcePermission).filter(auth_target_type=auth_target_type,
  131. workspace_id=workspace_id, user=user_id,
  132. target=resource_id).first()
  133. if wurp is None:
  134. return False
  135. workspace_user_role_mapping_model = DatabaseModelManage.get_model("workspace_user_role_mapping")
  136. role_permission_mapping_model = DatabaseModelManage.get_model("role_permission_mapping_model")
  137. if wurp.auth_type == ResourceAuthType.ROLE.value:
  138. if workspace_user_role_mapping_model and role_permission_mapping_model:
  139. inner = QuerySet(workspace_user_role_mapping_model).filter(workspace_id=workspace_id, user_id=user_id)
  140. return QuerySet(role_permission_mapping_model).filter(role_id__in=inner,
  141. permission_id=(
  142. auth_target_type + ':READ')).exists()
  143. else:
  144. return False
  145. else:
  146. return wurp.permission_list.__contains__(ResourcePermission.VIEW.value)
  147. def auth_resource_batch(self, resource_id_list: list):
  148. self.is_valid(raise_exception=True)
  149. auth_target_type = self.data.get('auth_target_type')
  150. workspace_id = self.data.get('workspace_id')
  151. user_id = self.data.get('user_id')
  152. wurp = QuerySet(WorkspaceUserResourcePermission).filter(auth_target_type=auth_target_type,
  153. workspace_id=workspace_id, user_id=user_id).first()
  154. auth_type = wurp.auth_type if wurp else (
  155. ResourceAuthType.RESOURCE_PERMISSION_GROUP if edition == 'CE' else ResourceAuthType.ROLE)
  156. workspace_user_resource_permission = [WorkspaceUserResourcePermission(
  157. target=resource_id,
  158. auth_target_type=auth_target_type,
  159. permission_list=[ResourcePermission.VIEW,
  160. ResourcePermission.MANAGE] if auth_type == ResourceAuthType.RESOURCE_PERMISSION_GROUP else [
  161. ResourcePermissionRole.ROLE],
  162. workspace_id=workspace_id,
  163. user_id=user_id,
  164. auth_type=auth_type
  165. ) for resource_id in resource_id_list]
  166. QuerySet(WorkspaceUserResourcePermission).bulk_create(workspace_user_resource_permission)
  167. # 刷新缓存
  168. version = Cache_Version.PERMISSION_LIST.get_version()
  169. key = Cache_Version.PERMISSION_LIST.get_key(user_id=user_id)
  170. cache.delete(key, version=version)
  171. return True
  172. def auth_resource(self, resource_id: str, is_folder=False):
  173. self.is_valid(raise_exception=True)
  174. auth_target_type = self.data.get('auth_target_type')
  175. workspace_id = self.data.get('workspace_id')
  176. user_id = self.data.get('user_id')
  177. WorkspaceUserResourcePermission(
  178. target=resource_id,
  179. auth_target_type=auth_target_type,
  180. permission_list=[ResourcePermission.VIEW,
  181. ResourcePermission.MANAGE],
  182. workspace_id=workspace_id,
  183. user_id=user_id,
  184. auth_type=ResourceAuthType.RESOURCE_PERMISSION_GROUP
  185. ).save()
  186. # 刷新缓存
  187. version = Cache_Version.PERMISSION_LIST.get_version()
  188. key = Cache_Version.PERMISSION_LIST.get_key(user_id=user_id)
  189. cache.delete(key, version=version)
  190. return True
  191. def list(self, instance, user, with_valid=True):
  192. if with_valid:
  193. self.is_valid(raise_exception=True)
  194. UserResourcePermissionUserListRequest(data=instance).is_valid(raise_exception=True)
  195. workspace_id = self.data.get("workspace_id")
  196. user_id = self.data.get("user_id")
  197. # 用户权限列表
  198. user_resource_permission_list = native_search(self.get_queryset(instance), get_file_content(
  199. os.path.join(PROJECT_DIR, "apps", "system_manage", 'sql', sql_map.get(self.data.get('auth_target_type')))))
  200. return [{**user_resource_permission}
  201. for user_resource_permission in user_resource_permission_list]
  202. def page(self, instance, current_page: int, page_size: int, user, with_valid=True):
  203. if with_valid:
  204. self.is_valid(raise_exception=True)
  205. UserResourcePermissionUserListRequest(data=instance).is_valid(raise_exception=True)
  206. workspace_id = self.data.get("workspace_id")
  207. user_id = self.data.get("user_id")
  208. # 用户对应的资源权限分页列表
  209. user_resource_permission_page_list = native_page_search(current_page, page_size, self.get_queryset(instance),
  210. get_file_content(
  211. os.path.join(PROJECT_DIR, "apps", "system_manage",
  212. 'sql', sql_map.get(
  213. self.data.get('auth_target_type')))
  214. ))
  215. return user_resource_permission_page_list
  216. def edit(self, instance, user, with_valid=True):
  217. if with_valid:
  218. self.is_valid(raise_exception=True)
  219. UpdateUserResourcePermissionRequest(data={'user_resource_permission_list': instance}).is_valid(
  220. raise_exception=True,
  221. auth_target_type=self.data.get(
  222. 'auth_target_type'),
  223. workspace_id=self.data.get('workspace_id'))
  224. workspace_id = self.data.get("workspace_id")
  225. user_id = self.data.get("user_id")
  226. update_list = []
  227. save_list = []
  228. targets = [item['target_id'] for item in instance]
  229. QuerySet(WorkspaceUserResourcePermission).filter(
  230. workspace_id=workspace_id,
  231. user_id=user_id,
  232. auth_target_type=self.data.get('auth_target_type'),
  233. target__in=targets
  234. ).delete()
  235. workspace_user_resource_permission_exist_list = []
  236. for user_resource_permission in instance:
  237. permission = user_resource_permission['permission']
  238. auth_type, permission_list = permission_map[permission]
  239. exist_list = [user_resource_permission_exist for user_resource_permission_exist in
  240. workspace_user_resource_permission_exist_list if
  241. user_resource_permission.get('target_id') == str(user_resource_permission_exist.target)]
  242. if len(exist_list) > 0:
  243. exist_list[0].permission_list = [key for key in user_resource_permission.get('permission').keys() if
  244. user_resource_permission.get('permission').get(key)]
  245. exist_list[0].auth_type = user_resource_permission.get('auth_type')
  246. update_list.append(exist_list[0])
  247. else:
  248. save_list.append(WorkspaceUserResourcePermission(target=user_resource_permission.get('target_id'),
  249. auth_target_type=self.data.get('auth_target_type'),
  250. permission_list=permission_list,
  251. workspace_id=workspace_id,
  252. user_id=user_id,
  253. auth_type=auth_type))
  254. # 批量更新
  255. QuerySet(WorkspaceUserResourcePermission).bulk_update(update_list, ['permission_list', 'auth_type']) if len(
  256. update_list) > 0 else None
  257. # 批量插入
  258. QuerySet(WorkspaceUserResourcePermission).bulk_create(save_list) if len(save_list) > 0 else None
  259. version = Cache_Version.PERMISSION_LIST.get_version()
  260. key = Cache_Version.PERMISSION_LIST.get_key(user_id=user_id)
  261. cache.delete(key, version=version)
  262. return instance
  263. class ResourceUserPermissionUserListRequest(serializers.Serializer):
  264. nick_name = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_('workspace id'))
  265. username = serializers.CharField(required=False, allow_null=True, allow_blank=True, label=_('workspace id'))
  266. permission = serializers.MultipleChoiceField(required=False, allow_null=True, allow_blank=True,
  267. choices=['NOT_AUTH', 'MANAGE', 'VIEW', 'ROLE'],
  268. label=_('permission'))
  269. class ResourceUserPermissionEditRequest(serializers.Serializer):
  270. user_id = serializers.CharField(required=True, label=_('workspace id'))
  271. permission = serializers.ChoiceField(required=True, choices=['NOT_AUTH', 'MANAGE', 'VIEW', 'ROLE'],
  272. label=_('permission'))
  273. permission_map = {
  274. "ROLE": ("ROLE", ["ROLE"]),
  275. "MANAGE": ("RESOURCE_PERMISSION_GROUP", ["MANAGE", "VIEW"]),
  276. "VIEW": ("RESOURCE_PERMISSION_GROUP", ["VIEW"]),
  277. "NOT_AUTH": ("RESOURCE_PERMISSION_GROUP", []),
  278. }
  279. class ResourceUserPermissionSerializer(serializers.Serializer):
  280. workspace_id = serializers.CharField(required=True, label=_('workspace id'))
  281. target = serializers.CharField(required=True, label=_('resource id'))
  282. auth_target_type = serializers.CharField(required=True, label=_('resource'))
  283. users_permission = ResourceUserPermissionEditRequest(required=False, many=True, label=_('users_permission'))
  284. RESOURCE_MODEL_MAP = {
  285. 'APPLICATION': Application,
  286. 'KNOWLEDGE': Knowledge,
  287. 'TOOL': Tool
  288. }
  289. def get_queryset(self, instance, is_x_pack_ee: bool):
  290. user_query_set = QuerySet(model=get_dynamics_model({
  291. 'nick_name': models.CharField(),
  292. 'username': models.CharField(),
  293. "permission": models.CharField(),
  294. "u.id": models.UUIDField(),
  295. "role": models.CharField(),
  296. "role_setting.type": models.CharField(),
  297. "user_role_relation.workspace_id": models.CharField(),
  298. 'tmp.type_list': ArrayField(models.CharField()),
  299. 'tmp.role_name_list_str': models.CharField()
  300. }))
  301. nick_name = instance.get('nick_name')
  302. username = instance.get('username')
  303. role_name = instance.get('role')
  304. permission = instance.get('permission')
  305. query_p_list = [None if p == "NOT_AUTH" else p for p in permission]
  306. workspace_user_resource_permission_query_set = QuerySet(WorkspaceUserResourcePermission).filter(
  307. workspace_id=self.data.get('workspace_id'),
  308. auth_target_type=self.data.get('auth_target_type'),
  309. target=self.data.get('target'))
  310. if nick_name:
  311. user_query_set = user_query_set.filter(nick_name__contains=nick_name)
  312. if username:
  313. user_query_set = user_query_set.filter(username__contains=username)
  314. if permission:
  315. if all([p is None for p in query_p_list]):
  316. user_query_set = user_query_set.filter(
  317. permission=None)
  318. else:
  319. if any([p is None for p in query_p_list]):
  320. user_query_set = user_query_set.filter(
  321. Q(permission__in=query_p_list) | Q(permission=None))
  322. else:
  323. user_query_set = user_query_set.filter(
  324. permission__in=query_p_list)
  325. workspace_user_role_mapping_model = DatabaseModelManage.get_model("workspace_user_role_mapping")
  326. if workspace_user_role_mapping_model:
  327. user_query_set = user_query_set.filter(
  328. **{"u.id__in": QuerySet(workspace_user_role_mapping_model).filter(
  329. workspace_id=self.data.get('workspace_id')).values("user_id")})
  330. if is_x_pack_ee:
  331. user_query_set = user_query_set.filter(**{
  332. "tmp.type_list__contains": ["USER"]
  333. })
  334. role_name_and_type_query_set = QuerySet(model=get_dynamics_model({
  335. 'user_role_relation.workspace_id': models.CharField(),
  336. 'role_setting.type': models.CharField(),
  337. })).filter(**{
  338. "user_role_relation.workspace_id": self.data.get('workspace_id'),
  339. "role_setting.type": "USER",
  340. })
  341. if role_name:
  342. user_query_set = user_query_set.filter(
  343. **{'tmp.role_name_list_str__icontains': str(role_name)}
  344. )
  345. return {
  346. 'workspace_user_resource_permission_query_set': workspace_user_resource_permission_query_set,
  347. 'user_query_set': user_query_set,
  348. 'role_name_and_type_query_set': role_name_and_type_query_set
  349. }
  350. else:
  351. user_query_set = user_query_set.filter(
  352. **{'role': "USER"})
  353. return {
  354. 'workspace_user_resource_permission_query_set': workspace_user_resource_permission_query_set,
  355. 'user_query_set': user_query_set
  356. }
  357. def list(self, instance, with_valid=True):
  358. if with_valid:
  359. self.is_valid(raise_exception=True)
  360. ResourceUserPermissionUserListRequest(data=instance).is_valid(raise_exception=True)
  361. is_x_pack_ee = self.is_x_pack_ee()
  362. # 资源的用户授权列表
  363. resource_user_permission_list = native_search(self.get_queryset(instance, is_x_pack_ee), get_file_content(
  364. os.path.join(PROJECT_DIR, "apps", "system_manage",
  365. 'sql',
  366. ('get_resource_user_permission_detail_ee.sql' if is_x_pack_ee else
  367. 'get_resource_user_permission_detail.sql')
  368. )
  369. ))
  370. return resource_user_permission_list
  371. @staticmethod
  372. def is_x_pack_ee():
  373. workspace_user_role_mapping_model = DatabaseModelManage.get_model("workspace_user_role_mapping")
  374. role_permission_mapping_model = DatabaseModelManage.get_model("role_permission_mapping_model")
  375. return workspace_user_role_mapping_model is not None and role_permission_mapping_model is not None
  376. def page(self, instance, current_page: int, page_size: int, with_valid=True):
  377. if with_valid:
  378. self.is_valid(raise_exception=True)
  379. ResourceUserPermissionUserListRequest(data=instance).is_valid(raise_exception=True)
  380. # 分页列表
  381. is_x_pack_ee = self.is_x_pack_ee()
  382. resource_user_permission_page_list = native_page_search(current_page, page_size,
  383. self.get_queryset(instance, is_x_pack_ee),
  384. get_file_content(
  385. os.path.join(PROJECT_DIR, "apps", "system_manage",
  386. 'sql',
  387. (
  388. 'get_resource_user_permission_detail_ee.sql' if is_x_pack_ee else
  389. 'get_resource_user_permission_detail.sql')
  390. )
  391. ))
  392. return resource_user_permission_page_list
  393. def get_has_manage_permission_resource_under_folders(self, current_user_id, folder_ids):
  394. workspace_id = self.data.get("workspace_id")
  395. auth_target_type = self.data.get("auth_target_type")
  396. workspace_manage = is_workspace_manage(current_user_id, workspace_id)
  397. resource_model = self.RESOURCE_MODEL_MAP[auth_target_type]
  398. from folders.serializers.folder import has_exact_permission_by_role
  399. permission_id = f"{auth_target_type}:READ+AUTH"
  400. if workspace_manage:
  401. role_type = RoleConstants.WORKSPACE_MANAGE.value.__str__()
  402. has_user_role_exact_permission = has_exact_permission_by_role(current_user_id, workspace_id, permission_id,role_type)
  403. if has_user_role_exact_permission:
  404. current_user_managed_resources_ids = QuerySet(resource_model).filter(workspace_id=workspace_id,
  405. folder__in=folder_ids).annotate(
  406. id_str=Cast('id', TextField())
  407. ).values_list("id_str", flat=True)
  408. else:
  409. current_user_managed_resources_ids = []
  410. else:
  411. role_type = RoleConstants.USER.value.__str__()
  412. has_user_role_exact_permission = has_exact_permission_by_role(current_user_id, workspace_id, permission_id,role_type)
  413. permission_list = ['MANAGE']
  414. if has_user_role_exact_permission:
  415. permission_list = ['MANAGE','ROLE']
  416. current_user_managed_resources_ids = QuerySet(WorkspaceUserResourcePermission).filter(
  417. workspace_id=workspace_id, user_id=current_user_id, auth_target_type=auth_target_type,
  418. target__in=QuerySet(resource_model).filter(workspace_id=workspace_id, folder__in=folder_ids).annotate(
  419. id_str=Cast('id', TextField())
  420. ).values_list("id_str", flat=True),
  421. permission_list__overlap= permission_list).values_list('target', flat=True)
  422. return current_user_managed_resources_ids
  423. def edit(self, instance, with_valid=True, current_user_id=None):
  424. if with_valid:
  425. self.is_valid(raise_exception=True)
  426. ResourceUserPermissionEditRequest(data=instance, many=True).is_valid(
  427. raise_exception=True)
  428. workspace_id = self.data.get("workspace_id")
  429. target = self.data.get("target")
  430. auth_target_type = self.data.get("auth_target_type")
  431. users_permission = instance
  432. users_id = [item["user_id"] for item in users_permission]
  433. include_children = users_permission[0].get('include_children')
  434. folder_ids = users_permission[0].get('folder_ids')
  435. # 删除已存在的对应的用户在该资源下的权限
  436. if include_children:
  437. managed_resource_ids = list(
  438. self.get_has_manage_permission_resource_under_folders(current_user_id, folder_ids,)) + folder_ids
  439. else:
  440. managed_resource_ids = [target]
  441. QuerySet(WorkspaceUserResourcePermission).filter(
  442. workspace_id=workspace_id,
  443. target__in=managed_resource_ids,
  444. auth_target_type=auth_target_type,
  445. user_id__in=users_id
  446. ).delete()
  447. save_list = [
  448. WorkspaceUserResourcePermission(
  449. target=resource_id,
  450. auth_target_type=auth_target_type,
  451. workspace_id=workspace_id,
  452. auth_type=permission_map[item['permission']][0],
  453. user_id=item["user_id"],
  454. permission_list=permission_map[item['permission']][1]
  455. )
  456. for resource_id in managed_resource_ids
  457. for item in users_permission
  458. ]
  459. if save_list:
  460. QuerySet(WorkspaceUserResourcePermission).bulk_create(save_list)
  461. version = Cache_Version.PERMISSION_LIST.get_version()
  462. for user_id in users_id:
  463. key = Cache_Version.PERMISSION_LIST.get_key(user_id=user_id)
  464. cache.delete(key, version=version)
  465. return instance