feat(fastapi): add /pkgbase/{name}/keywords (post)

Signed-off-by: Kevin Morris <kevr@0cost.org>
This commit is contained in:
Kevin Morris 2021-11-11 17:36:08 -08:00
parent 5f5fa44d0d
commit 363afff332
No known key found for this signature in database
GPG key ID: F7E46DED420788F3
3 changed files with 55 additions and 2 deletions

View file

@ -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):

View file

@ -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 }}&amp;SB=p" href="/packages/?K={{ keyword.Keyword }}&amp;SB=p"
> >

View file

@ -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]