From 97f0beb9ca543b3e330c06be65734fe8fed189bd Mon Sep 17 00:00:00 2001 From: Kevin Chung Date: Tue, 2 Jun 2020 21:12:24 -0400 Subject: [PATCH] User pagination pages (#1464) * Replace user facing pagination with Flask SQLAlchemy Pagination objects * Closes #1353 I think this is a big improvement but I feel like this is harder to create a theme construct around. --- CTFd/teams.py | 16 +++------------- CTFd/themes/core/templates/teams/teams.html | 16 ++++++++-------- CTFd/themes/core/templates/users/users.html | 16 ++++++++-------- CTFd/users.py | 11 +++-------- 4 files changed, 22 insertions(+), 37 deletions(-) diff --git a/CTFd/teams.py b/CTFd/teams.py index 08fd1179..ede3984b 100644 --- a/CTFd/teams.py +++ b/CTFd/teams.py @@ -21,24 +21,14 @@ teams = Blueprint("teams", __name__) @require_team_mode def listing(): page = abs(request.args.get("page", 1, type=int)) - results_per_page = 50 - page_start = results_per_page * (page - 1) - page_end = results_per_page * (page - 1) + results_per_page - # TODO: Should teams confirm emails? - # if get_config('verify_emails'): - # count = Teams.query.filter_by(verified=True, banned=False).count() - # teams = Teams.query.filter_by(verified=True, banned=False).slice(page_start, page_end).all() - # else: - count = Teams.query.filter_by(hidden=False, banned=False).count() teams = ( Teams.query.filter_by(hidden=False, banned=False) - .slice(page_start, page_end) - .all() + .order_by(Teams.id.asc()) + .paginate(page=page, per_page=50) ) - pages = int(count / results_per_page) + (count % results_per_page > 0) - return render_template("teams/teams.html", teams=teams, pages=pages, curr_page=page) + return render_template("teams/teams.html", teams=teams) @teams.route("/teams/join", methods=["GET", "POST"]) diff --git a/CTFd/themes/core/templates/teams/teams.html b/CTFd/themes/core/templates/teams/teams.html index 77e731cd..2785aac4 100644 --- a/CTFd/themes/core/templates/teams/teams.html +++ b/CTFd/themes/core/templates/teams/teams.html @@ -22,7 +22,7 @@ - {% for team in teams %} + {% for team in teams.items %} {% if scores_visible() %} @@ -70,23 +70,23 @@ - {% if pages > 1 %} + {% if teams.pages > 1 %}
Page
- {% if curr_page != 1 %} - + {% if teams.page != 1 %} + <<< {% endif %} - {% if curr_page != pages %} - + {% if teams.next_num %} + >>> {% endif %} diff --git a/CTFd/themes/core/templates/users/users.html b/CTFd/themes/core/templates/users/users.html index 61755846..416e1c07 100644 --- a/CTFd/themes/core/templates/users/users.html +++ b/CTFd/themes/core/templates/users/users.html @@ -22,7 +22,7 @@ - {% for user in users %} + {% for user in users.items %} {% if scores_visible() %} @@ -73,23 +73,23 @@
- {% if pages > 1 %} + {% if users.pages > 1 %}
Page
- {% if curr_page != 1 %} - + {% if users.page != 1 %} + <<< {% endif %} - {% if curr_page != pages %} - + {% if users.next_num %} + >>> {% endif %} diff --git a/CTFd/users.py b/CTFd/users.py index b1a342a3..c7912856 100644 --- a/CTFd/users.py +++ b/CTFd/users.py @@ -16,19 +16,14 @@ users = Blueprint("users", __name__) @check_account_visibility def listing(): page = abs(request.args.get("page", 1, type=int)) - results_per_page = 50 - page_start = results_per_page * (page - 1) - page_end = results_per_page * (page - 1) + results_per_page - count = Users.query.filter_by(banned=False, hidden=False).count() users = ( Users.query.filter_by(banned=False, hidden=False) - .slice(page_start, page_end) - .all() + .order_by(Users.id.asc()) + .paginate(page=page, per_page=10) ) - pages = int(count / results_per_page) + (count % results_per_page > 0) - return render_template("users/users.html", users=users, pages=pages, curr_page=page) + return render_template("users/users.html", users=users) @users.route("/profile")