feat: show tag counts alongside doc counts on dashboard
All checks were successful
Deploy / deploy (push) Successful in 21s
All checks were successful
Deploy / deploy (push) Successful in 21s
Fetch /api/tags/ in parallel with /api/documents/ for each instance. Dashboard now displays "X docs, Y tags" per master/replica. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -89,13 +89,13 @@ def get_status(session: Session = Depends(get_session)):
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
async def _fetch_count(url: str, token: str) -> int | None:
|
async def _fetch_count(url: str, token: str, path: str = "/api/documents/") -> int | None:
|
||||||
import httpx
|
import httpx
|
||||||
try:
|
try:
|
||||||
async with httpx.AsyncClient(
|
async with httpx.AsyncClient(
|
||||||
headers={"Authorization": f"Token {token}"}, timeout=8.0
|
headers={"Authorization": f"Token {token}"}, timeout=8.0
|
||||||
) as client:
|
) as client:
|
||||||
r = await client.get(url.rstrip("/") + "/api/documents/", params={"page_size": 1})
|
r = await client.get(url.rstrip("/") + path, params={"page_size": 1})
|
||||||
r.raise_for_status()
|
r.raise_for_status()
|
||||||
return r.json().get("count")
|
return r.json().get("count")
|
||||||
except Exception:
|
except Exception:
|
||||||
|
|||||||
@@ -70,12 +70,19 @@ async def doc_counts_fragment(request: Request, session: Session = Depends(get_s
|
|||||||
token = decrypt(r.api_token, config.secret_key)
|
token = decrypt(r.api_token, config.secret_key)
|
||||||
tasks.append((r.name, r.url, token))
|
tasks.append((r.name, r.url, token))
|
||||||
|
|
||||||
counts_raw = await asyncio.gather(*[_fetch_count(url, tok) for _, url, tok in tasks])
|
n = len(tasks)
|
||||||
|
all_counts = await asyncio.gather(
|
||||||
|
*[_fetch_count(url, tok) for _, url, tok in tasks],
|
||||||
|
*[_fetch_count(url, tok, "/api/tags/") for _, url, tok in tasks],
|
||||||
|
)
|
||||||
|
doc_counts = all_counts[:n]
|
||||||
|
tag_counts = all_counts[n:]
|
||||||
|
|
||||||
parts = []
|
parts = []
|
||||||
for (label, _, _), count in zip(tasks, counts_raw):
|
for (label, _, _), docs, tags in zip(tasks, doc_counts, tag_counts):
|
||||||
val = str(count) if count is not None else "?"
|
doc_val = str(docs) if docs is not None else "?"
|
||||||
parts.append(f"<span><strong>{label}:</strong> {val} docs</span>")
|
tag_val = str(tags) if tags is not None else "?"
|
||||||
|
parts.append(f"<span><strong>{label}:</strong> {doc_val} docs, {tag_val} tags</span>")
|
||||||
|
|
||||||
html = (
|
html = (
|
||||||
'<div style="display:flex; gap:1.5rem; flex-wrap:wrap; margin-bottom:1rem; font-size:0.95em;">'
|
'<div style="display:flex; gap:1.5rem; flex-wrap:wrap; margin-bottom:1rem; font-size:0.95em;">'
|
||||||
|
|||||||
Reference in New Issue
Block a user