fix: treat all keywords as lowercase when updating

In addition, treat package search by keywords as lowercase.

Closes #296, #297, #298, #301

Signed-off-by: Kevin Morris <kevr@0cost.org>
This commit is contained in:
Kevin Morris 2022-02-18 16:41:43 -08:00
parent 8387f325f6
commit 14347232fd
No known key found for this signature in database
GPG key ID: F7E46DED420788F3
2 changed files with 19 additions and 14 deletions

View file

@ -124,6 +124,7 @@ class PackageSearch:
def _search_by_keywords(self, keywords: Set[str]) -> orm.Query: def _search_by_keywords(self, keywords: Set[str]) -> orm.Query:
self._join_user() self._join_user()
self._join_keywords() self._join_keywords()
keywords = set(k.lower() for k in keywords)
self.query = self.query.filter(PackageKeyword.Keyword.in_(keywords)) self.query = self.query.filter(PackageKeyword.Keyword.in_(keywords))
return self return self

View file

@ -95,24 +95,28 @@ async def pkgbase_flag_comment(request: Request, name: str):
async def pkgbase_keywords(request: Request, name: str, async def pkgbase_keywords(request: Request, name: str,
keywords: str = Form(default=str())): keywords: str = Form(default=str())):
pkgbase = get_pkg_or_base(name, PackageBase) pkgbase = get_pkg_or_base(name, PackageBase)
keywords = set(keywords.split(" "))
# Lowercase all keywords. Our database table is case insensitive,
# and providing CI duplicates of keywords is erroneous.
keywords = set(k.lower() for k in keywords.split(" "))
# Delete all keywords which are not supplied by the user. # Delete all keywords which are not supplied by the user.
with db.begin():
other_keywords = pkgbase.keywords.filter( other_keywords = pkgbase.keywords.filter(
~PackageKeyword.Keyword.in_(keywords)) ~PackageKeyword.Keyword.in_(keywords))
other_keyword_strings = [kwd.Keyword for kwd in other_keywords] other_keyword_strings = set(
kwd.Keyword.lower() for kwd in other_keywords)
existing_keywords = set( existing_keywords = set(
kwd.Keyword for kwd in kwd.Keyword.lower() for kwd in
pkgbase.keywords.filter( pkgbase.keywords.filter(
~PackageKeyword.Keyword.in_(other_keyword_strings)) ~PackageKeyword.Keyword.in_(other_keyword_strings))
) )
with db.begin():
db.delete_all(other_keywords) db.delete_all(other_keywords)
for keyword in keywords.difference(existing_keywords): new_keywords = keywords.difference(existing_keywords)
db.create(PackageKeyword, for keyword in new_keywords:
PackageBase=pkgbase, db.create(PackageKeyword, PackageBase=pkgbase, Keyword=keyword)
Keyword=keyword)
return RedirectResponse(f"/pkgbase/{name}", return RedirectResponse(f"/pkgbase/{name}",
status_code=HTTPStatus.SEE_OTHER) status_code=HTTPStatus.SEE_OTHER)