fix(autocomplete): parse kind:rest in /api/tags/search
The add-tag input lets the user type 'character:mocha' as a kind shortcut,
but the autocomplete was passing the whole query through to ilike, so
'%character:mocha%' never matched any display_name. Use parse_kind_prefix
to split the prefix into a kind filter, leaving the rest as the search
term. An explicit ?kind= (e.g. fandom picker) still wins. Empty rest
('character:') falls into the no-query branch and shows top characters.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
+14
-1
@@ -663,13 +663,26 @@ def search_tags():
|
|||||||
- kind: filter to only include tags of this kind
|
- kind: filter to only include tags of this kind
|
||||||
"""
|
"""
|
||||||
from sqlalchemy import case
|
from sqlalchemy import case
|
||||||
|
from app.utils.tag_prefix import parse_kind_prefix
|
||||||
|
|
||||||
query = request.args.get("q", "").strip().lower()
|
raw_q = request.args.get("q", "").strip()
|
||||||
limit = request.args.get("limit", 10, type=int)
|
limit = request.args.get("limit", 10, type=int)
|
||||||
exclude_kind = request.args.get("exclude_kind", "").strip()
|
exclude_kind = request.args.get("exclude_kind", "").strip()
|
||||||
exclude_kinds = [k.strip() for k in exclude_kind.split(",") if k.strip()]
|
exclude_kinds = [k.strip() for k in exclude_kind.split(",") if k.strip()]
|
||||||
include_kind = request.args.get("kind", "").strip()
|
include_kind = request.args.get("kind", "").strip()
|
||||||
|
|
||||||
|
# Honour the same `kind:rest` shortcut the add-tag input uses, so typing
|
||||||
|
# "character:mocha" filters to character rows matching "mocha" instead of
|
||||||
|
# ilike-matching the literal "character:" string against display_name.
|
||||||
|
# An explicit ?kind= still wins (used by the fandom picker).
|
||||||
|
if not include_kind:
|
||||||
|
parsed_kind, parsed_rest = parse_kind_prefix(raw_q)
|
||||||
|
if parsed_kind is not None:
|
||||||
|
include_kind = parsed_kind
|
||||||
|
raw_q = parsed_rest
|
||||||
|
|
||||||
|
query = raw_q.lower()
|
||||||
|
|
||||||
f = aliased(Tag)
|
f = aliased(Tag)
|
||||||
display_expr = case(
|
display_expr = case(
|
||||||
(
|
(
|
||||||
|
|||||||
Reference in New Issue
Block a user