def extra_request_info(request): """ Add some extra useful stuff into the RequestContext. """ date_boundaries = fulltext_range() return { 'BASE_URL': settings.BASE_URL, 'city_form': CityForm(), 'fulltext_enddate': date_boundaries[1], 'fulltext_startdate': date_boundaries[0], 'omniture_url': settings.OMNITURE_SCRIPT if "OMNITURE_SCRIPT" in dir(settings) else None, 'project_name': settings.PROJECT_NAME if "PROJECT_NAME" in dir(settings) else None, 'sharetool_url': settings.SHARETOOL_URL if "SHARETOOL_URL" in dir(settings) else None, 'site_title': settings.SITE_TITLE if "SITE_TITLE" in dir(settings) else None, }
def __init__(self, *args, **kwargs): super(SearchPagesFormBase, self).__init__(*args, **kwargs) self.titles, self.states = _titles_states() fulltextStartYear, fulltextEndYear = fulltext_range() self.years = [(year, year) for year in range(fulltextStartYear, fulltextEndYear + 1)] self.fulltextStartYear = fulltextStartYear self.fulltextEndYear = fulltextEndYear self.fields["state"].choices = self.states self.fields["date1"].choices = self.years self.fields["date1"].initial = fulltextStartYear self.fields["date2"].choices = self.years self.fields["date2"].initial = fulltextEndYear
def _solrize_date(date, date_type=''): """ Takes a date string like 2018/01/01 and returns an integer suitable for querying the date field in a solr document. """ solr_date = "*" if date: date = date.strip() start_year, end_year = fulltext_range() if date_type == 'start' and date == str(start_year) + '-01-01': return '*' elif date_type == 'end' and date == str(end_year) + '-12-31': return '*' # 1900-01-01 -> 19000101 match = re.match(r'(\d{4})-(\d{2})-(\d{2})', date) if match: y, m, d = match.groups() if y and m and d: solr_date = y + m + d return solr_date
def page_search(d): """ Pass in form data for a given page search, and get back a corresponding solr query. """ q = ['+type:page'] simple_fields = ['city', 'county', 'frequency', 'state', 'lccn'] for field in simple_fields: if d.get(field, None): q.append(query_join(d.getlist(field), field)) ocrs = ['ocr_%s' % l for l in settings.SOLR_LANGUAGES] lang_req = d.get('language', None) language = models.Language.objects.get(name=lang_req) if lang_req else None lang = language.code if language else None if language: q.append('+language:%s' % language.name) ocr_lang = 'ocr_' + lang if lang else 'ocr' if d.get('ortext', None): q.append('+((' + query_join(_solr_escape(d['ortext']).split(' '), "ocr")) if lang: q.append( ' AND ' + query_join(_solr_escape(d['ortext']).split(' '), ocr_lang)) q.append( ') OR ' + query_join(_solr_escape(d['ortext']).split(' '), ocr_lang)) else: q.append(')') for ocr in ocrs: q.append('OR ' + query_join(_solr_escape(d['ortext']).split(' '), ocr)) q.append(')') if d.get('andtext', None): q.append('+((' + query_join( _solr_escape(d['andtext']).split(' '), "ocr", and_clause=True)) if lang: q.append('AND ' + query_join(_solr_escape(d['andtext']).split(' '), ocr_lang, and_clause=True)) q.append(') OR ' + query_join(_solr_escape(d['andtext']).split(' '), ocr_lang, and_clause=True)) else: q.append(')') for ocr in ocrs: q.append('OR ' + query_join(_solr_escape(d['andtext']).split(' '), ocr, and_clause=True)) q.append(')') if d.get('phrasetext', None): phrase = _solr_escape(d['phrasetext']) q.append('+((' + 'ocr' + ':"%s"^10000' % (phrase)) if lang: q.append('AND ocr_' + lang + ':"%s"' % (phrase)) q.append(') OR ocr_' + lang + ':"%s"' % (phrase)) else: q.append(')') for ocr in ocrs: q.append('OR ' + ocr + ':"%s"' % (phrase)) q.append(')') if d.get('proxtext', None): distance = d.get('proxdistance', PROX_DISTANCE_DEFAULT) prox = _solr_escape(d['proxtext']) q.append('+((' + 'ocr' + ':("%s"~%s)^10000' % (prox, distance)) if lang: q.append('AND ocr_' + lang + ':"%s"~%s' % (prox, distance)) q.append(') OR ocr_' + lang + ':"%s"~%s' % (prox, distance)) else: q.append(')') for ocr in ocrs: q.append('OR ' + ocr + ':"%s"~%s' % (prox, distance)) q.append(')') if d.get('sequence', None): q.append('+sequence:"%s"' % d['sequence']) if d.get('issue_date', None): q.append('+month:%d +day:%d' % (int(d['date_month']), int(d['date_day']))) # yearRange supercedes date1 and date2 year1, year2 = None, None year_range = d.get('yearRange', None) if year_range: split = year_range.split("-") if len(split) == 2: year1 = int(split[0]) year2 = int(split[1]) else: year1 = int(split[0]) year2 = int(split[0]) q.append('+year:[%d TO %d]' % (year1, year2)) else: date_boundaries = fulltext_range() date1 = d.get('date1', None) date2 = d.get('date2', None) if date1 or date2: # do NOT apply year min / max to solr query # do apply it to facets since they require a specific begin / end year d1 = _solrize_date(str(date1), 'start') d2 = _solrize_date(str(date2), 'end') q.append('+date:[%s TO %s]' % (d1, d2)) year1 = date_boundaries[0] if d1 == "*" else int(str(d1)[:4]) year2 = date_boundaries[1] if d2 == "*" else int(str(d2)[:4]) else: # do not pass any query parameters to solr if no date requested # but do set the year range for faceting purposes year1 = date_boundaries[0] year2 = date_boundaries[1] # choose a facet range gap such that the number of date ranges returned # is <= 10. These would be used to populate a select dropdown on search # results page. gap = max(1, int(math.ceil((year2 - year1) // 10))) # increment year range end by 1 to be inclusive facet_params = { 'facet': 'true', 'facet_field': [ 'city', 'county', 'frequency', 'language', 'state', ], 'facet_range': 'year', 'f_year_facet_range_start': year1, 'f_year_facet_range_end': year2 + 1, 'f_year_facet_range_gap': gap, 'facet_mincount': 1 } return ' '.join(q), facet_params
def search_pages_results(request, view_type='gallery'): page_title = "Search Results" paginator = search_pages_paginator(request) q = paginator.query try: page = paginator.page(paginator._cur_page) except InvalidPage: url = urls.reverse('openoni_search_pages_results') # Set the page to the first page q['page'] = 1 return HttpResponseRedirect('%s?%s' % (url, q.urlencode())) start = page.start_index() end = page.end_index() # figure out the next page number query = request.GET.copy() if page.has_next(): query['page'] = paginator._cur_page + 1 next_url = '?' + query.urlencode() # and the previous page number if page.has_previous(): query['page'] = paginator._cur_page - 1 previous_url = '?' + query.urlencode() rows = query.get("rows", "20") sort = query.get("sort", default="relevance") seq_check = "checked" if query.get("sequence", "0") == "1" else "" crumbs = list(settings.BASE_CRUMBS) host = request.get_host() format = request.GET.get('format', None) if format == 'atom': feed_url = settings.BASE_URL + request.get_full_path() updated = rfc3339(timezone.now()) return render(request, 'search/search_pages_results.xml', locals(), content_type='application/atom+xml') elif format == 'json': results = { 'startIndex': start, 'endIndex': end, 'totalItems': paginator.count, 'itemsPerPage': rows, 'items': [p.solr_doc for p in page.object_list], } for i in results['items']: i['url'] = settings.BASE_URL + i['id'].rstrip('/') + '.json' json_text = json.dumps(results, indent=2) # jsonp? if request.GET.get('callback') is not None: json_text = "%s(%s);" % (request.GET.get('callback'), json_text) return HttpResponse(json_text, content_type='application/json') page_range_short = list(_page_range_short(paginator, page)) # copy the current request query without the page and sort # query params so we can construct links with it in the template q = request.GET.copy() for i in ('page', 'sort'): if i in q: q.pop(i) q = q.urlencode() # get an pseudo english version of the query english_search = paginator.englishify() form = forms.SearchResultsForm({"rows": rows, "sort": sort}) if view_type == "list": template = "search/search_pages_results_list.html" else: template = "search/search_pages_results.html" page_list = [] lccns = query.getlist("lccn") titles = [] for lccn in lccns: name = str(models.Title.objects.get(lccn=lccn)) titles.append({ 'abbrev': name[:24] + '...' if len(name) > 24 else name, 'lccn': lccn, 'name': name, }) for count in range(len(page.object_list)): page_list.append((count + start, page.object_list[count])) start_year, end_year = fulltext_range() searching_all_dates = False if request.GET.get('date1') and request.GET.get('date2'): if request.GET.get('date1') == str(start_year) + '-01-01': if request.GET.get('date2') == str(end_year) + '-12-31': searching_all_dates = True return render(request, template, locals())