mirror of
https://gitlab.archlinux.org/archlinux/aurweb.git
synced 2025-02-03 10:43:03 +01:00
feat: add paging to package depends & required by
This patch does not include a javascript implementating, but provides a pure HTML/HTTP method of paging through these lists. Also fixes erroneous limiting. We now use a hardcoded limit of 20 by default. Signed-off-by: Kevin Morris <kevr@0cost.org>
This commit is contained in:
parent
d8564e446b
commit
ed41a4fe19
7 changed files with 125 additions and 16 deletions
|
@ -214,7 +214,7 @@ def query_notified(query: List[models.Package],
|
|||
return output
|
||||
|
||||
|
||||
def pkg_required(pkgname: str, provides: List[str], limit: int) \
|
||||
def pkg_required(pkgname: str, provides: List[str]) \
|
||||
-> List[PackageDependency]:
|
||||
"""
|
||||
Get dependencies that match a string in `[pkgname] + provides`.
|
||||
|
@ -227,8 +227,8 @@ def pkg_required(pkgname: str, provides: List[str], limit: int) \
|
|||
targets = set([pkgname] + provides)
|
||||
query = db.query(PackageDependency).join(Package).filter(
|
||||
PackageDependency.DepName.in_(targets)
|
||||
).order_by(Package.Name.asc()).limit(limit)
|
||||
return query.all()
|
||||
).order_by(Package.Name.asc())
|
||||
return query
|
||||
|
||||
|
||||
@register_filter("source_uri")
|
||||
|
|
|
@ -11,16 +11,25 @@ from aurweb.models.package_request import PENDING_ID, PackageRequest
|
|||
from aurweb.models.package_vote import PackageVote
|
||||
from aurweb.scripts import notify
|
||||
from aurweb.templates import make_context as _make_context
|
||||
from aurweb.templates import make_variable_context as _make_variable_context
|
||||
|
||||
|
||||
def make_context(request: Request, pkgbase: PackageBase) -> Dict[str, Any]:
|
||||
async def make_variable_context(request: Request, pkgbase: PackageBase) \
|
||||
-> Dict[str, Any]:
|
||||
ctx = await _make_variable_context(request, pkgbase.Name)
|
||||
return make_context(request, pkgbase, ctx)
|
||||
|
||||
|
||||
def make_context(request: Request, pkgbase: PackageBase,
|
||||
context: Dict[str, Any] = None) -> Dict[str, Any]:
|
||||
""" Make a basic context for package or pkgbase.
|
||||
|
||||
:param request: FastAPI request
|
||||
:param pkgbase: PackageBase instance
|
||||
:return: A pkgbase context without specific differences
|
||||
"""
|
||||
context = _make_context(request, pkgbase.Name)
|
||||
if not context:
|
||||
context = _make_context(request, pkgbase.Name)
|
||||
|
||||
context["git_clone_uri_anon"] = config.get("options", "git_clone_uri_anon")
|
||||
context["git_clone_uri_priv"] = config.get("options", "git_clone_uri_priv")
|
||||
|
|
|
@ -2,7 +2,7 @@ from collections import defaultdict
|
|||
from http import HTTPStatus
|
||||
from typing import Any, Dict, List
|
||||
|
||||
from fastapi import APIRouter, Form, Request, Response
|
||||
from fastapi import APIRouter, Form, Query, Request, Response
|
||||
|
||||
import aurweb.filters # noqa: F401
|
||||
|
||||
|
@ -33,7 +33,7 @@ async def packages_get(request: Request, context: Dict[str, Any],
|
|||
context["O"] = offset
|
||||
|
||||
# Limit PP to options.max_search_results
|
||||
max_search_results = aurweb.config.getint("options", "max_search_results")
|
||||
max_search_results = config.getint("options", "max_search_results")
|
||||
context["PP"] = per_page = min(per_page, max_search_results)
|
||||
|
||||
# Query search by.
|
||||
|
@ -123,7 +123,22 @@ async def packages(request: Request) -> Response:
|
|||
|
||||
|
||||
@router.get("/packages/{name}")
|
||||
async def package(request: Request, name: str) -> Response:
|
||||
async def package(request: Request, name: str,
|
||||
all_deps: bool = Query(default=False),
|
||||
all_reqs: bool = Query(default=False)) -> Response:
|
||||
"""
|
||||
Get a package by name.
|
||||
|
||||
By default, we limit the number of depends and requires results
|
||||
to 20. To bypass this and load all of them, which should be triggered
|
||||
via a "Show more" link near the limited listing.
|
||||
|
||||
:param name: Package.Name
|
||||
:param all_deps: Boolean indicating whether we should load all depends
|
||||
:param all_reqs: Boolean indicating whether we should load all requires
|
||||
:return: FastAPI Response
|
||||
"""
|
||||
|
||||
# Get the Package.
|
||||
pkg = get_pkg_or_base(name, models.Package)
|
||||
pkgbase = pkg.PackageBase
|
||||
|
@ -139,23 +154,41 @@ async def package(request: Request, name: str) -> Response:
|
|||
rels_data["r"].append(rel)
|
||||
|
||||
# Add our base information.
|
||||
context = pkgbaseutil.make_context(request, pkgbase)
|
||||
context = await pkgbaseutil.make_variable_context(request, pkgbase)
|
||||
|
||||
context.update(
|
||||
{
|
||||
"all_deps": all_deps,
|
||||
"all_reqs": all_reqs
|
||||
}
|
||||
)
|
||||
|
||||
context["package"] = pkg
|
||||
|
||||
# Package sources.
|
||||
context["sources"] = pkg.package_sources.order_by(
|
||||
models.PackageSource.Source.asc()).all()
|
||||
|
||||
# Listing metadata.
|
||||
context["max_listing"] = max_listing = 20
|
||||
|
||||
# Package dependencies.
|
||||
max_depends = config.getint("options", "max_depends")
|
||||
context["dependencies"] = pkg.package_dependencies.order_by(
|
||||
deps = pkg.package_dependencies.order_by(
|
||||
models.PackageDependency.DepTypeID.asc(),
|
||||
models.PackageDependency.DepName.asc()
|
||||
).limit(max_depends).all()
|
||||
)
|
||||
context["depends_count"] = deps.count()
|
||||
if not all_deps:
|
||||
deps = deps.limit(max_listing)
|
||||
context["dependencies"] = deps.all()
|
||||
|
||||
# Package requirements (other packages depend on this one).
|
||||
context["required_by"] = pkgutil.pkg_required(
|
||||
pkg.Name, [p.RelName for p in rels_data.get("p", [])], max_depends)
|
||||
reqs = pkgutil.pkg_required(
|
||||
pkg.Name, [p.RelName for p in rels_data.get("p", [])])
|
||||
context["reqs_count"] = reqs.count()
|
||||
if not all_reqs:
|
||||
reqs = reqs.limit(max_listing)
|
||||
context["required_by"] = reqs.all()
|
||||
|
||||
context["licenses"] = pkg.package_licenses
|
||||
|
||||
|
|
|
@ -100,6 +100,8 @@ async def make_variable_context(request: Request, title: str, next: str = None):
|
|||
for k, v in to_copy.items():
|
||||
context[k] = v
|
||||
|
||||
context["q"] = dict(request.query_params)
|
||||
|
||||
return context
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue