Ejemplo n.º 1
0
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,
    }
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
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
Ejemplo n.º 5
0
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())