@@ -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 = [
0 commit comments