From 7dfce930b66e6dc626bef37deca283136048d972 Mon Sep 17 00:00:00 2001 From: reachableceo Date: Thu, 6 Aug 2026 14:13:13 -0500 Subject: [PATCH] fix: resolve subcategory slugs in category lookup and listing The /categories.json endpoint only returns top-level categories by default, so subcategory slugs (e.g. vp-techops) failed to resolve and the 'categories' listing hid the entire subcategory tree. Both _resolve_category and cmd_categories now pass include_subcategories=true and traverse the nested subcategory_list. --- discourse-cli/src/discourse_cli.py | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/discourse-cli/src/discourse_cli.py b/discourse-cli/src/discourse_cli.py index 80debc8..5a7ccc0 100644 --- a/discourse-cli/src/discourse_cli.py +++ b/discourse-cli/src/discourse_cli.py @@ -121,17 +121,22 @@ def cmd_whoami(args): def cmd_categories(args): api = _client() - data = api.get("/categories.json") + data = api.get("/categories.json", params={"include_subcategories": "true"}) cats = data.get("category_list", {}).get("categories", []) - print(f"{'ID':<6} {'SLUG':<28} {'TOPICS':>7} NAME") - print("-" * 80) + print(f"{'ID':<6} {'SLUG':<36} {'TOPICS':>7} NAME") + print("-" * 90) + count = 0 for c in cats: topic_count = c.get("topic_count", 0) - print(f"{c.get('id','?'):<6} {str(c.get('slug','')):<28} {topic_count:>6} {c.get('name','')}") - subcats = [] - for c in cats: - subcats.extend(c.get("subcategory_ids", []) or []) - print(f"\n{len(cats)} category(ies)") + print(f"{c.get('id','?'):<6} {str(c.get('slug','')):<36} {topic_count:>6} {c.get('name','')}") + count += 1 + for s in c.get("subcategory_list") or []: + sub_count = s.get("topic_count", 0) + slug = " " + str(s.get("slug", "")) + name = " " + s.get("name", "") + print(f"{s.get('id','?'):<6} {slug:<36} {sub_count:>6} {name}") + count += 1 + print(f"\n{count} category(ies)") return 0 @@ -314,7 +319,7 @@ def _resolve_category(api, ref): """Resolve a category id, slug, or name to a numeric id.""" if str(ref).isdigit(): return int(ref) - data = api.get("/categories.json") + data = api.get("/categories.json", params={"include_subcategories": "true"}) cats = data.get("category_list", {}).get("categories", []) needle = str(ref).strip().lower() for c in cats: @@ -322,6 +327,11 @@ def _resolve_category(api, ref): return c["id"] if str(c.get("name", "")).lower() == needle: return c["id"] + for s in c.get("subcategory_list") or []: + if str(s.get("slug", "")).lower() == needle: + return s["id"] + if str(s.get("name", "")).lower() == needle: + return s["id"] _err(f"unknown category '{ref}'. Run 'categories' to list valid slugs/names.")