mirror of
https://gitlab.archlinux.org/archlinux/aurweb.git
synced 2025-02-03 10:43:03 +01:00
feat(FastAPI): add /pkgbase/{name}/request (post)
This change implements the FastAPI version of the /pkgbase/{name}/request form's action. Changes from PHP: - Additional errors are now displayed for the **merge_into** field, which are only displayed when the Merge type is selected. - If the **merge_into** field is empty, a new error is displayed: 'The "Merge into" field must not be empty.' - If the **merge_into** field is given the name of a package base which does not exist, a new error is displayed: "The package base you want to merge into does not exist." - If the **merge_into** field is given the name of the package base that a request is being created for, a new error is displayed: "You cannot merge a package base into itself." - When an error is encountered, users are now brought back to the request form which they submitted and an error is displayed at the top of the page. - If an invalid type is provided, users are returned to a BAD_REQUEST status rendering of the request form. Signed-off-by: Kevin Morris <kevr@0cost.org>
This commit is contained in:
parent
ad8369395e
commit
1c031638c6
4 changed files with 247 additions and 1 deletions
|
@ -582,3 +582,72 @@ async def package_request(request: Request, name: str):
|
|||
|
||||
context["pkgbase"] = pkgbase
|
||||
return render_template(request, "pkgbase/request.html", context)
|
||||
|
||||
|
||||
@router.post("/pkgbase/{name}/request")
|
||||
@auth_required(True)
|
||||
async def pkgbase_request_post(request: Request, name: str,
|
||||
type: str = Form(...),
|
||||
merge_into: str = Form(default=None),
|
||||
comments: str = Form(default=str())):
|
||||
pkgbase = get_pkg_or_base(name, PackageBase)
|
||||
|
||||
# Create our render context.
|
||||
context = make_context(request, "Submit Request")
|
||||
context["pkgbase"] = pkgbase
|
||||
if type not in {"deletion", "merge", "orphan"}:
|
||||
# In the case that someone crafted a POST request with an invalid
|
||||
# type, just return them to the request form with BAD_REQUEST status.
|
||||
return render_template(request, "pkgbase/request.html", context,
|
||||
status_code=HTTPStatus.BAD_REQUEST)
|
||||
|
||||
if not comments:
|
||||
context["errors"] = ["The comment field must not be empty."]
|
||||
return render_template(request, "pkgbase/request.html", context)
|
||||
|
||||
if type == "merge":
|
||||
# Perform merge-related checks.
|
||||
if not merge_into:
|
||||
# TODO: This error needs to be translated.
|
||||
context["errors"] = ['The "Merge into" field must not be empty.']
|
||||
return render_template(request, "pkgbase/request.html", context)
|
||||
|
||||
target = db.query(PackageBase).filter(
|
||||
PackageBase.Name == merge_into
|
||||
).first()
|
||||
if not target:
|
||||
# TODO: This error needs to be translated.
|
||||
context["errors"] = [
|
||||
"The package base you want to merge into does not exist."
|
||||
]
|
||||
return render_template(request, "pkgbase/request.html", context)
|
||||
|
||||
if target.ID == pkgbase.ID:
|
||||
# TODO: This error needs to be translated.
|
||||
context["errors"] = [
|
||||
"You cannot merge a package base into itself."
|
||||
]
|
||||
return render_template(request, "pkgbase/request.html", context)
|
||||
|
||||
# All good. Create a new PackageRequest based on the given type.
|
||||
now = int(datetime.utcnow().timestamp())
|
||||
reqtype = db.query(RequestType, RequestType.Name == type).first()
|
||||
conn = db.ConnectionExecutor(db.get_engine().raw_connection())
|
||||
notify_ = None
|
||||
with db.begin():
|
||||
pkgreq = db.create(PackageRequest, RequestType=reqtype, RequestTS=now,
|
||||
PackageBase=pkgbase, PackageBaseName=pkgbase.Name,
|
||||
MergeBaseName=merge_into, User=request.user,
|
||||
Comments=comments, ClosureComment=str())
|
||||
|
||||
# Prepare notification object.
|
||||
notify_ = notify.RequestOpenNotification(
|
||||
conn, request.user.ID, pkgreq.ID, reqtype,
|
||||
pkgreq.PackageBase.ID, merge_into=merge_into or None)
|
||||
|
||||
# Send the notification now that we're out of the DB scope.
|
||||
notify_.send()
|
||||
|
||||
# Redirect the submitting user to /packages.
|
||||
return RedirectResponse("/packages",
|
||||
status_code=int(HTTPStatus.SEE_OTHER))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue