diff --git a/api/handlers/searchhandler.py b/api/handlers/searchhandler.py index e1c515225b348201b6ee9032864dc7c6c85bc931..67247932fa4585e7654c18b951a68b5dcd4bb02e 100644 --- a/api/handlers/searchhandler.py +++ b/api/handlers/searchhandler.py @@ -8,9 +8,10 @@ from ..search import pathparser, queryprocessor, es_query log = config.log -parent_container = { +parent_container_dict = { 'acquisitions': 'sessions', - 'sessions': 'projects' + 'sessions': 'projects', + 'projects': 'groups', } class SearchHandler(base.RequestHandler): @@ -79,7 +80,37 @@ class SearchHandler(base.RequestHandler): queries['collections'] = queries.get('collections', {"match_all": {}}) target_paths = pathparser.PathParser(path).paths search = queryprocessor.PreparedSearch(target_paths, queries, all_data, self.uid) - return search.process_search() + results = search.process_search() + self.search_containers = search.search_containers + for result_type, results_for_type in results.iteritems(): + for result in results_for_type: + self._augment_result(result, result_type) + return results + + def _augment_result(self, result, result_type): + if result_type in ['files', 'notes']: + container = result['_source'].pop('container') + container_name = result['_source']['container_name'] + result['_source'][container_name[:-1]] = container + else: + container = result['_source'] + container_name = result_type + result['_source'].update(self._get_parents(container, container_name)) + + + def _get_parents(self, container, cont_name): + parents = {} + if cont_name == 'groups': + container.pop('roles', None) + else: + container.pop('permissions', None) + if parent_container_dict.get(cont_name): + parent_name = parent_container_dict[cont_name] + parent_id = container[parent_name[:-1]] + parent_container = self.search_containers[parent_name].results[parent_id]['_source'] + parents[parent_name[:-1]] = parent_container + parents.update(self._get_parents(parent_container, parent_name)) + return parents def get_datatree(self, **kwargs): @@ -116,11 +147,16 @@ class SearchHandler(base.RequestHandler): cont_name = result['container_name'] container = config.db[cont_name].find_one({'_id': cont_id}) result[cont_name[:-1]] = container - while parent_container.get(cont_name): - parent_cont_name = parent_container[cont_name] - parent_id = bson.objectid.ObjectId(container[parent_cont_name[:-1]]) + while parent_container_dict.get(cont_name): + parent_cont_name = parent_container_dict[cont_name] + parent_id = container[parent_cont_name[:-1]] + if parent_cont_name != 'groups': + parent_id = bson.objectid.ObjectId(parent_id) container = config.db[parent_cont_name].find_one({'_id': parent_id}) - container.pop('permissions') + if parent_cont_name == 'groups': + container.pop('roles', None) + else: + container.pop('permissions', None) result[parent_cont_name[:-1]] = container cont_name = parent_cont_name if collection: