From ad8369395e323d99bd4b3cae430269ac8dd19491 Mon Sep 17 00:00:00 2001 From: Kevin Morris Date: Sun, 12 Sep 2021 21:51:20 -0700 Subject: [PATCH] feat(FastAPI): add /pkgbase/{name}/request (get) This change brings in the package base request form for new submissions. Signed-off-by: Kevin Morris --- aurweb/routers/packages.py | 14 ++++ templates/pkgbase/request.html | 87 ++++++++++++++++++++++++ test/test_packages_routes.py | 20 ++++++ web/html/js/typeahead-pkgbase-request.js | 36 ++++++++++ 4 files changed, 157 insertions(+) create mode 100644 templates/pkgbase/request.html create mode 100644 web/html/js/typeahead-pkgbase-request.js diff --git a/aurweb/routers/packages.py b/aurweb/routers/packages.py index 2b350478..9c9a41e3 100644 --- a/aurweb/routers/packages.py +++ b/aurweb/routers/packages.py @@ -568,3 +568,17 @@ async def requests(request: Request, ).limit(PP).offset(O).all() return render_template(request, "requests.html", context) + + +@router.get("/pkgbase/{name}/request") +@auth_required(True) +async def package_request(request: Request, name: str): + context = make_context(request, "Submit Request") + + pkgbase = db.query(PackageBase).filter(PackageBase.Name == name).first() + + if not pkgbase: + raise HTTPException(status_code=int(HTTPStatus.NOT_FOUND)) + + context["pkgbase"] = pkgbase + return render_template(request, "pkgbase/request.html", context) diff --git a/templates/pkgbase/request.html b/templates/pkgbase/request.html new file mode 100644 index 00000000..66d69f07 --- /dev/null +++ b/templates/pkgbase/request.html @@ -0,0 +1,87 @@ +{% extends "partials/layout.html" %} + +{% block pageContent %} +
+

{{ "Submit Request" | tr }}: {{ pkgbase.Name }}

+

+ {{ "Use this form to file a request against package base " + "%s%s%s which includes the following packages:" + | tr | format("", pkgbase.Name, "") | safe }} +

+
    + {% for package in pkgbase.packages %} +
  • {{ package.Name }}
  • + {% endfor %} +
+ + {# Request form #} +
+
+

+ + +

+ + {# Javascript included for HTML-changing triggers depending + on the selected type (above). #} + + + + +

+ + +

+ +

+ {{ + "By submitting a deletion request, you ask a Trusted " + "User to delete the package base. This type of " + "request should be used for duplicates, software " + "abandoned by upstream, as well as illegal and " + "irreparably broken packages." | tr + }} +

+ + + + + +

+ +

+ +
+
+ +
+{% endblock %} diff --git a/test/test_packages_routes.py b/test/test_packages_routes.py index 9867ce42..8704d702 100644 --- a/test/test_packages_routes.py +++ b/test/test_packages_routes.py @@ -1400,3 +1400,23 @@ def test_requests_selfmade(client: TestClient, user: User, for row in rows: last_row = row.xpath('./td')[-1].xpath('./a')[0] assert last_row.text.strip() == "Close" + + +def test_pkgbase_request_not_found(client: TestClient, user: User): + pkgbase_name = "fake" + endpoint = f"/pkgbase/{pkgbase_name}/request" + + cookies = {"AURSID": user.login(Request(), "testPassword")} + with client as request: + resp = request.get(endpoint, cookies=cookies) + assert resp.status_code == int(HTTPStatus.NOT_FOUND) + + +def test_pkgbase_request(client: TestClient, user: User, package: Package): + pkgbase = package.PackageBase + endpoint = f"/pkgbase/{pkgbase.Name}/request" + + cookies = {"AURSID": user.login(Request(), "testPassword")} + with client as request: + resp = request.get(endpoint, cookies=cookies) + assert resp.status_code == int(HTTPStatus.OK) diff --git a/web/html/js/typeahead-pkgbase-request.js b/web/html/js/typeahead-pkgbase-request.js new file mode 100644 index 00000000..e012d55f --- /dev/null +++ b/web/html/js/typeahead-pkgbase-request.js @@ -0,0 +1,36 @@ +function showHideMergeSection() { + const elem = document.getElementById('id_type'); + const merge_section = document.getElementById('merge_section'); + if (elem.value == 'merge') { + merge_section.style.display = ''; + } else { + merge_section.style.display = 'none'; + } +} + +function showHideRequestHints() { + document.getElementById('deletion_hint').style.display = 'none'; + document.getElementById('merge_hint').style.display = 'none'; + document.getElementById('orphan_hint').style.display = 'none'; + + const elem = document.getElementById('id_type'); + document.getElementById(elem.value + '_hint').style.display = ''; +} + +document.addEventListener('DOMContentLoaded', function() { + showHideMergeSection(); + showHideRequestHints(); + + const input = document.getElementById('id_merge_into'); + const form = document.getElementById('request-form'); + const type = "suggest-pkgbase"; + + typeahead.init(type, input, form, false); +}); + +// Bind the change event here, otherwise we have to inline javascript, +// which angers CSP (Content Security Policy). +document.getElementById("id_type").addEventListener("change", function() { + showHideMergeSection(); + showHideRequestHints(); +});