mirror of
https://gitlab.archlinux.org/archlinux/aurweb.git
synced 2025-02-03 10:43:03 +01:00
style: Run pre-commit
This commit is contained in:
parent
b47882b114
commit
9c6c13b78a
235 changed files with 7180 additions and 5628 deletions
|
@ -7,46 +7,55 @@ from aurweb import config, db, l10n, time, util
|
|||
from aurweb.exceptions import InvariantError
|
||||
from aurweb.models import PackageBase, PackageRequest, User
|
||||
from aurweb.models.package_request import ACCEPTED_ID, PENDING_ID, REJECTED_ID
|
||||
from aurweb.models.request_type import DELETION, DELETION_ID, MERGE, MERGE_ID, ORPHAN, ORPHAN_ID
|
||||
from aurweb.models.request_type import (
|
||||
DELETION,
|
||||
DELETION_ID,
|
||||
MERGE,
|
||||
MERGE_ID,
|
||||
ORPHAN,
|
||||
ORPHAN_ID,
|
||||
)
|
||||
from aurweb.scripts import notify
|
||||
|
||||
|
||||
class ClosureFactory:
|
||||
""" A factory class used to autogenerate closure comments. """
|
||||
"""A factory class used to autogenerate closure comments."""
|
||||
|
||||
REQTYPE_NAMES = {
|
||||
DELETION_ID: DELETION,
|
||||
MERGE_ID: MERGE,
|
||||
ORPHAN_ID: ORPHAN
|
||||
}
|
||||
REQTYPE_NAMES = {DELETION_ID: DELETION, MERGE_ID: MERGE, ORPHAN_ID: ORPHAN}
|
||||
|
||||
def _deletion_closure(self, requester: User,
|
||||
pkgbase: PackageBase,
|
||||
target: PackageBase = None):
|
||||
return (f"[Autogenerated] Accepted deletion for {pkgbase.Name}.")
|
||||
def _deletion_closure(
|
||||
self, requester: User, pkgbase: PackageBase, target: PackageBase = None
|
||||
):
|
||||
return f"[Autogenerated] Accepted deletion for {pkgbase.Name}."
|
||||
|
||||
def _merge_closure(self, requester: User,
|
||||
pkgbase: PackageBase,
|
||||
target: PackageBase = None):
|
||||
return (f"[Autogenerated] Accepted merge for {pkgbase.Name} "
|
||||
f"into {target.Name}.")
|
||||
def _merge_closure(
|
||||
self, requester: User, pkgbase: PackageBase, target: PackageBase = None
|
||||
):
|
||||
return (
|
||||
f"[Autogenerated] Accepted merge for {pkgbase.Name} " f"into {target.Name}."
|
||||
)
|
||||
|
||||
def _orphan_closure(self, requester: User,
|
||||
pkgbase: PackageBase,
|
||||
target: PackageBase = None):
|
||||
return (f"[Autogenerated] Accepted orphan for {pkgbase.Name}.")
|
||||
def _orphan_closure(
|
||||
self, requester: User, pkgbase: PackageBase, target: PackageBase = None
|
||||
):
|
||||
return f"[Autogenerated] Accepted orphan for {pkgbase.Name}."
|
||||
|
||||
def _rejected_merge_closure(self, requester: User,
|
||||
pkgbase: PackageBase,
|
||||
target: PackageBase = None):
|
||||
return (f"[Autogenerated] Another request to merge {pkgbase.Name} "
|
||||
f"into {target.Name} has rendered this request invalid.")
|
||||
def _rejected_merge_closure(
|
||||
self, requester: User, pkgbase: PackageBase, target: PackageBase = None
|
||||
):
|
||||
return (
|
||||
f"[Autogenerated] Another request to merge {pkgbase.Name} "
|
||||
f"into {target.Name} has rendered this request invalid."
|
||||
)
|
||||
|
||||
def get_closure(self, reqtype_id: int,
|
||||
requester: User,
|
||||
pkgbase: PackageBase,
|
||||
target: PackageBase = None,
|
||||
status: int = ACCEPTED_ID) -> str:
|
||||
def get_closure(
|
||||
self,
|
||||
reqtype_id: int,
|
||||
requester: User,
|
||||
pkgbase: PackageBase,
|
||||
target: PackageBase = None,
|
||||
status: int = ACCEPTED_ID,
|
||||
) -> str:
|
||||
"""
|
||||
Return a closure comment handled by this class.
|
||||
|
||||
|
@ -69,8 +78,9 @@ class ClosureFactory:
|
|||
return handler(requester, pkgbase, target)
|
||||
|
||||
|
||||
def update_closure_comment(pkgbase: PackageBase, reqtype_id: int,
|
||||
comments: str, target: PackageBase = None) -> None:
|
||||
def update_closure_comment(
|
||||
pkgbase: PackageBase, reqtype_id: int, comments: str, target: PackageBase = None
|
||||
) -> None:
|
||||
"""
|
||||
Update all pending requests related to `pkgbase` with a closure comment.
|
||||
|
||||
|
@ -90,8 +100,10 @@ def update_closure_comment(pkgbase: PackageBase, reqtype_id: int,
|
|||
return
|
||||
|
||||
query = pkgbase.requests.filter(
|
||||
and_(PackageRequest.ReqTypeID == reqtype_id,
|
||||
PackageRequest.Status == PENDING_ID))
|
||||
and_(
|
||||
PackageRequest.ReqTypeID == reqtype_id, PackageRequest.Status == PENDING_ID
|
||||
)
|
||||
)
|
||||
if reqtype_id == MERGE_ID:
|
||||
query = query.filter(PackageRequest.MergeBaseName == target.Name)
|
||||
|
||||
|
@ -100,9 +112,8 @@ def update_closure_comment(pkgbase: PackageBase, reqtype_id: int,
|
|||
|
||||
|
||||
def verify_orphan_request(user: User, pkgbase: PackageBase):
|
||||
""" Verify that an undue orphan request exists in `requests`. """
|
||||
requests = pkgbase.requests.filter(
|
||||
PackageRequest.ReqTypeID == ORPHAN_ID)
|
||||
"""Verify that an undue orphan request exists in `requests`."""
|
||||
requests = pkgbase.requests.filter(PackageRequest.ReqTypeID == ORPHAN_ID)
|
||||
for pkgreq in requests:
|
||||
idle_time = config.getint("options", "request_idle_time")
|
||||
time_delta = time.utcnow() - pkgreq.RequestTS
|
||||
|
@ -115,9 +126,13 @@ def verify_orphan_request(user: User, pkgbase: PackageBase):
|
|||
return False
|
||||
|
||||
|
||||
def close_pkgreq(pkgreq: PackageRequest, closer: User,
|
||||
pkgbase: PackageBase, target: Optional[PackageBase],
|
||||
status: int) -> None:
|
||||
def close_pkgreq(
|
||||
pkgreq: PackageRequest,
|
||||
closer: User,
|
||||
pkgbase: PackageBase,
|
||||
target: Optional[PackageBase],
|
||||
status: int,
|
||||
) -> None:
|
||||
"""
|
||||
Close a package request with `pkgreq`.Status == `status`.
|
||||
|
||||
|
@ -130,16 +145,15 @@ def close_pkgreq(pkgreq: PackageRequest, closer: User,
|
|||
now = time.utcnow()
|
||||
pkgreq.Status = status
|
||||
pkgreq.Closer = closer
|
||||
pkgreq.ClosureComment = (
|
||||
pkgreq.ClosureComment or ClosureFactory().get_closure(
|
||||
pkgreq.ReqTypeID, closer, pkgbase, target, status)
|
||||
pkgreq.ClosureComment = pkgreq.ClosureComment or ClosureFactory().get_closure(
|
||||
pkgreq.ReqTypeID, closer, pkgbase, target, status
|
||||
)
|
||||
pkgreq.ClosedTS = now
|
||||
|
||||
|
||||
def handle_request(request: Request, reqtype_id: int,
|
||||
pkgbase: PackageBase,
|
||||
target: PackageBase = None) -> list[notify.Notification]:
|
||||
def handle_request(
|
||||
request: Request, reqtype_id: int, pkgbase: PackageBase, target: PackageBase = None
|
||||
) -> list[notify.Notification]:
|
||||
"""
|
||||
Handle package requests before performing an action.
|
||||
|
||||
|
@ -165,17 +179,20 @@ def handle_request(request: Request, reqtype_id: int,
|
|||
if reqtype_id == ORPHAN_ID:
|
||||
if not verify_orphan_request(request.user, pkgbase):
|
||||
_ = l10n.get_translator_for_request(request)
|
||||
raise InvariantError(_(
|
||||
"No due existing orphan requests to accept for %s."
|
||||
) % pkgbase.Name)
|
||||
raise InvariantError(
|
||||
_("No due existing orphan requests to accept for %s.") % pkgbase.Name
|
||||
)
|
||||
|
||||
# Produce a base query for requests related to `pkgbase`, based
|
||||
# on ReqTypeID matching `reqtype_id`, pending status and a correct
|
||||
# PackagBaseName column.
|
||||
query: orm.Query = pkgbase.requests.filter(
|
||||
and_(PackageRequest.ReqTypeID == reqtype_id,
|
||||
PackageRequest.Status == PENDING_ID,
|
||||
PackageRequest.PackageBaseName == pkgbase.Name))
|
||||
and_(
|
||||
PackageRequest.ReqTypeID == reqtype_id,
|
||||
PackageRequest.Status == PENDING_ID,
|
||||
PackageRequest.PackageBaseName == pkgbase.Name,
|
||||
)
|
||||
)
|
||||
|
||||
# Build a query for records we should accept. For merge requests,
|
||||
# this is specific to a matching MergeBaseName. For others, this
|
||||
|
@ -183,8 +200,7 @@ def handle_request(request: Request, reqtype_id: int,
|
|||
accept_query: orm.Query = query
|
||||
if target:
|
||||
# If a `target` was supplied, filter by MergeBaseName
|
||||
accept_query = query.filter(
|
||||
PackageRequest.MergeBaseName == target.Name)
|
||||
accept_query = query.filter(PackageRequest.MergeBaseName == target.Name)
|
||||
|
||||
# Build an accept list out of `accept_query`.
|
||||
to_accept: list[PackageRequest] = accept_query.all()
|
||||
|
@ -203,14 +219,16 @@ def handle_request(request: Request, reqtype_id: int,
|
|||
if not to_accept:
|
||||
utcnow = time.utcnow()
|
||||
with db.begin():
|
||||
pkgreq = db.create(PackageRequest,
|
||||
ReqTypeID=reqtype_id,
|
||||
RequestTS=utcnow,
|
||||
User=request.user,
|
||||
PackageBase=pkgbase,
|
||||
PackageBaseName=pkgbase.Name,
|
||||
Comments="Autogenerated by aurweb.",
|
||||
ClosureComment=str())
|
||||
pkgreq = db.create(
|
||||
PackageRequest,
|
||||
ReqTypeID=reqtype_id,
|
||||
RequestTS=utcnow,
|
||||
User=request.user,
|
||||
PackageBase=pkgbase,
|
||||
PackageBaseName=pkgbase.Name,
|
||||
Comments="Autogenerated by aurweb.",
|
||||
ClosureComment=str(),
|
||||
)
|
||||
|
||||
# If it's a merge request, set MergeBaseName to `target`.Name.
|
||||
if pkgreq.ReqTypeID == MERGE_ID:
|
||||
|
@ -222,15 +240,20 @@ def handle_request(request: Request, reqtype_id: int,
|
|||
|
||||
# Update requests with their new status and closures.
|
||||
with db.begin():
|
||||
util.apply_all(to_accept, lambda p: close_pkgreq(
|
||||
p, request.user, pkgbase, target, ACCEPTED_ID))
|
||||
util.apply_all(to_reject, lambda p: close_pkgreq(
|
||||
p, request.user, pkgbase, target, REJECTED_ID))
|
||||
util.apply_all(
|
||||
to_accept,
|
||||
lambda p: close_pkgreq(p, request.user, pkgbase, target, ACCEPTED_ID),
|
||||
)
|
||||
util.apply_all(
|
||||
to_reject,
|
||||
lambda p: close_pkgreq(p, request.user, pkgbase, target, REJECTED_ID),
|
||||
)
|
||||
|
||||
# Create RequestCloseNotifications for all requests involved.
|
||||
for pkgreq in (to_accept + to_reject):
|
||||
for pkgreq in to_accept + to_reject:
|
||||
notif = notify.RequestCloseNotification(
|
||||
request.user.ID, pkgreq.ID, pkgreq.status_display())
|
||||
request.user.ID, pkgreq.ID, pkgreq.status_display()
|
||||
)
|
||||
notifs.append(notif)
|
||||
|
||||
# Return notifications to the caller for sending.
|
||||
|
|
|
@ -4,7 +4,12 @@ from sqlalchemy import and_, case, or_, orm
|
|||
|
||||
from aurweb import db, models
|
||||
from aurweb.models import Package, PackageBase, User
|
||||
from aurweb.models.dependency_type import CHECKDEPENDS_ID, DEPENDS_ID, MAKEDEPENDS_ID, OPTDEPENDS_ID
|
||||
from aurweb.models.dependency_type import (
|
||||
CHECKDEPENDS_ID,
|
||||
DEPENDS_ID,
|
||||
MAKEDEPENDS_ID,
|
||||
OPTDEPENDS_ID,
|
||||
)
|
||||
from aurweb.models.package_comaintainer import PackageComaintainer
|
||||
from aurweb.models.package_keyword import PackageKeyword
|
||||
from aurweb.models.package_notification import PackageNotification
|
||||
|
|
|
@ -3,7 +3,6 @@ from http import HTTPStatus
|
|||
from typing import Tuple, Union
|
||||
|
||||
import orjson
|
||||
|
||||
from fastapi import HTTPException
|
||||
from sqlalchemy import orm
|
||||
|
||||
|
@ -43,10 +42,10 @@ def dep_optdepends_extra(dep: models.PackageDependency) -> str:
|
|||
|
||||
@register_filter("dep_extra")
|
||||
def dep_extra(dep: models.PackageDependency) -> str:
|
||||
""" Some dependency types have extra text added to their
|
||||
"""Some dependency types have extra text added to their
|
||||
display. This function provides that output. However, it
|
||||
**assumes** that the dep passed is bound to a valid one
|
||||
of: depends, makedepends, checkdepends or optdepends. """
|
||||
of: depends, makedepends, checkdepends or optdepends."""
|
||||
f = globals().get(f"dep_{dep.DependencyType.Name}_extra")
|
||||
return f(dep)
|
||||
|
||||
|
@ -61,13 +60,13 @@ def dep_extra_desc(dep: models.PackageDependency) -> str:
|
|||
|
||||
@register_filter("pkgname_link")
|
||||
def pkgname_link(pkgname: str) -> str:
|
||||
record = db.query(Package).filter(
|
||||
Package.Name == pkgname).exists()
|
||||
record = db.query(Package).filter(Package.Name == pkgname).exists()
|
||||
if db.query(record).scalar():
|
||||
return f"/packages/{pkgname}"
|
||||
|
||||
official = db.query(OfficialProvider).filter(
|
||||
OfficialProvider.Name == pkgname).exists()
|
||||
official = (
|
||||
db.query(OfficialProvider).filter(OfficialProvider.Name == pkgname).exists()
|
||||
)
|
||||
if db.query(official).scalar():
|
||||
base = "/".join([OFFICIAL_BASE, "packages"])
|
||||
return f"{base}/?q={pkgname}"
|
||||
|
@ -83,17 +82,15 @@ def package_link(package: Union[Package, OfficialProvider]) -> str:
|
|||
|
||||
@register_filter("provides_markup")
|
||||
def provides_markup(provides: Providers) -> str:
|
||||
return ", ".join([
|
||||
f'<a href="{package_link(pkg)}">{pkg.Name}</a>'
|
||||
for pkg in provides
|
||||
])
|
||||
return ", ".join(
|
||||
[f'<a href="{package_link(pkg)}">{pkg.Name}</a>' for pkg in provides]
|
||||
)
|
||||
|
||||
|
||||
def get_pkg_or_base(
|
||||
name: str,
|
||||
cls: Union[models.Package, models.PackageBase] = models.PackageBase) \
|
||||
-> Union[models.Package, models.PackageBase]:
|
||||
""" Get a PackageBase instance by its name or raise a 404 if
|
||||
name: str, cls: Union[models.Package, models.PackageBase] = models.PackageBase
|
||||
) -> Union[models.Package, models.PackageBase]:
|
||||
"""Get a PackageBase instance by its name or raise a 404 if
|
||||
it can't be found in the database.
|
||||
|
||||
:param name: {Package,PackageBase}.Name
|
||||
|
@ -109,8 +106,7 @@ def get_pkg_or_base(
|
|||
return instance
|
||||
|
||||
|
||||
def get_pkgbase_comment(pkgbase: models.PackageBase, id: int) \
|
||||
-> models.PackageComment:
|
||||
def get_pkgbase_comment(pkgbase: models.PackageBase, id: int) -> models.PackageComment:
|
||||
comment = pkgbase.comments.filter(models.PackageComment.ID == id).first()
|
||||
if not comment:
|
||||
raise HTTPException(status_code=HTTPStatus.NOT_FOUND)
|
||||
|
@ -122,9 +118,8 @@ def out_of_date(packages: orm.Query) -> orm.Query:
|
|||
return packages.filter(models.PackageBase.OutOfDateTS.isnot(None))
|
||||
|
||||
|
||||
def updated_packages(limit: int = 0,
|
||||
cache_ttl: int = 600) -> list[models.Package]:
|
||||
""" Return a list of valid Package objects ordered by their
|
||||
def updated_packages(limit: int = 0, cache_ttl: int = 600) -> list[models.Package]:
|
||||
"""Return a list of valid Package objects ordered by their
|
||||
ModifiedTS column in descending order from cache, after setting
|
||||
the cache when no key yet exists.
|
||||
|
||||
|
@ -139,10 +134,11 @@ def updated_packages(limit: int = 0,
|
|||
return orjson.loads(packages)
|
||||
|
||||
with db.begin():
|
||||
query = db.query(models.Package).join(models.PackageBase).filter(
|
||||
models.PackageBase.PackagerUID.isnot(None)
|
||||
).order_by(
|
||||
models.PackageBase.ModifiedTS.desc()
|
||||
query = (
|
||||
db.query(models.Package)
|
||||
.join(models.PackageBase)
|
||||
.filter(models.PackageBase.PackagerUID.isnot(None))
|
||||
.order_by(models.PackageBase.ModifiedTS.desc())
|
||||
)
|
||||
|
||||
if limit:
|
||||
|
@ -152,13 +148,13 @@ def updated_packages(limit: int = 0,
|
|||
for pkg in query:
|
||||
# For each Package returned by the query, append a dict
|
||||
# containing Package columns we're interested in.
|
||||
packages.append({
|
||||
"Name": pkg.Name,
|
||||
"Version": pkg.Version,
|
||||
"PackageBase": {
|
||||
"ModifiedTS": pkg.PackageBase.ModifiedTS
|
||||
packages.append(
|
||||
{
|
||||
"Name": pkg.Name,
|
||||
"Version": pkg.Version,
|
||||
"PackageBase": {"ModifiedTS": pkg.PackageBase.ModifiedTS},
|
||||
}
|
||||
})
|
||||
)
|
||||
|
||||
# Store the JSON serialization of the package_updates key into Redis.
|
||||
redis.set("package_updates", orjson.dumps(packages))
|
||||
|
@ -168,9 +164,8 @@ def updated_packages(limit: int = 0,
|
|||
return packages
|
||||
|
||||
|
||||
def query_voted(query: list[models.Package],
|
||||
user: models.User) -> dict[int, bool]:
|
||||
""" Produce a dictionary of package base ID keys to boolean values,
|
||||
def query_voted(query: list[models.Package], user: models.User) -> dict[int, bool]:
|
||||
"""Produce a dictionary of package base ID keys to boolean values,
|
||||
which indicate whether or not the package base has a vote record
|
||||
related to user.
|
||||
|
||||
|
@ -180,20 +175,18 @@ def query_voted(query: list[models.Package],
|
|||
"""
|
||||
output = defaultdict(bool)
|
||||
query_set = {pkg.PackageBaseID for pkg in query}
|
||||
voted = db.query(models.PackageVote).join(
|
||||
models.PackageBase,
|
||||
models.PackageBase.ID.in_(query_set)
|
||||
).filter(
|
||||
models.PackageVote.UsersID == user.ID
|
||||
voted = (
|
||||
db.query(models.PackageVote)
|
||||
.join(models.PackageBase, models.PackageBase.ID.in_(query_set))
|
||||
.filter(models.PackageVote.UsersID == user.ID)
|
||||
)
|
||||
for vote in voted:
|
||||
output[vote.PackageBase.ID] = True
|
||||
return output
|
||||
|
||||
|
||||
def query_notified(query: list[models.Package],
|
||||
user: models.User) -> dict[int, bool]:
|
||||
""" Produce a dictionary of package base ID keys to boolean values,
|
||||
def query_notified(query: list[models.Package], user: models.User) -> dict[int, bool]:
|
||||
"""Produce a dictionary of package base ID keys to boolean values,
|
||||
which indicate whether or not the package base has a notification
|
||||
record related to user.
|
||||
|
||||
|
@ -203,19 +196,17 @@ def query_notified(query: list[models.Package],
|
|||
"""
|
||||
output = defaultdict(bool)
|
||||
query_set = {pkg.PackageBaseID for pkg in query}
|
||||
notified = db.query(models.PackageNotification).join(
|
||||
models.PackageBase,
|
||||
models.PackageBase.ID.in_(query_set)
|
||||
).filter(
|
||||
models.PackageNotification.UserID == user.ID
|
||||
notified = (
|
||||
db.query(models.PackageNotification)
|
||||
.join(models.PackageBase, models.PackageBase.ID.in_(query_set))
|
||||
.filter(models.PackageNotification.UserID == user.ID)
|
||||
)
|
||||
for notif in notified:
|
||||
output[notif.PackageBase.ID] = True
|
||||
return output
|
||||
|
||||
|
||||
def pkg_required(pkgname: str, provides: list[str]) \
|
||||
-> list[PackageDependency]:
|
||||
def pkg_required(pkgname: str, provides: list[str]) -> list[PackageDependency]:
|
||||
"""
|
||||
Get dependencies that match a string in `[pkgname] + provides`.
|
||||
|
||||
|
@ -225,9 +216,12 @@ def pkg_required(pkgname: str, provides: list[str]) \
|
|||
:return: List of PackageDependency instances
|
||||
"""
|
||||
targets = set([pkgname] + provides)
|
||||
query = db.query(PackageDependency).join(Package).filter(
|
||||
PackageDependency.DepName.in_(targets)
|
||||
).order_by(Package.Name.asc())
|
||||
query = (
|
||||
db.query(PackageDependency)
|
||||
.join(Package)
|
||||
.filter(PackageDependency.DepName.in_(targets))
|
||||
.order_by(Package.Name.asc())
|
||||
)
|
||||
return query
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue