diff options
author | BonfaceKilz | 2021-02-16 22:17:41 +0300 |
---|---|---|
committer | BonfaceKilz | 2021-02-16 22:19:31 +0300 |
commit | 0a70905e5b16e372bea9fd3e13a16fbd9152a416 (patch) | |
tree | a13894ad650e64c7a86a26c7d5ae1a198565c0aa /gn3 | |
parent | 53d81e0d9f66f09b63e5b36bd33c79e8bc930215 (diff) | |
download | genenetwork3-0a70905e5b16e372bea9fd3e13a16fbd9152a416.tar.gz |
Add procedure for uploading gzipped file
* gn3/file_utils.py (extract_uploaded_file): New procedure.
* tests/unit/test_file_utils.py: Test cases for ^^.
* tests/unit/upload-data.tar.gz: New test data.
Diffstat (limited to 'gn3')
-rw-r--r-- | gn3/file_utils.py | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/gn3/file_utils.py b/gn3/file_utils.py index a6929e1..d9301bb 100644 --- a/gn3/file_utils.py +++ b/gn3/file_utils.py @@ -2,9 +2,12 @@ import hashlib import json import os +import shutil +import tarfile from functools import partial from typing import Dict +from werkzeug.utils import secure_filename from gn3.settings import APP_DEFAULTS @@ -46,3 +49,29 @@ def jsonfile_to_dict(json_file: str) -> Dict: data = json.load(_file) return data raise FileNotFoundError + + +def extract_uploaded_file(gzipped_file, target_dir: str) -> Dict: + """Get the (directory) hash of extracted contents of GZIPPED_FILE; and move +contents to TARGET_DIR/<dir-hash>. + + """ + tar_target_loc = os.path.join(target_dir, + secure_filename(gzipped_file.filename)) + gzipped_file.save(tar_target_loc) + try: + # Extract to "tar_target_loc/tempdir" + tar = tarfile.open(tar_target_loc) + tar.extractall( + path=os.path.join(target_dir, "tempdir")) + tar.close() + # pylint: disable=W0703 + except Exception: + return {"status": 128, "error": "gzip failed to unpack file"} + dir_hash = get_dir_hash(tar_target_loc) + if os.path.exists(os.path.join(target_dir, dir_hash)): + shutil.rmtree(os.path.join(target_dir, 'tempdir')) + else: + os.rename(os.path.join(target_dir, "tempdir"), + os.path.join(target_dir, dir_hash)) + return {"status": 0, "token": dir_hash} |