Ver código fonte

WIP: pagination for search results

main
Simon Bowie 2 anos atrás
pai
commit
1926c3ec63
3 arquivos alterados com 45 adições e 4 exclusões
  1. +29
    -2
      web/app/search.py
  2. +9
    -2
      web/app/solr.py
  3. +7
    -0
      web/app/templates/search.html

+ 29
- 2
web/app/search.py Ver arquivo

@@ -10,6 +10,7 @@ from flask import Blueprint, render_template, request, redirect, url_for
from . import solr
from . import ops
import pycountry
import math

search = Blueprint('search', __name__)

@@ -37,6 +38,10 @@ def basic_search():
year = request.form.get('year')
else:
year = None
if request.form.get('page') is not None:
page = request.form.get('page')
else:
page = '1'
else:
if request.args.get('query') is not None:
query = request.args.get('query')
@@ -58,10 +63,14 @@ def basic_search():
year = request.args.get('year')
else:
year = None
if request.args.get('page') is not None:
page = request.args.get('page')
else:
page = '1'
if (query is None and country is None and year is None):
return redirect(url_for('main.index'))
else:
search_results = solr.query_search(core, sort, query, country, year)
search_results = solr.query_search(core, sort, query, country, year, page)
results = search_results[0]
num_found = search_results[1]
year_facet = search_results[2]['year']
@@ -75,8 +84,26 @@ def basic_search():
country_full = pycountry.historic_countries.get(alpha_2=country_facet[i])
if country_full is not None:
country_facet[i] = country_full
# get total number of records
total_number = solr.get_total_number(core)
return render_template('search.html', results=results, num_found=num_found, total_number=total_number, country_facet=country_facet, year_facet=year_facet, query=query, core=core, sort=sort, country=country, year=year)
# work out how many pages to display in the pagination
num_pages = math.ceil(int(num_found) / 10)
raw_pagination = list(range(1, num_pages+1))
if int(page) > 5:
pagination = raw_pagination[int(page)-5:int(page)+4]
#pagination.insert(0,raw_pagination[0])
#pagination.append(raw_pagination[len(raw_pagination)-1])
else:
end = 9-int(page)
pagination = raw_pagination[:int(page)+end]
#pagination.insert(0,raw_pagination[0])
#pagination.append(raw_pagination[len(raw_pagination)-1])
# work out page range for display
page_end = int(page) * 10
page_start = page_end - 9
page_end = page_start + (len(results)-1)
page_range = str(page_start) + '–' + str(page_end)
return render_template('search.html', results=results, num_found=num_found, total_number=total_number, country_facet=country_facet, year_facet=year_facet, query=query, core=core, sort=sort, country=country, year=year, page=page, page_range=page_range, pagination=pagination)

# route for id_search page
@search.route('/search/id/', methods=['GET'])

+ 9
- 2
web/app/solr.py Ver arquivo

@@ -47,7 +47,7 @@ def solr_search(solrurl):

return output, num_found, facets

def query_search(core, sort, query, country, year):
def query_search(core, sort, query, country, year, page):

# assemble parameters for the query string to Solr
if (sort == 'relevance'):
@@ -72,8 +72,15 @@ def query_search(core, sort, query, country, year):
field = 'year'
year_parameter = '&fq=%7B!term%20f%3D' + field + '%7D' + year

if (page is None or page == 'None'):
page_parameter = ''
else:
start = (int(page) * 10) - 10
start = str(start)
page_parameter = '&start=' + start + '&rows=10'

# assemble a query string to send to Solr. This uses the Solr hostname from config.env. Solr's query syntax can be found at many sites including https://lucene.apache.org/solr/guide/6_6/the-standard-query-parser.html
solrurl = 'http://' + solr_hostname + ':' + solr_port + '/solr/' + core + '/select?q.op=OR&indent=true' + query_parameter + '&wt=json' + sort_parameter + country_parameter + year_parameter + '&facet.field=country&facet.field=year&facet.sort=count&facet.mincount=1&facet=true'
solrurl = 'http://' + solr_hostname + ':' + solr_port + '/solr/' + core + '/select?q.op=OR&indent=true' + query_parameter + '&wt=json' + sort_parameter + country_parameter + year_parameter + page_parameter + '&facet.field=country&facet.field=year&facet.sort=count&facet.mincount=1&facet=true'

output = solr_search(solrurl)


+ 7
- 0
web/app/templates/search.html Ver arquivo

@@ -10,6 +10,13 @@
</div>
</div>

<div class="text-center">
<p>showing {{ page_range }} results of {{ num_found }} found{% if query is not none %} for query '{{ query }}'{% endif %}</p>
{% for page_number in pagination %}
<a {% if page_number|int == page|int %}class="fs-4"{% endif %} href="{{ url_for('search.basic_search', query=query, sort=sort, country=country, year=year, page=page_number) }}">{{ page_number }}</a>
{% endfor %}
</div>

<div class="row p-3">
<form action="{{ url_for('search.basic_search') }}" method="POST">
<input type="hidden" name="query" value="{{ query }}">

Carregando…
Cancelar
Salvar