Add ID-based pagination to logs using new decorators and an encrypted token
Fixes #599
This commit is contained in:
parent
af77b92bcf
commit
bd0a098282
8 changed files with 110 additions and 36 deletions
|
@ -1,5 +1,6 @@
|
|||
import logging
|
||||
import datetime
|
||||
import json
|
||||
|
||||
from app import app, metric_queue
|
||||
from flask import Blueprint, request, make_response, jsonify, session
|
||||
|
@ -21,6 +22,7 @@ from auth.auth import process_oauth
|
|||
from endpoints.csrf import csrf_protect
|
||||
from endpoints.decorators import check_anon_protection
|
||||
from util.saas.metricqueue import time_decorator
|
||||
from util.security.aes import AESCipher
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
@ -209,6 +211,41 @@ def query_param(name, help_str, type=reqparse.text_type, default=None,
|
|||
return add_param
|
||||
|
||||
|
||||
def page_support(func):
|
||||
""" Adds pagination support to an API endpoint. The decorated API will have an
|
||||
added query parameter named 'next_page'. Works in tandem with the
|
||||
modelutil paginate method.
|
||||
"""
|
||||
@wraps(func)
|
||||
@query_param('next_page', 'The page token for the next page', type=str)
|
||||
def wrapper(self, query_args, *args, **kwargs):
|
||||
page_token = None
|
||||
unecrypted = None
|
||||
|
||||
if query_args['next_page']:
|
||||
# Decrypt the page token.
|
||||
cipher = AESCipher(app.config['PAGE_TOKEN_KEY'])
|
||||
try:
|
||||
unecrypted = cipher.decrypt(query_args['next_page'])
|
||||
except TypeError:
|
||||
pass
|
||||
|
||||
if unecrypted is not None:
|
||||
try:
|
||||
page_token = json.loads(unecrypted)
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
(result, next_page_token) = func(self, query_args, page_token, *args, **kwargs)
|
||||
if next_page_token is not None:
|
||||
cipher = AESCipher(app.config['PAGE_TOKEN_KEY'])
|
||||
result['next_page'] = cipher.encrypt(json.dumps(next_page_token))
|
||||
|
||||
return result
|
||||
|
||||
return wrapper
|
||||
|
||||
|
||||
def parse_args(func):
|
||||
@wraps(func)
|
||||
def wrapper(self, *args, **kwargs):
|
||||
|
|
Reference in a new issue