Add pagination

This commit is contained in:
Montana 2019-01-07 15:54:07 -05:00 committed by leigh-mil
parent 3731dd876e
commit ef6d9a2c5f
8 changed files with 51 additions and 40 deletions

View File

@ -12,6 +12,15 @@ class AuditEventQuery(Query):
query = db.session.query(cls.model).order_by(cls.model.time_created.desc()) query = db.session.query(cls.model).order_by(cls.model.time_created.desc())
return cls.paginate(query, pagination_opts) return cls.paginate(query, pagination_opts)
@classmethod
def get_ws_events(cls, workspace_id, pagination_opts):
query = (
db.session.query(cls.model)
.filter(cls.model.workspace_id == workspace_id)
.order_by(cls.model.time_created.desc())
)
return cls.paginate(query, pagination_opts)
class AuditLog(object): class AuditLog(object):
@classmethod @classmethod
@ -26,13 +35,11 @@ class AuditLog(object):
return AuditEventQuery.get_all(pagination_opts) return AuditEventQuery.get_all(pagination_opts)
@classmethod @classmethod
def get_workspace_events(cls, workspace_id): def get_workspace_events(cls, user, workspace_id, pagination_opts):
return ( Authorization.check_atat_permission(
db.session.query(AuditEvent) user, Permissions.VIEW_AUDIT_LOG, "view audit log"
.filter(AuditEvent.workspace_id == workspace_id)
.order_by(AuditEvent.time_created.desc())
.all()
) )
return AuditEventQuery.get_ws_events(workspace_id, pagination_opts)
@classmethod @classmethod
def get_by_resource(cls, resource_id): def get_by_resource(cls, resource_id):

View File

@ -1 +1,2 @@
from .query import Query from .query import Query
from .query import Paginator

View File

@ -17,6 +17,13 @@ class Paginator(object):
def __init__(self, query_set): def __init__(self, query_set):
self.query_set = query_set self.query_set = query_set
@classmethod
def get_pagination_opts(cls, 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)),
}
@classmethod @classmethod
def paginate(cls, query, pagination_opts=None): def paginate(cls, query, pagination_opts=None):
if pagination_opts is not None: if pagination_opts is not None:

View File

@ -12,6 +12,7 @@ from atst.domain.users import Users
from atst.domain.authnid import AuthenticationContext from atst.domain.authnid import AuthenticationContext
from atst.domain.audit_log import AuditLog from atst.domain.audit_log import AuditLog
from atst.domain.auth import logout as _logout from atst.domain.auth import logout as _logout
from atst.domain.common import Paginator
from atst.utils.flash import formatted_flash as flash from atst.utils.flash import formatted_flash as flash
@ -126,16 +127,9 @@ def logout():
return redirect(url_for(".root")) 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") @bp.route("/activity-history")
def activity_history(): def activity_history():
pagination_opts = get_pagination_opts(request) pagination_opts = Paginator.get_pagination_opts(request)
audit_events = AuditLog.get_all_events(g.current_user, pagination_opts) audit_events = AuditLog.get_all_events(g.current_user, pagination_opts)
return render_template("audit_log/audit_log.html", audit_events=audit_events) return render_template("audit_log/audit_log.html", audit_events=audit_events)

View File

@ -7,6 +7,7 @@ from atst.domain.reports import Reports
from atst.domain.workspaces import Workspaces from atst.domain.workspaces import Workspaces
from atst.domain.audit_log import AuditLog from atst.domain.audit_log import AuditLog
from atst.domain.authz import Authorization from atst.domain.authz import Authorization
from atst.domain.common import Paginator
from atst.forms.workspace import WorkspaceForm from atst.forms.workspace import WorkspaceForm
from atst.models.permissions import Permissions from atst.models.permissions import Permissions
@ -87,16 +88,16 @@ def workspace_reports(workspace_id):
def workspace_activity(workspace_id): def workspace_activity(workspace_id):
workspace = Workspaces.get(g.current_user, workspace_id) workspace = Workspaces.get(g.current_user, workspace_id)
Authorization.check_workspace_permission( Authorization.check_workspace_permission(
g.current_user, g.current_user, workspace, Permissions.VIEW_AUDIT_LOG, "view workspace reports"
workspace, )
# TODO: diff permission pagination_opts = Paginator.get_pagination_opts(http_request)
Permissions.VIEW_USAGE_DOLLARS, audit_events = AuditLog.get_workspace_events(
"view workspace reports", g.current_user, workspace_id, pagination_opts
) )
audit_events = AuditLog.get_workspace_events(workspace_id)
return render_template( return render_template(
"workspaces/activity/index.html", "workspaces/activity/index.html",
workspace_name=workspace.name, workspace_name=workspace.name,
workspace_id=workspace_id,
audit_events=audit_events, audit_events=audit_events,
) )

View File

@ -1,4 +1,4 @@
{% macro Page(pagination, route, i, label=None, disabled=False) -%} {% macro Page(pagination, route, i, label=None, disabled=False, workspace_id=None) -%}
{% set label = label or i %} {% set label = label or i %}
{% set button_class = "page usa-button " %} {% set button_class = "page usa-button " %}
@ -11,38 +11,38 @@
{% set button_class = button_class + "usa-button-secondary" %} {% set button_class = button_class + "usa-button-secondary" %}
{% endif %} {% endif %}
<a id="{{ label }}" type="button" class="{{ button_class }}" href="{{ url_for(route, page=i, perPage=pagination.per_page) if not disabled else 'null' }}">{{ label }}</a> <a id="{{ label }}" type="button" class="{{ button_class }}" href="{{ url_for(route, workspace_id=workspace_id, page=i, perPage=pagination.per_page) if not disabled else 'null' }}">{{ label }}</a>
{%- endmacro %} {%- endmacro %}
{% macro Pagination(pagination, route) -%} {% macro Pagination(pagination, route, workspace_id=None) -%}
<div class="pagination"> <div class="pagination">
{% if pagination.page == 1 %} {% if pagination.page == 1 %}
{% set max_page = [pagination.pages, 5] | min %} {% set max_page = [pagination.pages, 5] | min %}
{{ Page(pagination, route, 1, label="first", disabled=True) }} {{ Page(pagination, route, 1, label="first", disabled=True, workspace_id=workspace_id) }}
{{ Page(pagination, route, pagination.page - 1, label="prev", disabled=True) }} {{ Page(pagination, route, pagination.page - 1, label="prev", disabled=True, workspace_id=workspace_id) }}
{% for i in range(1, max_page + 1) %} {% for i in range(1, max_page + 1) %}
{{ Page(pagination, route, i) }} {{ Page(pagination, route, i, workspace_id=workspace_id) }}
{% endfor %} {% endfor %}
{{ Page(pagination, route, pagination.page + 1, label="next") }} {{ Page(pagination, route, pagination.page + 1, label="next", workspace_id=workspace_id) }}
{{ Page(pagination, route, pagination.pages, label="last") }} {{ Page(pagination, route, pagination.pages, label="last", workspace_id=workspace_id) }}
{% elif pagination.page == pagination.pages %} {% elif pagination.page == pagination.pages %}
{{ Page(pagination, route, 1, label="first") }} {{ Page(pagination, route, 1, label="first", workspace_id=workspace_id) }}
{{ Page(pagination, route, pagination.page - 1, label="prev") }} {{ Page(pagination, route, pagination.page - 1, label="prev", workspace_id=workspace_id) }}
{% for i in range(pagination.pages - 4, pagination.pages + 1) %} {% for i in range(pagination.pages - 4, pagination.pages + 1) %}
{{ Page(pagination, route, i) }} {{ Page(pagination, route, i, workspace_id=workspace_id) }}
{% endfor %} {% endfor %}
{{ Page(pagination, route, pagination.page + 1, label="next", disabled=True) }} {{ Page(pagination, route, pagination.page + 1, label="next", disabled=True, workspace_id=workspace_id) }}
{{ Page(pagination, route, pagination.pages, label="last", disabled=True) }} {{ Page(pagination, route, pagination.pages, label="last", disabled=True, workspace_id=workspace_id) }}
{% else %} {% else %}
{% set window = pagination | pageWindow %} {% set window = pagination | pageWindow %}
{{ Page(pagination, route, 1, label="first") }} {{ Page(pagination, route, 1, label="first", workspace_id=workspace_id) }}
{{ Page(pagination, route, pagination.page - 1, label="prev") }} {{ Page(pagination, route, pagination.page - 1, label="prev", workspace_id=workspace_id) }}
{% for i in range(window.0, window.1 + 1) %} {% for i in range(window.0, window.1 + 1) %}
{{ Page(pagination, route, i) }} {{ Page(pagination, route, i, workspace_id=workspace_id) }}
{% endfor %} {% endfor %}
{{ Page(pagination, route, pagination.page + 1, label="next") }} {{ Page(pagination, route, pagination.page + 1, label="next", workspace_id=workspace_id) }}
{{ Page(pagination, route, pagination.pages, label="last") }} {{ Page(pagination, route, pagination.pages, label="last", workspace_id=workspace_id) }}
{% endif %} {% endif %}
</div> </div>
{%- endmacro %} {%- endmacro %}

View File

@ -56,8 +56,7 @@
) }} ) }}
{% endif %} {% endif %}
<!-- TODO: diff permission --> {% if user_can(permissions.VIEW_AUDIT_LOG) %}
{% if user_can(permissions.VIEW_USAGE_DOLLARS) %}
{{ SidenavItem( {{ SidenavItem(
("navigation.workspace_navigation.activity_log" | translate), ("navigation.workspace_navigation.activity_log" | translate),
href=url_for("workspaces.workspace_activity", workspace_id=workspace.id), href=url_for("workspaces.workspace_activity", workspace_id=workspace.id),

View File

@ -1,4 +1,5 @@
{% extends "workspaces/base.html" %} {% extends "workspaces/base.html" %}
{% from "components/pagination.html" import Pagination %}
{% block workspace_content %} {% block workspace_content %}
@ -19,5 +20,6 @@
</ul> </ul>
</section> </section>
{{ Pagination(audit_events, 'workspaces.workspace_activity', workspace_id=workspace_id) }}
</div> </div>
{% endblock %} {% endblock %}