Skip to content

Commit fc86fa3

Browse files
committed
Request body is now list of nodes
1 parent 7361cb9 commit fc86fa3

File tree

2 files changed

+60
-40
lines changed

2 files changed

+60
-40
lines changed

api/download.py

Lines changed: 54 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -318,42 +318,62 @@ def download(self):
318318

319319
def summary(self):
320320
"""Return a summary of what has been/will be downloaded based on a given query"""
321+
res = {}
321322
req = self.request.json_body
322-
req['_id'] = bson.ObjectId(req['_id'])
323-
level = req['level']
324-
325-
containers = ['projects', 'sessions', 'acquisitions']
326-
cont_query = {}
327-
if level == 'projects':
328-
# Grab sessions and their ids
329-
sessions = config.db.sessions.find({'project': req['_id']}, {'_id': 1})
330-
session_ids = [s['_id'] for s in sessions]
331-
332-
# for each type of container below it will have a slightly modified match query
333-
cont_query = {
334-
'projects': {'_id': req['_id']},
335-
'sessions': {'project': req['_id']},
336-
'acquisitions': {'session': {'$in': session_ids}}
337-
}
338-
elif level == 'sessions':
339-
340-
# for each type of container below it will have a slightly modified match query
341-
cont_query = {
342-
'sessions': {'_id': req['_id']},
343-
'acquisitions': {'session': req['_id']}
344-
}
345-
containers = containers[1:]
346-
elif level == 'acquisitions':
347-
348-
cont_query['acquisitions'] = {'_id': req['_id']}
349-
containers = containers[-1:]
350-
elif level == 'analyses':
351-
cont_query['analyses'] = {'_id': req['_id']}
352-
containers = ['analyses']
353-
else:
354-
self.abort(400, "{} not a recognized level".format(level))
323+
cont_query = {
324+
'projects': {'_id': {'$in':[]}},
325+
'sessions': {'_id': {'$in':[]}},
326+
'acquisitions': {'_id': {'$in':[]}},
327+
'analyses' : {'_id': {'$in':[]}}
328+
}
329+
for node in req:
330+
node['_id'] = bson.ObjectId(node['_id'])
331+
level = node['level']
332+
333+
containers = {'projects':0, 'sessions':0, 'acquisitions':0, 'analyses':0}
334+
335+
if level == 'project':
336+
# Grab sessions and their ids
337+
sessions = config.db.sessions.find({'project': node['_id']}, {'_id': 1})
338+
session_ids = [s['_id'] for s in sessions]
339+
acquisitions = config.db.acquisitions.find({'session': {'$in': session_ids}}, {'_id': 1})
340+
acquisition_ids = [a['_id'] for a in acquisitions]
341+
342+
containers['projects']=1
343+
containers['sessions']=1
344+
containers['acquisitions']=1
345+
346+
# for each type of container below it will have a slightly modified match query
347+
cont_query.get('projects',{}).get('_id',{}).get('$in').append(node['_id'])
348+
cont_query['sessions']['_id']['$in'] = cont_query['sessions']['_id']['$in'] + session_ids
349+
cont_query['acquisitions']['_id']['$in'] = cont_query['acquisitions']['_id']['$in'] + acquisition_ids
350+
351+
elif level == 'session':
352+
acquisitions = config.db.acquisitions.find({'session': node['_id']}, {'_id': 1})
353+
acquisition_ids = [a['_id'] for a in acquisitions]
354+
355+
356+
# for each type of container below it will have a slightly modified match query
357+
cont_query.get('sessions',{}).get('_id',{}).get('$in').append(node['_id'])
358+
cont_query['acquisitions']['_id']['$in'] = cont_query['acquisitions']['_id']['$in'] + acquisition_ids
359+
360+
containers['sessions']=1
361+
containers['acquisitions']=1
362+
363+
elif level == 'acquisition':
364+
365+
cont_query.get('acquisitions',{}).get('_id',{}).get('$in').append(node['_id'])
366+
containers['acquisitions']=1
367+
368+
elif level == 'analysis':
369+
cont_query.get('analyses',{}).get('_id',{}).get('$in').append(node['_id'])
370+
containers['analyses'] = 1
371+
372+
else:
373+
self.abort(400, "{} not a recognized level".format(level))
374+
375+
containers = [cont for cont in containers if containers[cont] == 1]
355376

356-
res = {}
357377
for cont_name in containers:
358378
# Aggregate file types
359379
pipeline = [

test/integration_tests/python/test_download.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -425,30 +425,30 @@ def test_summary(data_builder, as_admin, file_form):
425425

426426
missing_object_id = '000000000000000000000000'
427427

428-
r = as_admin.post('/download/summary', json={"level":"projects", "_id":project})
428+
r = as_admin.post('/download/summary', json=[{"level":"project", "_id":project}])
429429
assert r.ok
430430
assert len(r.json()) == 1
431431
assert r.json().get("csv", {}).get("count",0) == 4
432432

433-
r = as_admin.post('/download/summary', json={"level":"sessions", "_id":session})
433+
r = as_admin.post('/download/summary', json=[{"level":"session", "_id":session}])
434434
assert r.ok
435435
assert len(r.json()) == 1
436436
assert r.json().get("csv", {}).get("count",0) == 2
437437

438-
r = as_admin.post('/download/summary', json={"level":"acquisitions", "_id":acquisition})
438+
r = as_admin.post('/download/summary', json=[{"level":"acquisition", "_id":acquisition},{"level":"acquisition", "_id":acquisition2}])
439439
assert r.ok
440440
assert len(r.json()) == 1
441-
assert r.json().get("csv", {}).get("count",0) == 1
441+
assert r.json().get("csv", {}).get("count",0) == 2
442442

443-
r = as_admin.post('/download/summary', json={"level":"groups", "_id":missing_object_id})
443+
r = as_admin.post('/download/summary', json=[{"level":"group", "_id":missing_object_id}])
444444
assert r.status_code == 400
445445

446446
r = as_admin.post('/sessions/' + session + '/analyses', files=file_form(
447447
file_name, meta={'label': 'test', 'inputs':[{'name':file_name}]}))
448448
assert r.ok
449449
analysis = r.json()['_id']
450450

451-
r = as_admin.post('/download/summary', json={"level":"analyses", "_id":analysis})
451+
r = as_admin.post('/download/summary', json=[{"level":"analysis", "_id":analysis}])
452452
assert r.ok
453453
assert len(r.json()) == 1
454454
assert r.json().get("tabular data", {}).get("count",0) == 1

0 commit comments

Comments
 (0)