From 2b9840149ebb16ac4512f168fcbb1b389cfdb37e Mon Sep 17 00:00:00 2001 From: Kevin Morris Date: Mon, 11 Oct 2021 23:17:54 -0700 Subject: [PATCH] feat(fastapi): add /pkgbase/{name}/merge (get) Signed-off-by: Kevin Morris --- aurweb/routers/packages.py | 31 ++++++++++++ templates/pkgbase/merge.html | 65 ++++++++++++++++++++++++++ test/test_packages_routes.py | 18 +++++++ web/html/js/typeahead-pkgbase-merge.js | 6 +++ 4 files changed, 120 insertions(+) create mode 100644 templates/pkgbase/merge.html create mode 100644 web/html/js/typeahead-pkgbase-merge.js diff --git a/aurweb/routers/packages.py b/aurweb/routers/packages.py index d56a8259..a81c8004 100644 --- a/aurweb/routers/packages.py +++ b/aurweb/routers/packages.py @@ -1080,3 +1080,34 @@ async def packages_post(request: Request, context["success"] = messages return await packages_get(request, context) + + +@router.get("/pkgbase/{name}/merge") +@auth_required(redirect="/pkgbase/{name}/merge") +async def pkgbase_merge_get(request: Request, name: str, + into: str = Query(default=str()), + next: str = Query(default=str())): + pkgbase = get_pkg_or_base(name, models.PackageBase) + + if not next: + next = f"/pkgbase/{pkgbase.Name}" + + context = make_context(request, "Package Merging") + context.update({ + "pkgbase": pkgbase, + "into": into, + "next": next + }) + + status_code = HTTPStatus.OK + # TODO: Lookup errors from credential instead of hardcoding them. + # Idea: Something like credential_errors("CRED_PKGBASE_MERGE"). + # Perhaps additionally: bad_credential_status_code("CRED_PKGBASE_MERGE"). + # Don't take these examples verbatim. We should find good naming. + if not request.user.has_credential("CRED_PKGBASE_MERGE"): + context["errors"] = [ + "Only Trusted Users and Developers can merge packages."] + status_code = HTTPStatus.UNAUTHORIZED + + return render_template(request, "pkgbase/merge.html", context, + status_code=status_code) diff --git a/templates/pkgbase/merge.html b/templates/pkgbase/merge.html new file mode 100644 index 00000000..d0a50332 --- /dev/null +++ b/templates/pkgbase/merge.html @@ -0,0 +1,65 @@ +{% extends "partials/layout.html" %} + +{% block pageContent %} +
+

{{ "Merge Package" | tr }}: {{ pkgbase.Name }}

+ +

+ {{ + "Use this form to merge the package base %s%s%s into " + "another package." + | tr | format("", pkgbase.Name, "") | safe + }} + {{ "The following packages will be deleted: " | tr }} +

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

+ {{ "Once the package has been merged it cannot be reversed. " | tr }} + {{ "Enter the package name you wish to merge the package into. " | tr }} + {{ "Select the checkbox to confirm action." | tr }} +

+ +
+
+ +

+ + +

+ +

+ +

+ +

+ +

+
+
+ + {# Bootstrap typeahead-pkgbase-merge.js #} + + +
+ +{% endblock %} diff --git a/test/test_packages_routes.py b/test/test_packages_routes.py index 0a9761aa..93d994a2 100644 --- a/test/test_packages_routes.py +++ b/test/test_packages_routes.py @@ -2049,3 +2049,21 @@ def test_packages_post(client: TestClient, user: User, package: Package): errors = get_successes(resp.text) expected = "Some success." assert errors[0].text.strip() == expected + + +def test_pkgbase_merge_unauthorized(client: TestClient, user: User, + package: Package): + cookies = {"AURSID": user.login(Request(), "testPassword")} + endpoint = f"/pkgbase/{package.PackageBase.Name}/merge" + with client as request: + resp = request.get(endpoint, cookies=cookies) + assert resp.status_code == int(HTTPStatus.UNAUTHORIZED) + + +def test_pkgbase_merge(client: TestClient, tu_user: User, package: Package): + cookies = {"AURSID": tu_user.login(Request(), "testPassword")} + endpoint = f"/pkgbase/{package.PackageBase.Name}/merge" + with client as request: + resp = request.get(endpoint, cookies=cookies) + assert resp.status_code == int(HTTPStatus.OK) + assert not get_errors(resp.text) diff --git a/web/html/js/typeahead-pkgbase-merge.js b/web/html/js/typeahead-pkgbase-merge.js new file mode 100644 index 00000000..a8c87e4f --- /dev/null +++ b/web/html/js/typeahead-pkgbase-merge.js @@ -0,0 +1,6 @@ +document.addEventListener('DOMContentLoaded', function() { + const input = document.getElementById('merge_into'); + const form = document.getElementById('merge-form'); + const type = "suggest-pkgbase"; + typeahead.init(type, input, form, false); +});