folder.py 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. from django.db.models import QuerySet
  2. from django.utils.translation import gettext_lazy as _
  3. from drf_spectacular.utils import extend_schema
  4. from rest_framework.request import Request
  5. from rest_framework.views import APIView
  6. from common.auth import TokenAuth
  7. from common.auth.authentication import has_permissions
  8. from common.constants.permission_constants import Permission, Group, Operate, RoleConstants, ViewPermission, \
  9. PermissionConstants, CompareConstants
  10. from common.log.log import log
  11. from common.result import result
  12. from folders.api.folder import FolderCreateAPI, FolderEditAPI, FolderReadAPI, FolderTreeReadAPI, FolderDeleteAPI
  13. from folders.serializers.folder import FolderSerializer, FolderTreeSerializer, get_folder_type
  14. def get_folder_operation_object(folder_id, source):
  15. Folder = get_folder_type(source)
  16. folder_model = QuerySet(model=Folder).filter(id=folder_id).first()
  17. if folder_model is not None:
  18. return {
  19. 'name': folder_model.name
  20. }
  21. return {}
  22. class FolderView(APIView):
  23. authentication_classes = [TokenAuth]
  24. @extend_schema(
  25. methods=['POST'],
  26. description=_('Create folder'),
  27. summary=_('Create folder'),
  28. operation_id=_('Create folder'), # type: ignore
  29. parameters=FolderCreateAPI.get_parameters(),
  30. request=FolderCreateAPI.get_request(),
  31. responses=FolderCreateAPI.get_response(),
  32. tags=[_('Folder')] # type: ignore
  33. )
  34. @has_permissions(
  35. lambda r, kwargs: Permission(group=Group(f"{kwargs.get('source')}_FOLDER"), operate=Operate.CREATE,
  36. resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}/{kwargs.get('source')}/{r.data.get('parent_id')}"),
  37. lambda r, kwargs: Permission(group=Group(f"{kwargs.get('source')}_FOLDER"), operate=Operate.CREATE,
  38. resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}:ROLE/WORKSPACE_MANAGE"
  39. ),
  40. lambda r, kwargs: ViewPermission([RoleConstants.USER.get_workspace_role()],
  41. [Permission(group=Group(f"{kwargs.get('source')}_FOLDER"),
  42. operate=Operate.EDIT,
  43. resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}/{kwargs.get('source')}/{r.data.get('parent_id')}"
  44. )], CompareConstants.AND),
  45. RoleConstants.WORKSPACE_MANAGE.get_workspace_role()
  46. )
  47. @log(
  48. menu='folder', operate='Create folder',
  49. get_operation_object=lambda r, k: {'name': r.data.get('name')},
  50. )
  51. def post(self, request: Request, workspace_id: str, source: str):
  52. return result.success(FolderSerializer.Create(
  53. data={'user_id': request.user.id,
  54. 'source': source,
  55. 'workspace_id': workspace_id}
  56. ).insert(request.data))
  57. @extend_schema(
  58. methods=['GET'],
  59. description=_('Get folder tree'),
  60. summary=_('Get folder tree'),
  61. operation_id=_('Get folder tree'), # type: ignore
  62. parameters=FolderTreeReadAPI.get_parameters(),
  63. responses=FolderTreeReadAPI.get_response(),
  64. tags=[_('Folder')] # type: ignore
  65. )
  66. @has_permissions(
  67. lambda r, kwargs: Permission(group=Group(f"{kwargs.get('source')}_WORKSPACE_USER_RESOURCE_PERMISSION"),
  68. operate=Operate.READ,
  69. resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}"),
  70. lambda r, kwargs: Permission(group=Group(kwargs.get('source')), operate=Operate.READ,
  71. resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}"),
  72. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), RoleConstants.USER.get_workspace_role(),
  73. RoleConstants.ADMIN, RoleConstants.EXTENDS_ADMIN
  74. )
  75. def get(self, request: Request, workspace_id: str, source: str):
  76. return result.success(FolderTreeSerializer(
  77. data={'workspace_id': workspace_id, 'source': source}
  78. ).get_folder_tree(request.user, request.query_params.get('name')))
  79. class Operate(APIView):
  80. authentication_classes = [TokenAuth]
  81. @extend_schema(
  82. methods=['PUT'],
  83. description=_('Update folder'),
  84. summary=_('Update folder'),
  85. operation_id=_('Update folder'), # type: ignore
  86. parameters=FolderEditAPI.get_parameters(),
  87. request=FolderEditAPI.get_request(),
  88. responses=FolderEditAPI.get_response(),
  89. tags=[_('Folder')] # type: ignore
  90. )
  91. @has_permissions(
  92. lambda r, kwargs: Permission(group=Group(f"{kwargs.get('source')}_FOLDER"), operate=Operate.EDIT,
  93. resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}:ROLE/WORKSPACE_MANAGE"
  94. ),
  95. lambda r, kwargs: Permission(group=Group(f"{kwargs.get('source')}_FOLDER"), operate=Operate.EDIT,
  96. resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}/{kwargs.get('source')}/{kwargs.get('folder_id')}"
  97. ),
  98. lambda r, kwargs: ViewPermission([RoleConstants.USER.get_workspace_role()],
  99. [Permission(group=Group(f"{kwargs.get('source')}_FOLDER"),
  100. operate=Operate.EDIT,
  101. resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}/{kwargs.get('source')}/{kwargs.get('folder_id')}"
  102. )], CompareConstants.AND),
  103. RoleConstants.WORKSPACE_MANAGE.get_workspace_role()
  104. )
  105. @log(
  106. menu='folder', operate='Edit folder',
  107. get_operation_object=lambda r, k: get_folder_operation_object(k.get('folder_id'), k.get('source')),
  108. )
  109. def put(self, request: Request, workspace_id: str, source: str, folder_id: str):
  110. return result.success(FolderSerializer.Operate(
  111. data={'id': folder_id, 'workspace_id': workspace_id, 'source': source, 'user_id': request.user.id}
  112. ).edit(request.data))
  113. @extend_schema(
  114. methods=['GET'],
  115. description=_('Get folder'),
  116. summary=_('Get folder'),
  117. operation_id=_('Get folder'), # type: ignore
  118. parameters=FolderReadAPI.get_parameters(),
  119. responses=FolderReadAPI.get_response(),
  120. tags=[_('Folder')] # type: ignore
  121. )
  122. @has_permissions(
  123. lambda r, kwargs: Permission(group=Group(kwargs.get('source')), operate=Operate.READ,
  124. resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}"),
  125. RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), RoleConstants.USER.get_workspace_role(),
  126. RoleConstants.ADMIN, RoleConstants.EXTENDS_ADMIN
  127. )
  128. def get(self, request: Request, workspace_id: str, source: str, folder_id: str):
  129. return result.success(FolderSerializer.Operate(
  130. data={'id': folder_id, 'workspace_id': workspace_id, 'source': source, 'user_id': request.user.id}
  131. ).one())
  132. @extend_schema(
  133. methods=['DELETE'],
  134. description=_('Delete folder'),
  135. summary=_('Delete folder'),
  136. operation_id=_('Delete folder'), # type: ignore
  137. parameters=FolderDeleteAPI.get_parameters(),
  138. responses=FolderDeleteAPI.get_response(),
  139. tags=[_('Folder')] # type: ignore
  140. )
  141. @has_permissions(
  142. lambda r, kwargs: Permission(group=Group(f"{kwargs.get('source')}_FOLDER"), operate=Operate.DELETE,
  143. resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}:ROLE/WORKSPACE_MANAGE"
  144. ),
  145. lambda r, kwargs: Permission(group=Group(f"{kwargs.get('source')}_FOLDER"), operate=Operate.DELETE,
  146. resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}/{kwargs.get('source')}/{kwargs.get('folder_id')}"
  147. ),
  148. lambda r, kwargs: ViewPermission([RoleConstants.USER.get_workspace_role()],
  149. [Permission(group=Group(f"{kwargs.get('source')}_FOLDER"),
  150. operate=Operate.DELETE,
  151. resource_path=f"/WORKSPACE/{kwargs.get('workspace_id')}/{kwargs.get('source')}/{kwargs.get('folder_id')}"
  152. )], CompareConstants.AND),
  153. RoleConstants.WORKSPACE_MANAGE.get_workspace_role()
  154. )
  155. @log(
  156. menu='folder', operate='Delete folder',
  157. get_operation_object=lambda r, k: get_folder_operation_object(k.get('folder_id'), k.get('source')),
  158. )
  159. def delete(self, request: Request, workspace_id: str, source: str, folder_id: str):
  160. return result.success(FolderSerializer.Operate(
  161. data={'id': folder_id, 'workspace_id': workspace_id, 'source': source, 'user_id': request.user.id}
  162. ).delete())