user_resource_permission.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. # coding=utf-8
  2. """
  3. @project: MaxKB
  4. @Author:虎虎
  5. @file: workspace_user_resource_permission.py
  6. @date:2025/4/28 16:38
  7. @desc:
  8. """
  9. from django.db.models import QuerySet
  10. from django.utils.translation import gettext_lazy as _
  11. from drf_spectacular.utils import extend_schema
  12. from rest_framework.request import Request
  13. from rest_framework.views import APIView
  14. from common import result
  15. from common.auth import TokenAuth
  16. from common.auth.authentication import has_permissions
  17. from common.constants.permission_constants import RoleConstants, Permission, Group, Operate, ViewPermission, \
  18. CompareConstants
  19. from common.log.log import log
  20. from system_manage.api.user_resource_permission import UserResourcePermissionAPI, EditUserResourcePermissionAPI, \
  21. ResourceUserPermissionAPI, ResourceUserPermissionPageAPI, ResourceUserPermissionEditAPI, \
  22. UserResourcePermissionPageAPI
  23. from system_manage.serializers.user_resource_permission import UserResourcePermissionSerializer, \
  24. ResourceUserPermissionSerializer
  25. from users.models import User
  26. def get_user_operation_object(user_id):
  27. user_model = QuerySet(model=User).filter(id=user_id).first()
  28. if user_model is not None:
  29. return {
  30. "name": user_model.username
  31. }
  32. return {}
  33. class WorkSpaceUserResourcePermissionView(APIView):
  34. authentication_classes = [TokenAuth]
  35. @extend_schema(
  36. methods=['GET'],
  37. description=_('Obtain resource authorization list'),
  38. operation_id=_('Obtain resource authorization list'), # type: ignore
  39. parameters=UserResourcePermissionAPI.get_parameters(),
  40. responses=UserResourcePermissionAPI.get_response(),
  41. tags=[_('Resources authorization')] # type: ignore
  42. )
  43. @has_permissions(
  44. lambda r, kwargs: Permission(group=Group(kwargs.get('resource') + '_WORKSPACE_USER_RESOURCE_PERMISSION'),
  45. operate=Operate.READ),
  46. RoleConstants.ADMIN, RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
  47. def get(self, request: Request, workspace_id: str, user_id: str, resource: str):
  48. return result.success(UserResourcePermissionSerializer(
  49. data={'workspace_id': workspace_id, 'user_id': user_id, 'auth_target_type': resource}
  50. ).list({'name': request.query_params.get('name'),
  51. 'permission': request.query_params.getlist('permission[]')}, request.user))
  52. @extend_schema(
  53. methods=['PUT'],
  54. description=_('Modify the resource authorization list'),
  55. operation_id=_('Modify the resource authorization list'), # type: ignore
  56. parameters=EditUserResourcePermissionAPI.get_parameters(),
  57. request=EditUserResourcePermissionAPI.get_request(),
  58. responses=EditUserResourcePermissionAPI.get_response(),
  59. tags=[_('Resources authorization')] # type: ignore
  60. )
  61. @log(menu='System', operate='Modify the resource authorization list',
  62. get_operation_object=lambda r, k: get_user_operation_object(k.get('user_id'))
  63. )
  64. @has_permissions(
  65. lambda r, kwargs: Permission(group=Group(kwargs.get('resource') + '_WORKSPACE_USER_RESOURCE_PERMISSION'),
  66. operate=Operate.EDIT),
  67. RoleConstants.ADMIN, RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
  68. def put(self, request: Request, workspace_id: str, user_id: str, resource: str):
  69. return result.success(UserResourcePermissionSerializer(
  70. data={'workspace_id': workspace_id, 'user_id': user_id, 'auth_target_type': resource}
  71. ).edit(request.data, request.user))
  72. class Page(APIView):
  73. authentication_classes = [TokenAuth]
  74. @extend_schema(
  75. methods=['GET'],
  76. description=_('Obtain resource authorization list by page'),
  77. summary=_('Obtain resource authorization list by page'),
  78. operation_id=_('Obtain resource authorization list by page'), # type: ignore
  79. request=None,
  80. parameters=UserResourcePermissionPageAPI.get_parameters(),
  81. responses=UserResourcePermissionPageAPI.get_response(),
  82. tags=[_('Resources authorization')] # type: ignore
  83. )
  84. @has_permissions(
  85. lambda r, kwargs: Permission(group=Group(kwargs.get('resource') + '_WORKSPACE_USER_RESOURCE_PERMISSION'),
  86. operate=Operate.READ),
  87. RoleConstants.ADMIN, RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
  88. def get(self, request: Request, workspace_id: str, user_id: str, resource: str, current_page: str,
  89. page_size: str):
  90. return result.success(UserResourcePermissionSerializer(
  91. data={'workspace_id': workspace_id, 'user_id': user_id, 'auth_target_type': resource}
  92. ).page({'name': request.query_params.get('name'),
  93. 'permission': request.query_params.getlist('permission[]')}, current_page, page_size, request.user))
  94. class WorkspaceResourceUserPermissionView(APIView):
  95. authentication_classes = [TokenAuth]
  96. @extend_schema(
  97. methods=['GET'],
  98. description=_('Get user authorization status of resource'),
  99. summary=_('Get user authorization status of resource'),
  100. operation_id=_('Get user authorization status of resource'), # type: ignore
  101. parameters=ResourceUserPermissionAPI.get_parameters(),
  102. responses=ResourceUserPermissionAPI.get_response(),
  103. tags=[_('Resources authorization')] # type: ignore
  104. )
  105. @has_permissions(
  106. lambda r, kwargs: Permission(group=Group(kwargs.get('resource')),
  107. operate=Operate.AUTH,
  108. resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}:ROLE/WORKSPACE_MANAGE"),
  109. lambda r, kwargs: Permission(group=Group(kwargs.get('resource')),
  110. operate=Operate.AUTH,
  111. resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}/{kwargs.get('resource').replace('_FOLDER','')}/{kwargs.get('target')}"),
  112. ViewPermission([RoleConstants.USER.get_workspace_role()],
  113. [lambda r, kwargs: Permission(group=Group(kwargs.get('resource').replace('_FOLDER','')),
  114. operate=Operate.SELF,
  115. resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}/{kwargs.get('resource').replace('_FOLDER','')}/{kwargs.get('target')}")],
  116. CompareConstants.AND),
  117. RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
  118. def get(self, request: Request, workspace_id: str, target: str, resource: str):
  119. return result.success(ResourceUserPermissionSerializer(
  120. data={'workspace_id': workspace_id, "target": target, 'auth_target_type': resource.replace('_FOLDER',''),
  121. }).list(
  122. {'username': request.query_params.get("username"),
  123. 'role': request.query_params.get("role"),
  124. 'nick_name': request.query_params.get("nick_name"),
  125. 'permission': request.query_params.getlist("permission[]")
  126. }))
  127. @extend_schema(
  128. methods=['PUT'],
  129. description=_('Edit user authorization status of resource'),
  130. summary=_('Edit user authorization status of resource'),
  131. operation_id=_('Edit user authorization status of resource'), # type: ignore
  132. parameters=ResourceUserPermissionEditAPI.get_parameters(),
  133. request=ResourceUserPermissionEditAPI.get_request(),
  134. responses=ResourceUserPermissionEditAPI.get_response(),
  135. tags=[_('Resources authorization')] # type: ignore
  136. )
  137. @log(menu='System', operate='Edit user authorization status of resource',
  138. get_operation_object=lambda r, k: get_user_operation_object(k.get('user_id'))
  139. )
  140. @has_permissions(
  141. lambda r, kwargs: Permission(group=Group(kwargs.get('resource')),
  142. operate=Operate.AUTH,
  143. resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}:ROLE/WORKSPACE_MANAGE"),
  144. lambda r, kwargs: Permission(group=Group(kwargs.get('resource')),
  145. operate=Operate.AUTH,
  146. resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}/{kwargs.get('resource').replace('_FOLDER','')}/{kwargs.get('target')}"),
  147. ViewPermission([RoleConstants.USER.get_workspace_role()],
  148. [lambda r, kwargs: Permission(group=Group(kwargs.get('resource').replace('_FOLDER','')),
  149. operate=Operate.SELF,
  150. resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}/{kwargs.get('resource').replace('_FOLDER','')}/{kwargs.get('target')}")],
  151. CompareConstants.AND),
  152. RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
  153. def put(self, request: Request, workspace_id: str, target: str, resource: str):
  154. return result.success(ResourceUserPermissionSerializer(
  155. data={'workspace_id': workspace_id, "target": target, 'auth_target_type': resource.replace('_FOLDER',''), })
  156. .edit(instance=request.data, current_user_id=request.user.id))
  157. class Page(APIView):
  158. authentication_classes = [TokenAuth]
  159. @extend_schema(
  160. methods=['GET'],
  161. description=_('Get user authorization status of resource by page'),
  162. summary=_('Get user authorization status of resource by page'),
  163. operation_id=_('Get user authorization status of resource by page'), # type: ignore
  164. parameters=ResourceUserPermissionPageAPI.get_parameters(),
  165. responses=ResourceUserPermissionPageAPI.get_response(),
  166. tags=[_('Resources authorization')] # type: ignore
  167. )
  168. @has_permissions(
  169. lambda r, kwargs: Permission(group=Group(kwargs.get('resource')),
  170. operate=Operate.AUTH,
  171. resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}:ROLE/WORKSPACE_MANAGE"),
  172. lambda r, kwargs: Permission(group=Group(kwargs.get('resource')),
  173. operate=Operate.AUTH,
  174. resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}/{kwargs.get('resource').replace('_FOLDER','')}/{kwargs.get('target')}"),
  175. ViewPermission([RoleConstants.USER.get_workspace_role()],
  176. [lambda r, kwargs: Permission(group=Group(kwargs.get('resource').replace('_FOLDER','')),
  177. operate=Operate.SELF,
  178. resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}/{kwargs.get('resource').replace('_FOLDER','')}/{kwargs.get('target')}")],
  179. CompareConstants.AND),
  180. RoleConstants.WORKSPACE_MANAGE.get_workspace_role())
  181. def get(self, request: Request, workspace_id: str, target: str, resource: str, current_page: int,
  182. page_size: int):
  183. return result.success(ResourceUserPermissionSerializer(
  184. data={'workspace_id': workspace_id, "target": target, 'auth_target_type': resource.replace('_FOLDER',''), }
  185. ).page({'username': request.query_params.get("username"),
  186. 'role': request.query_params.get("role"),
  187. 'nick_name': request.query_params.get("nick_name"),
  188. 'permission': request.query_params.getlist("permission[]")}, current_page, page_size,
  189. ))