Beispiel #1
0
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}
Beispiel #2
0
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
Beispiel #3
0
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}