mirror of
https://gitlab.archlinux.org/archlinux/aurweb.git
synced 2025-02-03 10:43:03 +01:00
feat(fastapi): add /pkgbase/{name}/keywords (post)
Signed-off-by: Kevin Morris <kevr@0cost.org>
This commit is contained in:
parent
5f5fa44d0d
commit
363afff332
3 changed files with 55 additions and 2 deletions
|
@ -816,6 +816,29 @@ async def requests_close_post(request: Request, id: int,
|
||||||
return RedirectResponse("/requests", status_code=HTTPStatus.SEE_OTHER)
|
return RedirectResponse("/requests", status_code=HTTPStatus.SEE_OTHER)
|
||||||
|
|
||||||
|
|
||||||
|
@router.post("/pkgbase/{name}/keywords")
|
||||||
|
async def pkgbase_keywords(request: Request, name: str,
|
||||||
|
keywords: str = Form(default=str())):
|
||||||
|
pkgbase = get_pkg_or_base(name, models.PackageBase)
|
||||||
|
keywords = set(keywords.split(" "))
|
||||||
|
|
||||||
|
# Delete all keywords which are not supplied by the user.
|
||||||
|
with db.begin():
|
||||||
|
db.delete(models.PackageKeyword,
|
||||||
|
and_(models.PackageKeyword.PackageBaseID == pkgbase.ID,
|
||||||
|
~models.PackageKeyword.Keyword.in_(keywords)))
|
||||||
|
|
||||||
|
existing_keywords = set(kwd.Keyword for kwd in pkgbase.keywords.all())
|
||||||
|
with db.begin():
|
||||||
|
for keyword in keywords.difference(existing_keywords):
|
||||||
|
db.create(models.PackageKeyword,
|
||||||
|
PackageBase=pkgbase,
|
||||||
|
Keyword=keyword)
|
||||||
|
|
||||||
|
return RedirectResponse(f"/pkgbase/{name}",
|
||||||
|
status_code=HTTPStatus.SEE_OTHER)
|
||||||
|
|
||||||
|
|
||||||
@router.get("/pkgbase/{name}/flag")
|
@router.get("/pkgbase/{name}/flag")
|
||||||
@auth_required(True, redirect="/pkgbase/{name}/flag")
|
@auth_required(True, redirect="/pkgbase/{name}/flag")
|
||||||
async def pkgbase_flag_get(request: Request, name: str):
|
async def pkgbase_flag_get(request: Request, name: str):
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
<th>{{ "Keywords" | tr }}:</th>
|
<th>{{ "Keywords" | tr }}:</th>
|
||||||
{% if request.user.has_credential("CRED_PKGBASE_SET_KEYWORDS", approved=[pkgbase.Maintainer]) %}
|
{% if request.user.has_credential("CRED_PKGBASE_SET_KEYWORDS", approved=[pkgbase.Maintainer]) %}
|
||||||
<td>
|
<td>
|
||||||
<form method="update"
|
<form method="post"
|
||||||
action="/pkgbase/{{ pkgbase.Name }}/keywords"
|
action="/pkgbase/{{ pkgbase.Name }}/keywords"
|
||||||
>
|
>
|
||||||
<div>
|
<div>
|
||||||
|
@ -51,7 +51,7 @@
|
||||||
</td>
|
</td>
|
||||||
{% else %}
|
{% else %}
|
||||||
<td>
|
<td>
|
||||||
{% for keyword in pkgbase.keywords %}
|
{% for keyword in pkgbase.keywords.all() %}
|
||||||
<a class="keyword"
|
<a class="keyword"
|
||||||
href="/packages/?K={{ keyword.Keyword }}&SB=p"
|
href="/packages/?K={{ keyword.Keyword }}&SB=p"
|
||||||
>
|
>
|
||||||
|
|
|
@ -2604,3 +2604,33 @@ def test_account_comments(client: TestClient, user: User, package: Package):
|
||||||
expected = rendered_comment.RenderedComment.replace(
|
expected = rendered_comment.RenderedComment.replace(
|
||||||
"<p>", "").replace("</p>", "")
|
"<p>", "").replace("</p>", "")
|
||||||
assert rendered[0].text.strip() == expected
|
assert rendered[0].text.strip() == expected
|
||||||
|
|
||||||
|
|
||||||
|
def test_pkgbase_keywords(client: TestClient, user: User, package: Package):
|
||||||
|
endpoint = f"/pkgbase/{package.PackageBase.Name}"
|
||||||
|
with client as request:
|
||||||
|
resp = request.get(endpoint)
|
||||||
|
assert resp.status_code == int(HTTPStatus.OK)
|
||||||
|
|
||||||
|
root = parse_root(resp.text)
|
||||||
|
keywords = root.xpath('//a[@class="keyword"]')
|
||||||
|
assert len(keywords) == 0
|
||||||
|
|
||||||
|
cookies = {"AURSID": user.login(Request(), "testPassword")}
|
||||||
|
post_endpoint = f"{endpoint}/keywords"
|
||||||
|
with client as request:
|
||||||
|
resp = request.post(post_endpoint, data={
|
||||||
|
"keywords": "abc test"
|
||||||
|
}, cookies=cookies)
|
||||||
|
assert resp.status_code == int(HTTPStatus.SEE_OTHER)
|
||||||
|
|
||||||
|
with client as request:
|
||||||
|
resp = request.get(resp.headers.get("location"))
|
||||||
|
assert resp.status_code == int(HTTPStatus.OK)
|
||||||
|
|
||||||
|
root = parse_root(resp.text)
|
||||||
|
keywords = root.xpath('//a[@class="keyword"]')
|
||||||
|
assert len(keywords) == 2
|
||||||
|
expected = ["abc", "test"]
|
||||||
|
for i, keyword in enumerate(keywords):
|
||||||
|
assert keyword.text.strip() == expected[i]
|
||||||
|
|
Loading…
Add table
Reference in a new issue