file.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. from flask import current_app, request
  2. from flask_login import current_user
  3. from flask_restful import Resource, marshal_with
  4. import services
  5. from controllers.console import api
  6. from controllers.console.datasets.error import (
  7. FileTooLargeError,
  8. NoFileUploadedError,
  9. TooManyFilesError,
  10. UnsupportedFileTypeError,
  11. )
  12. from controllers.console.setup import setup_required
  13. from controllers.console.wraps import account_initialization_required, cloud_edition_billing_resource_check
  14. from fields.file_fields import file_fields, upload_config_fields
  15. from libs.login import login_required
  16. from services.file_service import ALLOWED_EXTENSIONS, UNSTRUCTURED_ALLOWED_EXTENSIONS, FileService
  17. PREVIEW_WORDS_LIMIT = 3000
  18. class FileApi(Resource):
  19. @setup_required
  20. @login_required
  21. @account_initialization_required
  22. @marshal_with(upload_config_fields)
  23. def get(self):
  24. file_size_limit = current_app.config.get("UPLOAD_FILE_SIZE_LIMIT")
  25. batch_count_limit = current_app.config.get("UPLOAD_FILE_BATCH_LIMIT")
  26. image_file_size_limit = current_app.config.get("UPLOAD_IMAGE_FILE_SIZE_LIMIT")
  27. return {
  28. 'file_size_limit': file_size_limit,
  29. 'batch_count_limit': batch_count_limit,
  30. 'image_file_size_limit': image_file_size_limit
  31. }, 200
  32. @setup_required
  33. @login_required
  34. @account_initialization_required
  35. @marshal_with(file_fields)
  36. @cloud_edition_billing_resource_check(resource='documents')
  37. def post(self):
  38. # get file from request
  39. file = request.files['file']
  40. # check file
  41. if 'file' not in request.files:
  42. raise NoFileUploadedError()
  43. if len(request.files) > 1:
  44. raise TooManyFilesError()
  45. try:
  46. upload_file = FileService.upload_file(file, current_user)
  47. except services.errors.file.FileTooLargeError as file_too_large_error:
  48. raise FileTooLargeError(file_too_large_error.description)
  49. except services.errors.file.UnsupportedFileTypeError:
  50. raise UnsupportedFileTypeError()
  51. return upload_file, 201
  52. class FilePreviewApi(Resource):
  53. @setup_required
  54. @login_required
  55. @account_initialization_required
  56. def get(self, file_id):
  57. file_id = str(file_id)
  58. text = FileService.get_file_preview(file_id)
  59. return {'content': text}
  60. class FileSupportTypeApi(Resource):
  61. @setup_required
  62. @login_required
  63. @account_initialization_required
  64. def get(self):
  65. etl_type = current_app.config['ETL_TYPE']
  66. allowed_extensions = UNSTRUCTURED_ALLOWED_EXTENSIONS if etl_type == 'Unstructured' else ALLOWED_EXTENSIONS
  67. return {'allowed_extensions': allowed_extensions}
  68. api.add_resource(FileApi, '/files/upload')
  69. api.add_resource(FilePreviewApi, '/files/<uuid:file_id>/preview')
  70. api.add_resource(FileSupportTypeApi, '/files/support-type')