Add query arg to show packages with flag

This commit is contained in:
rubenwardy 2023-12-30 17:09:10 +00:00
parent a9ae14af9a
commit 35701b1097
2 changed files with 25 additions and 0 deletions

@ -186,6 +186,7 @@ Supported query parameters:
* `q`: Query string. * `q`: Query string.
* `author`: Filter by author. * `author`: Filter by author.
* `tag`: Filter by tags. * `tag`: Filter by tags.
* `flag`: Filter to show packages with [Content Flags](/help/content_flags/).
* `game`: Filter by [Game Support](/help/game_support/), ex: `Wuzzy/mineclone2`. (experimental, doesn't show items that support every game currently). * `game`: Filter by [Game Support](/help/game_support/), ex: `Wuzzy/mineclone2`. (experimental, doesn't show items that support every game currently).
* `random`: When present, enable random ordering and ignore `sort`. * `random`: When present, enable random ordering and ignore `sort`.
* `limit`: Return at most `limit` packages. * `limit`: Return at most `limit` packages.

@ -70,6 +70,9 @@ class QueryBuilder:
# Hide # Hide
self.hide_flags = set(args.getlist("hide")) self.hide_flags = set(args.getlist("hide"))
# Show flags
self.flags = set(args.getlist("flag"))
self.types = types self.types = types
self.tags = tags self.tags = tags
@ -188,6 +191,27 @@ class QueryBuilder:
if warning: if warning:
query = query.filter(~ Package.content_warnings.any(ContentWarning.id == warning.id)) query = query.filter(~ Package.content_warnings.any(ContentWarning.id == warning.id))
flags = set(self.flags)
if "nonfree" in flags:
query = query.filter(or_(Package.license.has(is_foss=False), Package.media_license.has(is_foss=False)))
flags.discard("nonfree")
if "wip" in flags:
query = query.filter(Package.dev_state == PackageDevState.WIP)
flags.discard("wip")
if "deprecated" in flags:
query = query.filter(Package.dev_state == PackageDevState.DEPRECATED)
flags.discard("deprecated")
if "*" in flags:
query = query.filter(Package.content_warnings.any())
flags.discard("*")
else:
for flag in flags:
warning = ContentWarning.query.filter_by(name=flag).first()
flags.discard(flag)
if warning:
query = query.filter(Package.content_warnings.any(ContentWarning.id == warning.id))
if self.hide_nonfree: if self.hide_nonfree:
query = query.filter(Package.license.has(License.is_foss == True)) query = query.filter(Package.license.has(License.is_foss == True))
query = query.filter(Package.media_license.has(License.is_foss == True)) query = query.filter(Package.media_license.has(License.is_foss == True))