def _do_create_multipart_upload( workflow: Workflow, wf_module: WfModule, filename: str ) -> Dict[str, str]: key = _generate_key(wf_module, filename) with workflow.cooperative_lock(): wf_module.refresh_from_db() wf_module.abort_inprogress_upload() # in case there is one already upload_id = minio.create_multipart_upload(minio.UserFilesBucket, key, filename) wf_module.inprogress_file_upload_id = upload_id wf_module.inprogress_file_upload_key = key wf_module.inprogress_file_upload_last_accessed_at = timezone.now() wf_module.save( update_fields=['inprogress_file_upload_id', 'inprogress_file_upload_key', 'inprogress_file_upload_last_accessed_at'] ) return {'key': key, 'uploadId': upload_id}
def _write_uploaded_file_and_clear_inprogress_file_upload( wf_module: WfModule ) -> UploadedFile: """ Read metadata from S3; write it to a new UploadedFile; save `wf_module`. Raise FileNotFoundError if `wf_module.inprogress_file_upload_key is None` or the file does not exist on minio. Assumptions: * You hold a cooperative lock on `wf_module.workflow`. * The client PUT a sensible Content-Disposition header. (Failure means icky filename, not crash.) """ key = wf_module.inprogress_file_upload_key uuid: str = key.split('/')[-1].split('.')[0] # TODO raise FileNotFoundError head = minio.client.head_object(Bucket=minio.UserFilesBucket, Key=key) size = int(head['ContentLength']) name = urllib.parse.unquote(head['ContentDisposition'].split("UTF-8''")[-1]) uploaded_file = wf_module.uploaded_files.create( name=name, size=size, uuid=uuid, bucket=minio.UserFilesBucket, key=key, ) wf_module.inprogress_file_upload_id = None wf_module.inprogress_file_upload_key = None wf_module.inprogress_file_upload_last_accessed_at = None wf_module.save( update_fields=['inprogress_file_upload_id', 'inprogress_file_upload_key', 'inprogress_file_upload_last_accessed_at'] ) return uploaded_file
def _do_prepare_upload( workflow: Workflow, wf_module: WfModule, filename: str, n_bytes: int, base64Md5sum: str, ) -> Dict[str, str]: key = _generate_key(wf_module, filename) with workflow.cooperative_lock(): wf_module.refresh_from_db() wf_module.abort_inprogress_upload() url, headers = minio.presign_upload(minio.UserFilesBucket, key, filename, n_bytes, base64Md5sum) wf_module.inprogress_file_upload_id = None wf_module.inprogress_file_upload_key = key wf_module.inprogress_file_upload_last_accessed_at = timezone.now() wf_module.save( update_fields=['inprogress_file_upload_id', 'inprogress_file_upload_key', 'inprogress_file_upload_last_accessed_at'] ) return {'key': key, 'url': url, 'headers': headers}