file.py 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. # coding=utf-8
  2. from django.utils.translation import gettext_lazy as _
  3. from drf_spectacular.utils import extend_schema
  4. from rest_framework.parsers import MultiPartParser
  5. from rest_framework.views import APIView
  6. from rest_framework.views import Request
  7. from common.auth import TokenAuth, AllTokenAuth
  8. from common.constants.permission_constants import ChatAuth
  9. from common.log.log import log
  10. from common.result import result
  11. from knowledge.api.file import FileUploadAPI, FileGetAPI, GetUrlContentAPI
  12. from oss.serializers.file import FileSerializer, get_url_content
  13. class FileRetrievalView(APIView):
  14. @extend_schema(
  15. methods=['GET'],
  16. summary=_('Get file'),
  17. description=_('Get file'),
  18. operation_id=_('Get file'), # type: ignore
  19. parameters=FileGetAPI.get_parameters(),
  20. responses=FileGetAPI.get_response(),
  21. tags=[_('File')] # type: ignore
  22. )
  23. def get(self, request: Request, file_id: str):
  24. return FileSerializer.Operate(data={
  25. 'id': file_id,
  26. 'http_range': request.headers.get('Range', ''),
  27. }).get()
  28. class FileView(APIView):
  29. authentication_classes = [AllTokenAuth]
  30. parser_classes = [MultiPartParser]
  31. @extend_schema(
  32. methods=['POST'],
  33. summary=_('Upload file'),
  34. description=_('Upload file'),
  35. operation_id=_('Upload file'), # type: ignore
  36. parameters=FileUploadAPI.get_parameters(),
  37. request=FileUploadAPI.get_request(),
  38. responses=FileUploadAPI.get_response(),
  39. tags=[_('File')] # type: ignore
  40. )
  41. @log(menu='file', operate='Upload file')
  42. def post(self, request: Request):
  43. return result.success(FileSerializer(data={
  44. 'file': request.FILES.get('file'),
  45. 'source_id': request.data.get('source_id'),
  46. 'source_type': request.data.get('source_type'),
  47. }).upload())
  48. class Operate(APIView):
  49. authentication_classes = [TokenAuth]
  50. @extend_schema(
  51. methods=['DELETE'],
  52. summary=_('Delete file'),
  53. description=_('Delete file'),
  54. operation_id=_('Delete file'), # type: ignore
  55. parameters=FileGetAPI.get_parameters(),
  56. responses=FileGetAPI.get_response(),
  57. tags=[_('File')] # type: ignore
  58. )
  59. @log(menu='file', operate='Delete file')
  60. def delete(self, request: Request, file_id: str):
  61. return result.success(FileSerializer.Operate(data={'id': file_id}).delete())
  62. class GetUrlView(APIView):
  63. authentication_classes = [AllTokenAuth]
  64. @extend_schema(
  65. methods=['GET'],
  66. summary=_('Get url'),
  67. parameters=GetUrlContentAPI.get_parameters(),
  68. description=_('Get url'),
  69. operation_id=_('Get url'), # type: ignore
  70. tags=[_('Chat')] # type: ignore
  71. )
  72. def get(self, request: Request, application_id: str):
  73. if isinstance(request.auth, ChatAuth) and request.auth.application_id and str(
  74. request.auth.application_id) != application_id:
  75. return result.error(_('No permission'))
  76. url = request.query_params.get('url')
  77. result_data = get_url_content(url, application_id)
  78. return result.success(result_data)