Add pager to browse page.
This commit is contained in:
		
							parent
							
								
									146b79bde8
								
							
						
					
					
						commit
						c2727e6fc8
					
				
							
								
								
									
										18
									
								
								app.py
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								app.py
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -4,6 +4,7 @@ from flask import Flask, render_template, url_for, redirect, request, g, jsonify
 | 
			
		|||
from depicts import (utils, wdqs, commons, mediawiki, painting, saam, database,
 | 
			
		||||
                     dia, rijksmuseum, npg, museodelprado, barnesfoundation,
 | 
			
		||||
                     wd_catalog)
 | 
			
		||||
from depicts.pager import Pagination, init_pager
 | 
			
		||||
from depicts.model import DepictsItem, DepictsItemAltLabel, Edit, PaintingItem
 | 
			
		||||
from requests_oauthlib import OAuth1Session
 | 
			
		||||
from urllib.parse import urlencode
 | 
			
		||||
| 
						 | 
				
			
			@ -24,6 +25,7 @@ user_agent = 'Mozilla/5.0 (X11; Linux i586; rv:32.0) Gecko/20160101 Firefox/32.0
 | 
			
		|||
app = Flask(__name__)
 | 
			
		||||
app.config.from_object('config.default')
 | 
			
		||||
database.init_db(app.config['DB_URL'])
 | 
			
		||||
init_pager(app)
 | 
			
		||||
 | 
			
		||||
find_more_props = {
 | 
			
		||||
    'P135': 'movement',
 | 
			
		||||
| 
						 | 
				
			
			@ -664,20 +666,24 @@ def browse_page():
 | 
			
		|||
    page_size = 45
 | 
			
		||||
 | 
			
		||||
    item_map = wdqs.build_browse_item_map(bindings)
 | 
			
		||||
    items = []
 | 
			
		||||
 | 
			
		||||
    all_items = []
 | 
			
		||||
    for item in item_map.values():
 | 
			
		||||
        if len(item['image_filename']) != 1:
 | 
			
		||||
            continue
 | 
			
		||||
        item['image_filename'] = item['image_filename'][0]
 | 
			
		||||
        items.append(item)
 | 
			
		||||
        if len(items) >= page_size:
 | 
			
		||||
            break
 | 
			
		||||
        all_items.append(item)
 | 
			
		||||
 | 
			
		||||
    page = utils.get_int_arg('page') or 1
 | 
			
		||||
    pager = Pagination(page, page_size, len(all_items))
 | 
			
		||||
 | 
			
		||||
    items = pager.slice(all_items)
 | 
			
		||||
 | 
			
		||||
    filenames = [cur['image_filename'] for cur in items]
 | 
			
		||||
 | 
			
		||||
    thumbwidth = app.config['THUMBWIDTH']
 | 
			
		||||
 | 
			
		||||
    filename = f'cache/{flat}_{page_size}_images.json'
 | 
			
		||||
    filename = f'cache/{flat}_{page}_{page_size}_images.json'
 | 
			
		||||
    if os.path.exists(filename):
 | 
			
		||||
        detail = json.load(open(filename))
 | 
			
		||||
    else:
 | 
			
		||||
| 
						 | 
				
			
			@ -694,6 +700,8 @@ def browse_page():
 | 
			
		|||
                           facets=facets,
 | 
			
		||||
                           prop_labels=find_more_props,
 | 
			
		||||
                           label=title,
 | 
			
		||||
                           pager=pager,
 | 
			
		||||
                           page=page,
 | 
			
		||||
                           labels=find_more_props,
 | 
			
		||||
                           bindings=bindings,
 | 
			
		||||
                           total=len(bindings),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										47
									
								
								depicts/pager.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								depicts/pager.py
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,47 @@
 | 
			
		|||
from math import ceil
 | 
			
		||||
from flask import request, url_for
 | 
			
		||||
 | 
			
		||||
class Pagination(object):
 | 
			
		||||
    def __init__(self, page, per_page, total_count):
 | 
			
		||||
        self.page = page
 | 
			
		||||
        self.per_page = per_page
 | 
			
		||||
        self.total_count = total_count
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def pages(self):
 | 
			
		||||
        return int(ceil(self.total_count / float(self.per_page)))
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def has_prev(self):
 | 
			
		||||
        return self.page > 1
 | 
			
		||||
 | 
			
		||||
    @property
 | 
			
		||||
    def has_next(self):
 | 
			
		||||
        return self.page < self.pages
 | 
			
		||||
 | 
			
		||||
    def slice(self, items):
 | 
			
		||||
        first = ((self.page - 1) * self.per_page)
 | 
			
		||||
        last = self.page * self.per_page
 | 
			
		||||
        return items[first:last]
 | 
			
		||||
 | 
			
		||||
    def iter_pages(self, left_edge=2, left_current=6,
 | 
			
		||||
                   right_current=6, right_edge=2):
 | 
			
		||||
        last = 0
 | 
			
		||||
        for num in range(1, self.pages + 1):
 | 
			
		||||
            if num <= left_edge or \
 | 
			
		||||
               (num > self.page - left_current - 1 and \
 | 
			
		||||
                num < self.page + right_current) or \
 | 
			
		||||
               num > self.pages - right_edge:
 | 
			
		||||
                if last + 1 != num:
 | 
			
		||||
                    yield None
 | 
			
		||||
                yield num
 | 
			
		||||
                last = num
 | 
			
		||||
 | 
			
		||||
def url_for_other_page(page):
 | 
			
		||||
    args = request.view_args.copy()
 | 
			
		||||
    args.update(request.args)
 | 
			
		||||
    args['page'] = page
 | 
			
		||||
    return url_for(request.endpoint, **args)
 | 
			
		||||
 | 
			
		||||
def init_pager(app):
 | 
			
		||||
    app.jinja_env.globals['url_for_other_page'] = url_for_other_page
 | 
			
		||||
| 
						 | 
				
			
			@ -1,3 +1,4 @@
 | 
			
		|||
from flask import request
 | 
			
		||||
from itertools import islice
 | 
			
		||||
import urllib.parse
 | 
			
		||||
import inflect
 | 
			
		||||
| 
						 | 
				
			
			@ -70,4 +71,6 @@ def wiki_url(title, site, ns=None):
 | 
			
		|||
 | 
			
		||||
    return f'https://{host}/wiki/' + url_ns + urllib.parse.quote(title.replace(' ', '_'))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_int_arg(name):
 | 
			
		||||
    if name in request.args and request.args[name].isdigit():
 | 
			
		||||
        return int(request.args[name])
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,4 @@
 | 
			
		|||
{% from "macro.html" import render_pagination %}
 | 
			
		||||
{% extends "base.html" %}
 | 
			
		||||
 | 
			
		||||
{% block title %}{{ label }}{% endblock %}
 | 
			
		||||
| 
						 | 
				
			
			@ -51,11 +52,7 @@
 | 
			
		|||
  {% endfor %}
 | 
			
		||||
</div>
 | 
			
		||||
 | 
			
		||||
{#
 | 
			
		||||
  {% for item in items %}
 | 
			
		||||
  <pre>{{ item | pprint }}</pre>
 | 
			
		||||
  {% endfor %}
 | 
			
		||||
#}
 | 
			
		||||
{{ render_pagination(pager) }}
 | 
			
		||||
 | 
			
		||||
</div>
 | 
			
		||||
{% endblock %}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										29
									
								
								templates/macro.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								templates/macro.html
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,29 @@
 | 
			
		|||
{% macro render_pagination(pagination) %}
 | 
			
		||||
{% if pagination.pages > 1 %}
 | 
			
		||||
<nav aria-label="Page navigation example">
 | 
			
		||||
  <ul class="pagination">
 | 
			
		||||
  {% if pagination.has_prev %}
 | 
			
		||||
		<li class="page-item"><a class="page-link" href="{{ url_for_other_page(pagination.page - 1) }}">« Previous</a></li>
 | 
			
		||||
  {% endif %}
 | 
			
		||||
  {%- for page in pagination.iter_pages() %}
 | 
			
		||||
    {% if page %}
 | 
			
		||||
      {% if page != pagination.page %}
 | 
			
		||||
		<li class="page-item"><a class="page-link" href="{{ url_for_other_page(page) }}">{{ page }}</a></li>
 | 
			
		||||
      {% else %}
 | 
			
		||||
        <li class="page-item active"><a class="page-link" href="{{ url_for_other_page(page) }}">{{ page }} <span class="sr-only">(current)</span></a></li>
 | 
			
		||||
      {% endif %}
 | 
			
		||||
    {% else %}
 | 
			
		||||
      <li><span class="ellipsis">…</span></li>
 | 
			
		||||
    {% endif %}
 | 
			
		||||
  {%- endfor %}
 | 
			
		||||
  {% if pagination.has_next %}
 | 
			
		||||
    <li class="page-item">
 | 
			
		||||
      <a class="page-link" href="{{ url_for_other_page(pagination.page + 1) }}" aria-label="Next">
 | 
			
		||||
        <span aria-hidden="true">Next »</span>
 | 
			
		||||
      </a>
 | 
			
		||||
    </li>
 | 
			
		||||
  {% endif %}
 | 
			
		||||
  </ul>
 | 
			
		||||
</nav>
 | 
			
		||||
{% endif %}
 | 
			
		||||
{% endmacro %}
 | 
			
		||||
		Loading…
	
		Reference in a new issue