feature: add pagination on comments

Fixes: #354

Signed-off-by: Leonidas Spyropoulos <artafinde@archlinux.org>
This commit is contained in:
Leonidas Spyropoulos 2022-08-02 20:27:47 +03:00
parent 1d6335363c
commit 2c080b2ea9
No known key found for this signature in database
GPG key ID: 59E43E106B247368
3 changed files with 22 additions and 2 deletions

View file

@ -6,6 +6,9 @@ O = 0
# Default [P]er [P]age # Default [P]er [P]age
PP = 50 PP = 50
# Default Comments Per Page
COMMENTS_PER_PAGE = 10
# A whitelist of valid PP values # A whitelist of valid PP values
PP_WHITELIST = {50, 100, 250} PP_WHITELIST = {50, 100, 250}

View file

@ -3,7 +3,7 @@ from typing import Any
from fastapi import Request from fastapi import Request
from sqlalchemy import and_ from sqlalchemy import and_
from aurweb import config, db, l10n, util from aurweb import config, db, defaults, l10n, util
from aurweb.models import PackageBase, User from aurweb.models import PackageBase, User
from aurweb.models.package_comaintainer import PackageComaintainer from aurweb.models.package_comaintainer import PackageComaintainer
from aurweb.models.package_comment import PackageComment from aurweb.models.package_comment import PackageComment
@ -31,6 +31,12 @@ def make_context(request: Request, pkgbase: PackageBase,
if not context: if not context:
context = _make_context(request, pkgbase.Name) context = _make_context(request, pkgbase.Name)
# Per page and offset.
offset, per_page = util.sanitize_params(
request.query_params.get("O", defaults.O),
request.query_params.get("PP", defaults.COMMENTS_PER_PAGE))
context["O"] = offset
context["PP"] = per_page
context["git_clone_uri_anon"] = config.get("options", "git_clone_uri_anon") context["git_clone_uri_anon"] = config.get("options", "git_clone_uri_anon")
context["git_clone_uri_priv"] = config.get("options", "git_clone_uri_priv") context["git_clone_uri_priv"] = config.get("options", "git_clone_uri_priv")
context["pkgbase"] = pkgbase context["pkgbase"] = pkgbase
@ -44,9 +50,12 @@ def make_context(request: Request, pkgbase: PackageBase,
context["packages_count"] = pkgbase.packages.count() context["packages_count"] = pkgbase.packages.count()
context["keywords"] = pkgbase.keywords context["keywords"] = pkgbase.keywords
context["comments_total"] = pkgbase.comments.order_by(
PackageComment.CommentTS.desc()
).count()
context["comments"] = pkgbase.comments.order_by( context["comments"] = pkgbase.comments.order_by(
PackageComment.CommentTS.desc() PackageComment.CommentTS.desc()
) ).limit(per_page).offset(offset)
context["pinned_comments"] = pkgbase.comments.filter( context["pinned_comments"] = pkgbase.comments.filter(
PackageComment.PinnedTS != 0 PackageComment.PinnedTS != 0
).order_by(PackageComment.CommentTS.desc()) ).order_by(PackageComment.CommentTS.desc())

View file

@ -33,6 +33,14 @@
<span class="text">{{ "Latest Comments" | tr }}</span> <span class="text">{{ "Latest Comments" | tr }}</span>
<span class="arrow"></span> <span class="arrow"></span>
</h3> </h3>
{% set page = ((O / PP) | int) %}
{% set pages = ((comments_total / PP) | ceil) %}
{% if pages > 1 %}
<p class="comments-header-nav">
{{ page | pager_nav(comments_total, prefix) | safe }}
<p>
{% endif %}
</div> </div>
{% for comment in comments.all() %} {% for comment in comments.all() %}
{% include "partials/packages/comment.html" %} {% include "partials/packages/comment.html" %}