mirror of
https://gitlab.archlinux.org/archlinux/aurweb.git
synced 2025-02-03 10:43:03 +01:00
change(routers.packages): delete_package -> pkgbase_delete_instance
`delete_package` was processing package deletions through `Package` instances. This doesn't make sense; if we delete a package, we want to target its package base. This new function vastly simplifies the previous. Signed-off-by: Kevin Morris <kevr@0cost.org>
This commit is contained in:
parent
53fabdfaea
commit
c735f9868b
2 changed files with 23 additions and 50 deletions
|
@ -130,39 +130,18 @@ async def packages(request: Request) -> Response:
|
||||||
return await packages_get(request, context)
|
return await packages_get(request, context)
|
||||||
|
|
||||||
|
|
||||||
def delete_package(request: Request, package: models.Package,
|
def pkgbase_delete_instance(request: Request, pkgbase: models.PackageBase,
|
||||||
merge_into: models.PackageBase = None,
|
comments: str = str()) \
|
||||||
comments: str = str()):
|
-> List[notify.Notification]:
|
||||||
bases_to_delete = []
|
notifs = handle_request(request, DELETION_ID, pkgbase) + [
|
||||||
|
notify.DeleteNotification(request.user.ID, pkgbase.ID)
|
||||||
|
]
|
||||||
|
|
||||||
target = db.query(models.PackageBase).filter(
|
|
||||||
models.PackageBase.Name == merge_into
|
|
||||||
).first()
|
|
||||||
|
|
||||||
notifs = []
|
|
||||||
# In all cases, though, just delete the Package in question.
|
|
||||||
if package.PackageBase.packages.count() == 1:
|
|
||||||
notifs = handle_request(request, DELETION_ID, package.PackageBase,
|
|
||||||
target=target)
|
|
||||||
|
|
||||||
bases_to_delete.append(package.PackageBase)
|
|
||||||
|
|
||||||
with db.begin():
|
|
||||||
update_closure_comment(package.PackageBase, DELETION_ID, comments,
|
|
||||||
target=target)
|
|
||||||
|
|
||||||
# Prepare DeleteNotification.
|
|
||||||
notifs.append(
|
|
||||||
notify.DeleteNotification(request.user.ID, package.PackageBase.ID)
|
|
||||||
)
|
|
||||||
|
|
||||||
# Perform all the deletions.
|
|
||||||
with db.begin():
|
with db.begin():
|
||||||
db.delete(package)
|
update_closure_comment(pkgbase, DELETION_ID, comments)
|
||||||
db.delete_all(bases_to_delete)
|
db.delete(pkgbase)
|
||||||
|
|
||||||
# Send out all the notifications.
|
return notifs
|
||||||
util.apply_all(notifs, lambda n: n.send())
|
|
||||||
|
|
||||||
|
|
||||||
async def make_single_context(request: Request,
|
async def make_single_context(request: Request,
|
||||||
|
@ -675,9 +654,8 @@ async def pkgbase_request_post(request: Request, name: str,
|
||||||
logger.debug(f"New request #{pkgreq.ID} is marked for auto-orphan.")
|
logger.debug(f"New request #{pkgreq.ID} is marked for auto-orphan.")
|
||||||
elif type == "deletion" and is_maintainer and outdated:
|
elif type == "deletion" and is_maintainer and outdated:
|
||||||
# This request should be auto-accepted.
|
# This request should be auto-accepted.
|
||||||
packages = pkgbase.packages.all()
|
notifs = pkgbase_delete_instance(request, pkgbase, comments=comments)
|
||||||
for package in packages:
|
util.apply_all(notifs, lambda n: n.send())
|
||||||
delete_package(request, package)
|
|
||||||
logger.debug(f"New request #{pkgreq.ID} is marked for auto-deletion.")
|
logger.debug(f"New request #{pkgreq.ID} is marked for auto-deletion.")
|
||||||
|
|
||||||
# Redirect the submitting user to /packages.
|
# Redirect the submitting user to /packages.
|
||||||
|
@ -1054,11 +1032,8 @@ async def pkgbase_delete_post(request: Request, name: str,
|
||||||
for pkgreq in requests:
|
for pkgreq in requests:
|
||||||
pkgreq.ClosureComment = comments
|
pkgreq.ClosureComment = comments
|
||||||
|
|
||||||
# Obtain deletion locks and delete the packages.
|
notifs = pkgbase_delete_instance(request, pkgbase, comments=comments)
|
||||||
packages = pkgbase.packages.all()
|
util.apply_all(notifs, lambda n: n.send())
|
||||||
for package in packages:
|
|
||||||
delete_package(request, package, comments=comments)
|
|
||||||
|
|
||||||
return RedirectResponse("/packages", status_code=HTTPStatus.SEE_OTHER)
|
return RedirectResponse("/packages", status_code=HTTPStatus.SEE_OTHER)
|
||||||
|
|
||||||
|
|
||||||
|
@ -1255,10 +1230,6 @@ async def packages_delete(request: Request, package_ids: List[int] = [],
|
||||||
if not request.user.has_credential(creds.PKGBASE_DELETE):
|
if not request.user.has_credential(creds.PKGBASE_DELETE):
|
||||||
return (False, ["You do not have permission to delete packages."])
|
return (False, ["You do not have permission to delete packages."])
|
||||||
|
|
||||||
# A "memo" used to store names of packages that we delete.
|
|
||||||
# We'll use this to log out a message about the deletions that occurred.
|
|
||||||
deleted_pkgs = []
|
|
||||||
|
|
||||||
# set-ify package_ids and query the database for related records.
|
# set-ify package_ids and query the database for related records.
|
||||||
package_ids = set(package_ids)
|
package_ids = set(package_ids)
|
||||||
packages = db.query(models.Package).filter(
|
packages = db.query(models.Package).filter(
|
||||||
|
@ -1270,16 +1241,18 @@ async def packages_delete(request: Request, package_ids: List[int] = [],
|
||||||
# TODO: This error has not yet been translated.
|
# TODO: This error has not yet been translated.
|
||||||
return (False, ["One of the packages you selected does not exist."])
|
return (False, ["One of the packages you selected does not exist."])
|
||||||
|
|
||||||
# Now let's actually walk through and delete all of the packages,
|
# Make a set out of all package bases related to `packages`.
|
||||||
# using the same method we use in our /pkgbase/{name}/delete route.
|
bases = {pkg.PackageBase for pkg in packages}
|
||||||
for pkg in packages:
|
deleted_bases, notifs = [], []
|
||||||
deleted_pkgs.append(pkg.Name)
|
for pkgbase in bases:
|
||||||
delete_package(request, pkg)
|
deleted_bases.append(pkgbase.Name)
|
||||||
|
notifs += pkgbase_delete_instance(request, pkgbase)
|
||||||
|
|
||||||
# Log out the fact that this happened for accountability.
|
# Log out the fact that this happened for accountability.
|
||||||
logger.info(f"Privileged user '{request.user.Username}' deleted the "
|
logger.info(f"Privileged user '{request.user.Username}' deleted the "
|
||||||
f"following packages: {str(deleted_pkgs)}.")
|
f"following package bases: {str(deleted_bases)}.")
|
||||||
|
|
||||||
|
util.apply_all(notifs, lambda n: n.send())
|
||||||
return (True, ["The selected packages have been deleted."])
|
return (True, ["The selected packages have been deleted."])
|
||||||
|
|
||||||
# A mapping of action string -> callback functions used within the
|
# A mapping of action string -> callback functions used within the
|
||||||
|
|
|
@ -2483,9 +2483,9 @@ def test_packages_post_delete(caplog: pytest.fixture, client: TestClient,
|
||||||
assert successes[0].text.strip() == expected
|
assert successes[0].text.strip() == expected
|
||||||
|
|
||||||
# Expect that the package deletion was logged.
|
# Expect that the package deletion was logged.
|
||||||
packages = [package.Name]
|
pkgbases = [package.PackageBase.Name]
|
||||||
expected = (f"Privileged user '{tu_user.Username}' deleted the "
|
expected = (f"Privileged user '{tu_user.Username}' deleted the "
|
||||||
f"following packages: {str(packages)}.")
|
f"following package bases: {str(pkgbases)}.")
|
||||||
assert expected in caplog.text
|
assert expected in caplog.text
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue