def find(self, resource, req, lookup): """ Called to execute a search against the AAP Mulitmedia API. It attempts to translate the search request passed in req to a suitable form for a search request against the API. It parses the response into a suitable ElasticCursor, the front end will never know. :param resource: :param req: :param lookup: :return: """ if self._headers is None: self.__set_auth_cookie(self._app) url = self._app.config['AAP_MM_SEARCH_URL'] + '/Assets/search' query_keywords = '*:*' if 'query' in req['query']['filtered']: query_keywords = req['query']['filtered']['query']['query_string']['query'] query_keywords = query_keywords.replace('slugline:', 'objectname:') query_keywords = query_keywords.replace('description_text:', 'captionabstract:') fields = {} for criterion in req.get('post_filter', {}).get('and', {}): # parse out the date range if possible if 'range' in criterion: start = None end = None daterange = None if 'firstcreated' in criterion.get('range', {}): if 'gte' in criterion['range']['firstcreated']: start = criterion['range']['firstcreated']['gte'][0:10] if 'lte' in criterion['range']['firstcreated']: end = criterion['range']['firstcreated']['lte'][0:10] # if there is a special start and no end it's one of the date buttons if start and not end: if start == 'now-24H': daterange = {'Dates': ['[NOW/HOUR-24HOURS TO NOW/HOUR]']} if start == 'now-1w': daterange = {'Dates': ['[NOW/DAY-7DAYS TO NOW/DAY]']} if start == 'now-1M': daterange = {'Dates': ['[NOW/DAY-1MONTH TO NOW/DAY]']} # we've got something but no daterange set above if (start or end) and not daterange: daterange = {'DateRange': [{'Start': start, 'End': end}], 'DateCreatedFilter': 'true'} if daterange: fields.update(daterange) if 'terms' in criterion: if 'type' in criterion.get('terms', {}): fields.update({'MediaTypes': criterion['terms']['type']}) if 'credit' in criterion.get('terms', {}): fields.update({'Credits': criterion['terms']['credit']}) if 'anpa_category.name' in criterion.get('terms', {}): cat_list = [] for cat in criterion['terms']['anpa_category.name']: qcode = [key for key, value in subject_codes.items() if value == cat] if qcode: for code in qcode: cat_list.append(code) else: cat_list.append(cat) fields.update({'Categories': cat_list}) size = int(req.get('size', '25')) if int(req.get('size', '25')) > 0 else 25 query = {'Query': query_keywords, 'pageSize': str(size), 'pageNumber': str(int(req.get('from', '0')) // size + 1)} r = self._http.urlopen('POST', url + '?' + urllib.parse.urlencode(query), body=json.dumps(fields), headers=self._headers) hits = self._parse_hits(json.loads(r.data.decode('UTF-8'))) return ElasticCursor(docs=hits['docs'], hits={'hits': hits, 'aggregations': self._parse_aggregations(hits)})
def find(self, resource, req, lookup): """ Called to execute a search against the AAP Mulitmedia API. It attempts to translate the search request passed in req to a suitable form for a search request against the API. It parses the response into a suitable ElasticCursor, the front end will never know. :param resource: :param req: :param lookup: :return: """ if self._headers is None: self.__set_auth_cookie(self._app) url = self._app.config['AAP_MM_SEARCH_URL'] + '/Assets/search' query_keywords = '*:*' if 'query' in req['query']['filtered']: query_keywords = req['query']['filtered']['query']['query_string'][ 'query'] query_keywords = query_keywords.replace('slugline:', 'objectname:') query_keywords = query_keywords.replace('description:', 'captionabstract:') fields = {} for criterion in req.get('post_filter', {}).get('and', {}): # parse out the date range if possible if 'range' in criterion: start = None end = None daterange = None if 'firstcreated' in criterion.get('range', {}): if 'gte' in criterion['range']['firstcreated']: start = criterion['range']['firstcreated']['gte'][0:10] if 'lte' in criterion['range']['firstcreated']: end = criterion['range']['firstcreated']['lte'][0:10] # if there is a special start and no end it's one of the date buttons if start and not end: if start == 'now-24H': daterange = { 'Dates': ['[NOW/HOUR-24HOURS TO NOW/HOUR]'] } if start == 'now-1w': daterange = {'Dates': ['[NOW/DAY-7DAYS TO NOW/DAY]']} if start == 'now-1M': daterange = {'Dates': ['[NOW/DAY-1MONTH TO NOW/DAY]']} # we've got something but no daterange set above if (start or end) and not daterange: daterange = { 'DateRange': [{ 'Start': start, 'End': end }], 'DateCreatedFilter': 'true' } if daterange: fields.update(daterange) if 'terms' in criterion: if 'type' in criterion.get('terms', {}): fields.update({'MediaTypes': criterion['terms']['type']}) if 'credit' in criterion.get('terms', {}): fields.update({'Credits': criterion['terms']['credit']}) if 'anpa_category.name' in criterion.get('terms', {}): cat_list = [] for cat in criterion['terms']['anpa_category.name']: qcode = [ key for key, value in subject_codes.items() if value == cat ] if qcode: for code in qcode: cat_list.append(code) else: cat_list.append(cat) fields.update({'Categories': cat_list}) size = int(req.get('size', '25')) if int(req.get('size', '25')) > 0 else 25 query = { 'Query': query_keywords, 'pageSize': str(size), 'pageNumber': str(int(req.get('from', '0')) // size + 1) } r = self._http.urlopen('POST', url + '?' + urllib.parse.urlencode(query), body=json.dumps(fields), headers=self._headers) hits = self._parse_hits(json.loads(r.data.decode('UTF-8'))) return ElasticCursor(docs=hits['docs'], hits={ 'hits': hits, 'aggregations': self._parse_aggregations(hits) })
def test_all_subjects_map_to_a_media_topic(self): for (k, v) in sorted(subject_codes.items()): topic = self.topics.get_media_topic(k) self.assertIsNotNone(topic)