Example #1
0
 def test_last_page(self):
     page = 10
     per_page = 10
     total_count = 98
     pagination = Pagination(page, per_page, total_count)
     self.assertTrue(pagination.has_prev)
     self.assertFalse(pagination.has_next)
     self.assertEqual(list(pagination.iter_pages()), [1, None, 9, 10])
Example #2
0
 def test_middle_page(self):
     page = 5
     per_page = 10
     total_count = 98
     pagination = Pagination(page, per_page, total_count)
     self.assertTrue(pagination.has_prev)
     self.assertTrue(pagination.has_next)
     self.assertEqual(list(pagination.iter_pages()),
                      [1, None, 4, 5, 6, 7, None, 10])
Example #3
0
def load(page, per_page, sort_key):
    """Load objects for the table."""
    # FIXME: Load tags in this way until wash_arguments handles lists.
    tags = request.args.getlist("tags[]") or []  # empty to show all
    sort_key = request.args.get(
        'sort_key', session.get('holdingpen_sort_key', "modified")
    )
    response = get_holdingpen_objects(tags, sort_key)
    current_app.logger.debug(tags)
    current_app.logger.debug(response)

    page = max(page, 1)
    per_page = per_page or session.get('holdingpen_per_page') or 10
    pagination = Pagination(page, per_page, len(response))

    # Make sure requested page is within limits.
    if pagination.page > pagination.pages:
        pagination.page = pagination.pages

    pages_iteration = []
    for iter_page in pagination.iter_pages():
        res = {"page": iter_page}
        if iter_page == pagination.page:
            res["active"] = True
        else:
            res["active"] = False
        pages_iteration.append(res)

    table_data = {
        'rows': [],
        'pagination': {
            "page": pagination.page,
            "pages": pagination.pages,
            "iter_pages": pages_iteration,
            "per_page": pagination.per_page,
            "total_count": pagination.total_count
        }
    }

    # Add current ids in table for use by previous/next
    session['holdingpen_current_ids'] = response
    session['holdingpen_sort_key'] = sort_key
    session['holdingpen_per_page'] = per_page
    session['holdingpen_tags'] = tags

    display_start = max(pagination.per_page*(pagination.page-1), 0)
    display_end = min(
        pagination.per_page*pagination.page,
        pagination.total_count
    )

    table_data["rows"] = get_rows(
        response[display_start:display_end]
    )
    table_data["rendered_rows"] = "".join(table_data["rows"])
    return jsonify(table_data)
Example #4
0
def load(page, per_page, sort_key):
    """Load objects for the table."""
    # FIXME: Load tags in this way until wash_arguments handles lists.
    tags = request.args.getlist("tags[]") or []  # empty to show all
    sort_key = request.args.get(
        'sort_key', session.get('holdingpen_sort_key', "updated")
    )
    per_page = per_page or session.get('holdingpen_per_page') or 10
    object_list = get_holdingpen_objects(tags)
    object_list = sort_bwolist(object_list, sort_key)

    page = max(page, 1)
    pagination = Pagination(page, per_page, len(object_list))

    # Make sure requested page is within limits.
    if pagination.page > pagination.pages:
        pagination.page = pagination.pages

    pages_iteration = []
    for iter_page in pagination.iter_pages():
        res = {"page": iter_page}
        if iter_page == pagination.page:
            res["active"] = True
        else:
            res["active"] = False
        pages_iteration.append(res)

    table_data = {
        'rows': [],
        'pagination': {
            "page": pagination.page,
            "pages": pagination.pages,
            "iter_pages": pages_iteration,
            "per_page": pagination.per_page,
            "total_count": pagination.total_count
        }
    }

    # Add current ids in table for use by previous/next
    session['holdingpen_current_ids'] = [o.id for o in object_list]
    session['holdingpen_sort_key'] = sort_key
    session['holdingpen_per_page'] = per_page
    session['holdingpen_tags'] = tags

    display_start = max(pagination.per_page*(pagination.page-1), 0)
    display_end = min(
        pagination.per_page*pagination.page,
        pagination.total_count
    )
    table_data["rows"] = get_rows(object_list[display_start:display_end])
    table_data["rendered_rows"] = "".join(table_data["rows"])
    return jsonify(table_data)
Example #5
0
def index(p, so, page):
    """Index page with uploader and list of existing depositions."""
    ctx = mycommunities_ctx()

    if not so:
        so = cfg.get('COMMUNITIES_DEFAULT_SORTING_OPTION')

    communities = Community.filter_communities(p, so)
    featured_community = FeaturedCommunity.get_current()
    form = SearchForm(p=p)
    per_page = cfg.get('COMMUNITIES_DISPLAYED_PER_PAGE', 10)
    page = max(page, 1)
    p = Pagination(page, per_page, communities.count())

    ctx.update({
        'r_from': max(p.per_page*(p.page-1), 0),
        'r_to': min(p.per_page*p.page, p.total_count),
        'r_total': p.total_count,
        'pagination': p,
        'form': form,
        'title': _('Community Collections'),
        'communities': communities.slice(
            per_page*(page-1), per_page*page).all(),
        'featured_community': featured_community,
        'format_record': format_record,
    })

    return render_template(
        "communities/index.html",
        **ctx
    )
Example #6
0
 def index_context():
     box = lambda: _create_neareset_term_box(argd_orig)
     pagination = Pagination(int(ceil(jrec / float(rg))), rg, len(records))
     breadcrumbs = current_breadcrumbs + collection_breadcrumbs(collection)
     return dict(collection=collection,
                 create_nearest_terms_box=box,
                 pagination=pagination,
                 rg=rg,
                 p=p,
                 f=f,
                 easy_search_form=EasySearchForm(csrf_enabled=False),
                 breadcrumbs=breadcrumbs)
Example #7
0
def print_records(recIDs, of='hb', ln=None, verbose=0,
                  search_pattern='', on_the_fly=False, **ctx):
    """Return records using Jinja template."""
    import time
    from math import ceil
    from flask import request
    from invenio.base.i18n import wash_language
    from invenio.ext.template import render_template_to_string
    from invenio.modules.search.models import Format
    from invenio.utils.pagination import Pagination
    from invenio.modules.formatter.engine import \
        TEMPLATE_CONTEXT_FUNCTIONS_CACHE

    of = of.lower()
    jrec = request.values.get('jrec', ctx.get('jrec', 1), type=int)
    rg = request.values.get('rg', ctx.get('rg', 10), type=int)
    ln = ln or wash_language(request.values.get('ln', cfg['CFG_SITE_LANG']))
    ot = (request.values.get('ot', ctx.get('ot')) or '').split(',')
    records = ctx.get('records', len(recIDs))

    if jrec > records:
        jrec = rg * (records // rg) + 1

    pages = int(ceil(jrec / float(rg))) if rg > 0 else 1

    context = dict(
        of=of, jrec=jrec, rg=rg, ln=ln, ot=ot,
        facets={},
        time=time,
        recids=recIDs,
        pagination=Pagination(pages, rg, records),
        verbose=verbose,
        export_formats=Format.get_export_formats(),
        format_record=format_record,
        **TEMPLATE_CONTEXT_FUNCTIONS_CACHE.template_context_functions
    )
    context.update(ctx)
    return render_template_to_string(
        ['format/records/%s.tpl' % of,
         'format/records/%s.tpl' % of[0],
         'format/records/%s.tpl' % get_output_format_content_type(of).
            replace('/', '_')],
        **context)
Example #8
0
def search(collection, p, of, ot, so, sf, sp, rm, rg, jrec):
    """Render search page."""
    if 'action_browse' in request.args \
            or request.args.get('action', '') == 'browse':
        return browse()

    if 'c' in request.args and len(request.args) == 1 \
            and len(request.args.getlist('c')) == 1:
        return redirect(url_for('.collection', name=request.args.get('c')))

    if 'f' in request.args:
        args = request.args.copy()
        args['p'] = "{0}:{1}".format(args['f'], args['p'])
        del args['f']
        return redirect(url_for('.search', **args))

    # fix for queries like `/search?p=+ellis`
    p = p.strip().encode('utf-8')

    collection_breadcrumbs(collection)

    response = Query(p).search(collection=collection.name)
    response.body.update({
        'size': int(rg),
        'from': jrec - 1,
        'aggs': {
            "collection": {
                "terms": {
                    "field": "_collections"
                }
            },
            "author": {
                "terms": {
                    "field": "authors.raw"
                }
            },
        },
    })

    # FIXME refactor to separate search hook
    filtered_facets = ''
    from invenio.modules.search.walkers.elasticsearch import ElasticSearchDSL
    if 'post_filter' in request.values:
        parsed_post_filter = Query(request.values.get('post_filter'))
        post_filter = parsed_post_filter.query.accept(ElasticSearchDSL())
        response.body['post_filter'] = post_filter
        # extracting the facet filtering
        from invenio.modules.search.walkers.facets import FacetsVisitor
        filtered_facets = parsed_post_filter.query.accept(FacetsVisitor())
        # sets cannot be converted to json. use facetsVisitor to convert them to
        # lists
        filtered_facets = FacetsVisitor.jsonable(filtered_facets)

    if len(response) and jrec > len(response):
        args = request.args.copy()
        args['jrec'] = 1
        return redirect(url_for('.search', **args))

    pagination = Pagination((jrec - 1) // rg + 1, rg, len(response))

    ctx = dict(
        facets={},  # facets.get_facets_config(collection, qid),
        filtered_facets=filtered_facets,
        response=response,
        rg=rg,
        create_nearest_terms_box=lambda: _("Try to modify the query."),
        easy_search_form=EasySearchForm(csrf_enabled=False),
        ot=ot,
        pagination=pagination,
    )

    # TODO add search services
    # TODO add external collection search

    return response_formated_records(response.records(), collection, of, **ctx)