def _parse_query_facets(self, facet_items): ''' Parses query facet counts like this: { 'min_price_USD_exact:[2001 TO *]': 306, 'duration_exact:[16 TO 25]': 149, 'min_price_USD_exact:[500 TO 1000]': 195, 'duration_exact:[41 TO *]': 35, 'duration_exact:[26 TO 40]': 52, 'min_price_USD_exact:[0 TO 500]': 88, 'duration_exact:[6 TO 10]': 329, 'min_price_USD_exact:[1001 TO 2000]': 292, 'duration_exact:[11 TO 15]': 256, 'duration_exact:[* TO 5]': 205 } Returns a list of Facet objects (one per parsed field name). ''' facets = {} for field_query, count in facet_items.iteritems(): field, sep, query = field_query.partition(':') field = field.replace('_exact', '') if field in facets: facet = facets[field] else: facet = QueryFacet(field=field, label=field.replace('_', ' ').title()) facets[field] = facet item = FacetItem(query, count, label=humanize_range(query)) item.is_selected = self._is_selected_facet(field, item.value) item.facet = facet facet.items.append(item) return [facet for field, facet in facets.iteritems()]
def _parse_query_facets(self, facet_items): ''' Parses query facet counts like this: { 'min_price_USD_exact:[2001 TO *]': 306, 'duration_exact:[16 TO 25]': 149, 'min_price_USD_exact:[500 TO 1000]': 195, 'duration_exact:[41 TO *]': 35, 'duration_exact:[26 TO 40]': 52, 'min_price_USD_exact:[0 TO 500]': 88, 'duration_exact:[6 TO 10]': 329, 'min_price_USD_exact:[1001 TO 2000]': 292, 'duration_exact:[11 TO 15]': 256, 'duration_exact:[* TO 5]': 205 } Returns a list of Facet objects (one per parsed field name). ''' facets = {} for field_query, count in facet_items.iteritems(): field, sep, query = field_query.partition(':') field = field.replace('_exact', '') if field in facets: facet = facets[field] else: facet = QueryFacet(field=field, label=field.replace('_', ' ').title()) facets[field] = facet item = FacetItem(query, count, label=humanize_range(query)) item.is_selected = self._is_selected_facet(field, item.value) item.facet = facet facet.items.append(item) return [facet for field,facet in facets.iteritems()]
def test_creates_date_label_from_query(self): self.assertEqual( FacetItem.date_label_from_query(self.date_query), 'Dec 1, 2012 to Dec 15, 2012' ) self.assertEqual( FacetItem.date_label_from_query('This Is Not A Range'), 'This Is Not A Range' )
def test_creates_price_label_from_query(self): currency = CurrencyFactory.build( code='GBP', html_symbol='£' ) self.assertEqual( FacetItem.price_label_from_query(self.price_query), '$500 to 1000' ) self.assertEqual( FacetItem.price_label_from_query(self.price_query_wildcard), '$0 to %s' % str(settings.PRICE_FACET_MAX) ) self.assertEqual( FacetItem.price_label_from_query(self.price_query, currency), '£500 to 1000' )
def _parse_field_facets(self, facet_items): ''' Parses field facet counts like this: {'region': [('South America', 222), ('Asia', 134), ('Antarctica', 10), ('South Pacific', 2)], 'service_level': [('Standard', 351), ('Basic', 202), ('Comfort', 93), ('Superior', 25)],} ''' facets = [] for field, counts in facet_items.iteritems(): conf = self.field_facets[field] label = conf.get('label', field.replace('_', ' ').title()) facet = Facet(field=field, label=label) for count in counts: item = FacetItem(count[0], count[1]) item.is_selected = self._is_selected_facet(field, item.value) item.facet = facet facet.items.append(item) facets.append(facet) return facets
def _parse_date_facets(self, facet_items): ''' Parse date faceted fields like: {'departure_dates': {'2010-04-24T18:17:03Z': 105, '2010-05-01T00:00:00Z': 323, '2010-06-01T00:00:00Z': 334, '2010-07-01T00:00:00Z': 468, '2010-08-01T00:00:00Z': 504, '2010-09-01T00:00:00Z': 515, '2010-10-01T00:00:00Z': 519, '2010-11-01T00:00:00Z': 478, '2010-12-01T00:00:00Z': 457, '2011-01-01T00:00:00Z': 370, '2011-02-01T00:00:00Z': 357, '2011-03-01T00:00:00Z': 370, '2011-04-01T00:00:00Z': 359, 'end': '2011-05-01T00:00:00Z', 'gap': '+1MONTH/MONTH'}} ''' facets = [] for field, date_counts in facet_items.iteritems(): facet = Facet(field=field, label=field.replace('_', ' ').title()) gap = date_counts['gap'] for date_string, count in date_counts.iteritems(): match = DATETIME_REGEX.search(date_string) if not match: continue data = match.groupdict() date = datetime_safe.date(int(data['year']), int(data['month']), int(data['day'])) item = FacetItem(date, count) if gap == '+1MONTH/MONTH': item.label = date.strftime("%B") item.value = date.strftime("%Y-%m") elif gap == '+1YEAR/YEAR': item.label = date.strftime("%Y") item.value = date.strftime("%Y-01") item.is_selected = self._is_selected_facet( field, check_parse_date(item.value)) item.facet = facet facet.items.append(item) facet.items.sort(key=lambda x: x.value) facets.append(facet) return facets
def _parse_date_facets(self, facet_items): ''' Parse date faceted fields like: {'departure_dates': {'2010-04-24T18:17:03Z': 105, '2010-05-01T00:00:00Z': 323, '2010-06-01T00:00:00Z': 334, '2010-07-01T00:00:00Z': 468, '2010-08-01T00:00:00Z': 504, '2010-09-01T00:00:00Z': 515, '2010-10-01T00:00:00Z': 519, '2010-11-01T00:00:00Z': 478, '2010-12-01T00:00:00Z': 457, '2011-01-01T00:00:00Z': 370, '2011-02-01T00:00:00Z': 357, '2011-03-01T00:00:00Z': 370, '2011-04-01T00:00:00Z': 359, 'end': '2011-05-01T00:00:00Z', 'gap': '+1MONTH/MONTH'}} ''' facets = [] for field, date_counts in facet_items.iteritems(): facet = Facet(field=field, label=field.replace('_', ' ').title()) gap = date_counts['gap'] for date_string, count in date_counts.iteritems(): match = DATETIME_REGEX.search(date_string) if not match: continue data = match.groupdict() date = datetime_safe.date(int(data['year']), int(data['month']), int(data['day'])) item = FacetItem(date, count) if gap == '+1MONTH/MONTH': item.label=date.strftime("%B") item.value=date.strftime("%Y-%m") elif gap == '+1YEAR/YEAR': item.label=date.strftime("%Y") item.value=date.strftime("%Y-01") item.is_selected = self._is_selected_facet(field, check_parse_date(item.value)) item.facet = facet facet.items.append(item) facet.items.sort(key=lambda x: x.value) facets.append(facet) return facets
def test_creates_label_from_query(self): self.assertEqual( FacetItem.label_from_query(self.duration_query), '6 to 10' )