From 5bbc94f2ef333bbe5d33ee1893067e2864de5eb1 Mon Sep 17 00:00:00 2001 From: Kevin Morris Date: Sat, 9 Oct 2021 18:41:32 -0700 Subject: [PATCH] fix(FastAPI): add /pkgbase/{name}/flag (get) This was missed in the [un]flag (post) commit. Signed-off-by: Kevin Morris --- aurweb/routers/packages.py | 28 +++++++++++++++++- templates/packages/flag.html | 57 ++++++++++++++++++++++++++++++++++++ test/test_packages_routes.py | 20 ++++++++++++- 3 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 templates/packages/flag.html diff --git a/aurweb/routers/packages.py b/aurweb/routers/packages.py index b623ca10..8f4a7e1f 100644 --- a/aurweb/routers/packages.py +++ b/aurweb/routers/packages.py @@ -773,17 +773,42 @@ async def requests_close_post(request: Request, id: int, return RedirectResponse("/requests", status_code=int(HTTPStatus.SEE_OTHER)) +@router.get("/pkgbase/{name}/flag") +@auth_required(True, redirect="/pkgbase/{name}") +async def pkgbase_flag_get(request: Request, name: str): + pkgbase = get_pkg_or_base(name, PackageBase) + + has_cred = request.user.has_credential("CRED_PKGBASE_FLAG") + if not has_cred or pkgbase.Flagger is not None: + return RedirectResponse(f"/pkgbase/{name}", + status_code=int(HTTPStatus.SEE_OTHER)) + + context = make_context(request, "Flag Package Out-Of-Date") + context["pkgbase"] = pkgbase + return render_template(request, "packages/flag.html", context) + + @router.post("/pkgbase/{name}/flag") @auth_required(True, redirect="/pkgbase/{name}") -async def pkgbase_flag(request: Request, name: str): +async def pkgbase_flag_post(request: Request, name: str, + comments: str = Form(default=str())): pkgbase = get_pkg_or_base(name, PackageBase) + if not comments: + context = make_context(request, "Flag Package Out-Of-Date") + context["pkgbase"] = pkgbase + context["errors"] = ["The selected packages have not been flagged, " + "please enter a comment."] + return render_template(request, "packages/flag.html", context, + status_code=int(HTTPStatus.BAD_REQUEST)) + has_cred = request.user.has_credential("CRED_PKGBASE_FLAG") if has_cred and not pkgbase.Flagger: now = int(datetime.utcnow().timestamp()) with db.begin(): pkgbase.OutOfDateTS = now pkgbase.Flagger = request.user + pkgbase.FlaggerComment = comments return RedirectResponse(f"/pkgbase/{name}", status_code=int(HTTPStatus.SEE_OTHER)) @@ -800,6 +825,7 @@ async def pkgbase_unflag(request: Request, name: str): with db.begin(): pkgbase.OutOfDateTS = None pkgbase.Flagger = None + pkgbase.FlaggerComment = str() return RedirectResponse(f"/pkgbase/{name}", status_code=int(HTTPStatus.SEE_OTHER)) diff --git a/templates/packages/flag.html b/templates/packages/flag.html new file mode 100644 index 00000000..4e133acb --- /dev/null +++ b/templates/packages/flag.html @@ -0,0 +1,57 @@ +{% extends "partials/layout.html" %} + +{% block pageContent %} +
+

{{ "Flag Package Out-Of-Date" | tr }}: {{ pkgbase.Name }}

+ +

+ {{ + "Use this form to flag the package base %s%s%s and " + "the following packages out-of-date: " + | tr | format("", pkgbase.Name, "") | safe + }} +

+ +
    + {% for package in pkgbase.packages.all() %} +
  • {{ package.Name }}
  • + {% endfor %} +
+ +

+ {{ + "Please do %snot%s use this form to report bugs. " + "Use the package comments instead." + | tr | format("", "") | safe + }} + {{ + "Enter details on why the package is out-of-date below, " + "preferably including links to the release announcement " + "or the new release tarball." | tr + }} +

+ + {% if errors %} +
    + {% for error in errors %} +
  • {{ error | tr }}
  • + {% endfor %} +
+ {% endif %} + +
+
+

+ + +

+

+ +

+
+
+
+{% endblock %} diff --git a/test/test_packages_routes.py b/test/test_packages_routes.py index 86949996..12d7e33e 100644 --- a/test/test_packages_routes.py +++ b/test/test_packages_routes.py @@ -1698,13 +1698,31 @@ def test_pkgbase_flag(client: TestClient, user: User, maintainer: User, # We shouldn't have flagged the package yet; assert so. assert pkgbase.Flagger is None - # Flag it. cookies = {"AURSID": user.login(Request(), "testPassword")} endpoint = f"/pkgbase/{pkgbase.Name}/flag" + + # Get the flag page. + with client as request: + resp = request.get(endpoint, cookies=cookies) + assert resp.status_code == int(HTTPStatus.OK) + + # Try to flag it without a comment. with client as request: resp = request.post(endpoint, cookies=cookies) + assert resp.status_code == int(HTTPStatus.BAD_REQUEST) + + # Flag it with a valid comment. + with client as request: + resp = request.post(endpoint, {"comments": "Test"}, cookies=cookies) assert resp.status_code == int(HTTPStatus.SEE_OTHER) assert pkgbase.Flagger == user + assert pkgbase.FlaggerComment == "Test" + + # Now try to perform a get; we should be redirected because + # it's already flagged. + with client as request: + resp = request.get(endpoint, cookies=cookies, allow_redirects=False) + assert resp.status_code == int(HTTPStatus.SEE_OTHER) # Now, test that the 'maintainer' user can't unflag it, because they # didn't flag it to begin with.