diff --git a/api/download.py b/api/download.py index dac01f5bc03356903e0971c92bc164e825f1719c..c5d54c16c7e889888ce4e8022ec19bb97357e00c 100644 --- a/api/download.py +++ b/api/download.py @@ -49,7 +49,10 @@ class Download(base.RequestHandler): if optional or not f.get('optional', False): filepath = os.path.join(data_path, util.path_from_hash(f['hash'])) if os.path.exists(filepath): # silently skip missing files - targets.append((filepath, prefix + '/' + f['name'], cont_name, str(container.get('_id')),f['size'])) + if cont_name == 'analyses': + targets.append((filepath, prefix + '/' + ('input' if f.get('input') else 'output') + '/' + f['name'], cont_name, str(container.get('_id')),f['size'])) + else: + targets.append((filepath, prefix + '/' + f['name'], cont_name, str(container.get('_id')),f['size'])) total_size += f['size'] total_cnt += 1 return total_size, total_cnt diff --git a/api/handlers/refererhandler.py b/api/handlers/refererhandler.py index f4033ffc0a71bf2a46b5b32813b9c0c5ae4ff5e0..2a6260a4d13981d1ba180c5536e1601084cb8736 100644 --- a/api/handlers/refererhandler.py +++ b/api/handlers/refererhandler.py @@ -378,7 +378,7 @@ class AnalysesHandler(RefererHandler): filepath = os.path.join(data_path, util.path_from_hash(f['hash'])) if os.path.exists(filepath): # silently skip missing files targets.append((filepath, - util.sanitize_string_to_filename(analysis['label']) + '/' + f['name'], + util.sanitize_string_to_filename(analysis['label']) + '/' + ('input' if f.get('input') else 'output') + '/'+ f['name'], 'analyses', analysis['_id'], f['size'])) total_size += f['size'] total_cnt += 1 diff --git a/test/integration_tests/python/test_download.py b/test/integration_tests/python/test_download.py index f4a1970e28bf839db8f8a9c0ec2fea73ce2a2274..c770a1ff177144e86109e52f0145a64789d101dc 100644 --- a/test/integration_tests/python/test_download.py +++ b/test/integration_tests/python/test_download.py @@ -200,26 +200,74 @@ def test_filelist_download(data_builder, file_form, as_admin): assert r.ok -def test_analysis_download(data_builder, file_form, as_admin): +def test_analysis_download(data_builder, file_form, as_admin, default_payload): session = data_builder.create_session() + acquisition = data_builder.create_acquisition() + gear_doc = default_payload['gear']['gear'] + gear_doc['inputs'] = { + 'csv': { + 'base': 'file' + }, + 'zip': { + 'base': 'file' + } + } + gear = data_builder.create_gear(gear=gear_doc) + + + assert as_admin.post('/acquisitions/' + acquisition + '/files', files=file_form('one.csv')).ok + assert as_admin.post('/acquisitions/' + acquisition + '/files', files=file_form('two.zip')).ok + zip_cont = cStringIO.StringIO() with zipfile.ZipFile(zip_cont, 'w') as zip_file: zip_file.writestr('two.csv', 'sample\ndata\n') zip_cont.seek(0) - analysis = as_admin.post('/sessions/' + session + '/analyses', files=file_form( + + # analysis for testing most of the download functionality + # analysis_files and new_analysis_files refer to this analyisis + analysis1 = as_admin.post('/sessions/' + session + '/analyses', files=file_form( 'one.csv', ('two.zip', zip_cont), meta={'label': 'test', 'inputs': [{'name': 'one.csv'}, {'name': 'two.csv'}]} )).json()['_id'] - analysis_files = '/sessions/' + session + '/analyses/' + analysis + '/files' - new_analysis_files = '/analyses/' + analysis + '/files' + # Analyis Only for testing that inputs are in their own folder + r = as_admin.post('/sessions/' + session + '/analyses', + json={ + 'analysis': {'label': 'test'}, + 'job': { + 'gear_id': gear, + 'inputs': { + 'csv': { + 'name': 'one.csv', + 'type': 'acquisition', + 'id': acquisition + }, + 'zip': { + 'name': 'two.zip', + 'type': 'acquisition', + 'id': acquisition + } + } + } + }, + params={'job':True} + ) + assert r.ok + analysis = r.json()['_id'] + analysis_files = '/sessions/' + session + '/analyses/' + analysis1 + '/files' + new_analysis_files = '/analyses/' + analysis1 + '/files' + + # Check that analysis files are labelled as inputs + r = as_admin.get('/sessions/' + session + '/analyses/' + analysis) + assert r.ok + assert r.json().get('files')[0].get('input') # try to download analysis files w/ non-existent ticket r = as_admin.get(analysis_files, params={'ticket': '000000000000000000000000'}) assert r.status_code == 404 # get analysis batch download ticket for all files - r = as_admin.get(analysis_files, params={'ticket': ''}, json={"optional":True,"nodes":[{"level":"analysis","_id":analysis}]}) + r = as_admin.get(analysis_files, params={'ticket': ''}, json={"optional":True,"nodes":[{"level":"analysis","_id":analysis1}]}) assert r.ok ticket = r.json()['ticket'] @@ -258,6 +306,7 @@ def test_analysis_download(data_builder, file_form, as_admin): assert len(members) == 2 for tarinfo in members: assert os.path.basename(tarinfo.name) in ['one.csv', 'two.zip'] + assert 'input' in tarinfo.name tar.close() @@ -347,6 +396,13 @@ def test_analysis_download(data_builder, file_form, as_admin): r = as_admin.get(new_analysis_files + '/two.zip', params={'ticket': ticket, 'member': 'two.csv'}) assert r.ok + + # delete session analysis (job) + r = as_admin.delete('/sessions/' + session + '/analyses/' + analysis) + assert r.ok + r = as_admin.delete('/sessions/' + session + '/analyses/' + analysis1) + assert r.ok + def test_filters(data_builder, file_form, as_admin): project = data_builder.create_project()