from flask import request from app import get_app_url from util.pagination import encrypt_page_token, decrypt_page_token import urllib import logging _MAX_RESULTS_PER_PAGE = 50 def add_pagination(query, url): """ Adds optional pagination to the given query by looking for the Docker V2 pagination request args. """ try: requested_limit = int(request.args.get('n', _MAX_RESULTS_PER_PAGE)) except ValueError: requested_limit = 0 limit = max(min(requested_limit, _MAX_RESULTS_PER_PAGE), 1) next_page_token = request.args.get('next_page', None) # Decrypt the next page token, if any. offset = 0 page_info = decrypt_page_token(next_page_token) if page_info is not None: # Note: we use offset here instead of ID >= n because one of the V2 queries is a UNION. offset = page_info.get('offset', 0) query = query.offset(offset) query = query.limit(limit + 1) url = get_app_url() + url results = list(query) if len(results) <= limit: return None, results # Add a link to the next page of results. page_info = dict(offset=limit + offset) next_page_token = encrypt_page_token(page_info) link = url + '?' + urllib.urlencode(dict(n=limit, next_page=next_page_token)) link = link + '; rel="next"' return link, results[0:-1]