diff options
| author | Martin Czygan <martin@archive.org> | 2019-11-15 22:51:20 +0000 | 
|---|---|---|
| committer | Martin Czygan <martin@archive.org> | 2019-11-15 22:51:20 +0000 | 
| commit | a8d352ff76226bafeecebde6aaaad5d98dc3102a (patch) | |
| tree | 9e5cbd44dad2f309c316119e5971acf240919ca1 /python | |
| parent | a6bcbac233e27652913668ca63c102e4d071d437 (diff) | |
| parent | 0e4d65c773f586cc5cdafe8049e344a26688f710 (diff) | |
| download | fatcat-a8d352ff76226bafeecebde6aaaad5d98dc3102a.tar.gz fatcat-a8d352ff76226bafeecebde6aaaad5d98dc3102a.zip | |
Merge branch 'martin-search-results-pagination' into 'master'
Add basic pagination to search results
See merge request webgroup/fatcat!4
Diffstat (limited to 'python')
| -rw-r--r-- | python/fatcat_web/routes.py | 9 | ||||
| -rw-r--r-- | python/fatcat_web/search.py | 27 | ||||
| -rw-r--r-- | python/fatcat_web/templates/container_search.html | 10 | ||||
| -rw-r--r-- | python/fatcat_web/templates/entity_macros.html | 40 | ||||
| -rw-r--r-- | python/fatcat_web/templates/release_search.html | 11 | ||||
| -rw-r--r-- | python/tests/web_search.py | 5 | 
6 files changed, 82 insertions, 20 deletions
| diff --git a/python/fatcat_web/routes.py b/python/fatcat_web/routes.py index 79b594e3..a41f388d 100644 --- a/python/fatcat_web/routes.py +++ b/python/fatcat_web/routes.py @@ -673,9 +673,12 @@ def release_search():      if container_id and query:          query += ' container_id:"{}"'.format(container_id) +    offset = request.args.get('offset', '0') +    offset = max(0, int(offset)) if offset.isnumeric() else 0 +      if 'q' in request.args.keys():          # always do files for HTML -        found = do_release_search(query, fulltext_only=fulltext_only) +        found = do_release_search(query, fulltext_only=fulltext_only, offset=offset)          return render_template('release_search.html', found=found, query=query, fulltext_only=fulltext_only)      else:          return render_template('release_search.html', query=query, fulltext_only=fulltext_only) @@ -684,10 +687,12 @@ def release_search():  def container_search():      query = request.args.get('q') +    offset = request.args.get('offset', '0') +    offset = max(0, int(offset)) if offset.isnumeric() else 0      if 'q' in request.args.keys():          # always do files for HTML -        found = do_container_search(query) +        found = do_container_search(query, offset=offset)          return render_template('container_search.html', found=found, query=query)      else:          return render_template('container_search.html', query=query) diff --git a/python/fatcat_web/search.py b/python/fatcat_web/search.py index 52f05f71..7c60a6dd 100644 --- a/python/fatcat_web/search.py +++ b/python/fatcat_web/search.py @@ -11,15 +11,20 @@ import requests  from flask import abort, flash  from fatcat_web import app +def do_search(index, request, limit=30, offset=0, deep_page_limit=2000): -def do_search(index, request, limit=30): - +    # Sanity checks      if limit > 100: -        # Sanity check          limit = 100 +    if offset < 0: +        offset = 0 +    if offset > deep_page_limit: +        # Avoid deep paging problem. +        offset = deep_page_limit      request["size"] = int(limit) -    #print(request) +    request["from"] = int(offset) +    # print(request)      resp = requests.get("%s/%s/_search" %              (app.config['ELASTICSEARCH_BACKEND'], index),          json=request) @@ -45,10 +50,12 @@ def do_search(index, request, limit=30):      return {"count_returned": len(results),              "count_found": content['hits']['total'], -            "results": results } +            "results": results, +            "offset": offset, +            "deep_page_limit": deep_page_limit} -def do_release_search(q, limit=30, fulltext_only=True): +def do_release_search(q, limit=30, fulltext_only=True, offset=0):      #print("Search hit: " + q)      if limit > 100: @@ -75,17 +82,18 @@ def do_release_search(q, limit=30, fulltext_only=True):          },      } -    resp = do_search(app.config['ELASTICSEARCH_RELEASE_INDEX'], search_request) +    resp = do_search(app.config['ELASTICSEARCH_RELEASE_INDEX'], search_request, offset=offset)      for h in resp['results']:          # Ensure 'contrib_names' is a list, not a single string          if type(h['contrib_names']) is not list:              h['contrib_names'] = [h['contrib_names'], ]          h['contrib_names'] = [name.encode('utf8', 'ignore').decode('utf8') for name in h['contrib_names']]      resp["query"] = { "q": q } +    resp["limit"] = limit      return resp -def do_container_search(q, limit=30): +def do_container_search(q, limit=30, offset=0):      # Convert raw ISSN-L to ISSN-L query      if len(q.split()) == 1 and len(q) == 9 and q[0:4].isdigit() and q[4] == '-': @@ -103,8 +111,9 @@ def do_container_search(q, limit=30):          },      } -    resp = do_search(app.config['ELASTICSEARCH_CONTAINER_INDEX'], search_request, limit=limit) +    resp = do_search(app.config['ELASTICSEARCH_CONTAINER_INDEX'], search_request, limit=limit, offset=offset)      resp["query"] = { "q": q } +    resp["limit"] = limit      return resp  def get_elastic_entity_stats(): diff --git a/python/fatcat_web/templates/container_search.html b/python/fatcat_web/templates/container_search.html index 7f6799dd..48c613f8 100644 --- a/python/fatcat_web/templates/container_search.html +++ b/python/fatcat_web/templates/container_search.html @@ -1,3 +1,4 @@ +{% import "entity_macros.html" as entity_macros %}  {% extends "base.html" %}  {% block title %} @@ -30,7 +31,8 @@  {% if found %}  {% if found.results %} -  <i>Showing top {{ found.count_returned }} out of {{ found.count_found }} results for: <code>{{ found.query.q }}</code></i> +  {{ entity_macros.top_results(found) }} +  {% for entity in found.results %}  <div>    <h4 style="margin-top: 1em; margin-bottom: 4px; font-size: 1.1em;"> @@ -49,8 +51,10 @@  </div>  {% endfor %}  {% if found.results|length > 8 %} -  <br> -  <i>Showing top {{ found.count_returned }} out of {{ found.count_found }} results for: <code>{{ found.query.q }}</code></i> +  <div class="ui divider"></div> +  <div style="text-align: center"> +  {{ entity_macros.bottom_results(found)}} +  </div>  {% endif %}  {% else %} diff --git a/python/fatcat_web/templates/entity_macros.html b/python/fatcat_web/templates/entity_macros.html index fc199c21..390327bc 100644 --- a/python/fatcat_web/templates/entity_macros.html +++ b/python/fatcat_web/templates/entity_macros.html @@ -234,3 +234,43 @@ yellow  {% endif %}  {%- endmacro %} +{% macro top_results(found) -%} + +<i>Showing +  {% if found.offset == 0 %} +  first +  {% else %} +  results {{ found.offset }} — +  {% endif %} +   +  {{ found.offset + found.count_returned }} +  out of {{ found.count_found }} results +</i> + +{%- endmacro %} + + +{% macro bottom_results(found) -%} + +{% if found.offset > 0 %} +  {% if found.offset - found.limit < 0 %} +    <a href="{{ url_for('release_search', q=found.query.q, offset=0) }}">« Previous</a> +  {% else %} +    <a href="{{ url_for('release_search', q=found.query.q, offset=found.offset - found.limit) }}">« Previous</a> +  {% endif %} +{% else %} +  <span style="color:gray">« Previous</span> +{% endif %} + +  <i>Showing results {{ found.offset }} — {{ found.offset + +found.count_returned }} out of {{ found.count_found }} results</i>   + +{% if found.offset + found.limit < found.count_found and found.offset + found.limit < found.deep_page_limit %} +  <a href="{{ url_for('release_search', q=found.query.q, offset=found.offset + found.limit) }}">Next »</a> +  {% else %} +  <span style="color:gray">Next »</span> +{% endif %} + +</div> + +{%- endmacro %}
\ No newline at end of file diff --git a/python/fatcat_web/templates/release_search.html b/python/fatcat_web/templates/release_search.html index 7d6b0443..47f4330a 100644 --- a/python/fatcat_web/templates/release_search.html +++ b/python/fatcat_web/templates/release_search.html @@ -36,13 +36,16 @@  {% if found %}  {% if found.results %} -  <i>Showing top {{ found.count_returned }} out of {{ found.count_found }} results for: <code>{{ found.query.q }}</code></i> -{% for paper in found.results %} +    {{ entity_macros.top_results(found) }} + +  {% for paper in found.results %}    {{ entity_macros.release_search_result_row(paper) }}  {% endfor %}  {% if found.results|length > 8 %} -  <br> -  <i>Showing top {{ found.count_returned }} out of {{ found.count_found }} results for: <code>{{ found.query.q }}</code></i> +  <div class="ui divider"></div> +  <div style="text-align: center"> +  {{ entity_macros.bottom_results(found)}} +  </div>  {% endif %}  {% else %} diff --git a/python/tests/web_search.py b/python/tests/web_search.py index bdd858d0..19e2c29f 100644 --- a/python/tests/web_search.py +++ b/python/tests/web_search.py @@ -16,7 +16,8 @@ def test_release_search(app):      rv = app.get('/release/search?q=blood')      assert rv.status_code == 200 -    assert b"Showing top " in rv.data +    assert b"Showing" in rv.data +    assert b"Quantum Studies of Acetylene Adsorption on Ice Surface" in rv.data  @responses.activate  def test_container_search(app): @@ -29,7 +30,7 @@ def test_container_search(app):      rv = app.get('/container/search?q=blood')      assert rv.status_code == 200 -    assert b"Showing top " in rv.data +    assert b"Showing" in rv.data      assert b"European Instructional Course Lectures" in rv.data      assert b"British Editorial Society of Bone and Joint Surger" in rv.data | 
