Merge pull request #444 from dod-ccpo/paginate-audit-log

Paginate audit log
This commit is contained in:
richard-dds
2018-11-19 10:58:07 -05:00
committed by GitHub
8 changed files with 133 additions and 6 deletions

View File

@@ -8,8 +8,9 @@ class AuditEventQuery(Query):
model = AuditEvent
@classmethod
def get_all(cls):
return db.session.query(cls.model).order_by(cls.model.time_created.desc()).all()
def get_all(cls, pagination_opts):
query = db.session.query(cls.model).order_by(cls.model.time_created.desc())
return cls.paginate(query, pagination_opts)
class AuditLog(object):
@@ -28,11 +29,11 @@ class AuditLog(object):
return cls._log(resource=resource, action=action)
@classmethod
def get_all_events(cls, user):
def get_all_events(cls, user, pagination_opts=None):
Authorization.check_atat_permission(
user, Permissions.VIEW_AUDIT_LOG, "view audit log"
)
return AuditEventQuery.get_all()
return AuditEventQuery.get_all(pagination_opts)
@classmethod
def _resource_type(cls, resource):

View File

@@ -5,6 +5,39 @@ from atst.domain.exceptions import NotFoundError
from atst.database import db
class Paginator(object):
"""
Uses the Flask-SQLAlchemy extension's pagination method to paginate
a query set.
Also acts as a proxy object so that the results of the query set can be iterated
over without needing to call `.items`.
"""
def __init__(self, query_set):
self.query_set = query_set
@classmethod
def paginate(cls, query, pagination_opts=None):
if pagination_opts is not None:
return cls(
query.paginate(
page=pagination_opts["page"], per_page=pagination_opts["per_page"]
)
)
else:
return query.all()
def __getattr__(self, name):
return getattr(self.query_set, name)
def __iter__(self):
return self.items.__iter__()
def __len__(self):
return self.items.__len__()
class Query(object):
model = None
@@ -35,3 +68,7 @@ class Query(object):
db.session.add(resource)
db.session.commit()
return resource
@classmethod
def paginate(cls, query, pagination_opts):
return Paginator.paginate(query, pagination_opts)

View File

@@ -76,6 +76,16 @@ def dateFromString(value, formatter="%m/%Y"):
return datetime.datetime.strptime(value, formatter)
def pageWindow(pagination, size=2):
page = pagination.page
num_pages = pagination.pages
over = max(0, page + size - num_pages)
under = min(0, page - size - 1)
return (max(1, (page - size) - over), min(num_pages, (page + size) - under))
def register_filters(app):
app.jinja_env.filters["iconSvg"] = iconSvg
app.jinja_env.filters["dollars"] = dollars
@@ -87,3 +97,4 @@ def register_filters(app):
app.jinja_env.filters["renderList"] = renderList
app.jinja_env.filters["formattedDate"] = formattedDate
app.jinja_env.filters["dateFromString"] = dateFromString
app.jinja_env.filters["pageWindow"] = pageWindow

View File

@@ -121,9 +121,17 @@ def logout():
return redirect(url_for(".root"))
def get_pagination_opts(request, default_page=1, default_per_page=100):
return {
"page": int(request.args.get("page", default_page)),
"per_page": int(request.args.get("perPage", default_per_page)),
}
@bp.route("/activity-history")
def activity_history():
audit_events = AuditLog.get_all_events(g.current_user)
pagination_opts = get_pagination_opts(request)
audit_events = AuditLog.get_all_events(g.current_user, pagination_opts)
return render_template("audit_log.html", audit_events=audit_events)