feat: типизация записей (14 типов, до 3 на запись), чипы и бейджи типов в панели, CSV с типами, /api/types, doctor --only по категориям, волны источников 5-6 (635 всего)
This commit is contained in:
@@ -204,6 +204,12 @@ class Handler(BaseHTTPRequestHandler):
|
||||
"categories": cats,
|
||||
})
|
||||
|
||||
if path == "/api/types":
|
||||
from . import taxonomy
|
||||
cnt = store.type_counts()
|
||||
items = [{"key": k, "label": taxonomy.LABELS.get(k, k), "n": v} for k, v in cnt.items()]
|
||||
return self._json({"ok": True, "types": items, "total": sum(cnt.values())})
|
||||
|
||||
if path == "/api/runs":
|
||||
try:
|
||||
limit = max(1, min(500, int((q.get("limit") or ["80"])[0])))
|
||||
@@ -299,13 +305,42 @@ class Handler(BaseHTTPRequestHandler):
|
||||
limit = min(int((q.get("limit") or ["40"])[0]), 200)
|
||||
offset = int((q.get("offset") or ["0"])[0])
|
||||
sort = (q.get("sort") or ["score"])[0]
|
||||
rows, total = store.browse2(q=query, names=_names_in_category(cat), limit=limit, offset=offset, sort=sort)
|
||||
priced = (q.get("priced") or ["0"])[0] in ("1", "true", "on")
|
||||
typ = (q.get("type") or ["all"])[0]
|
||||
rows, total = store.browse2(q=query, names=_names_in_category(cat), limit=limit, offset=offset,
|
||||
sort=sort, priced=priced, typ=typ)
|
||||
for _r in rows:
|
||||
_r["title"] = _clean_txt(_r.get("title"), 180)
|
||||
_r["text"] = _clean_txt(_r.get("text"), 260)
|
||||
_r["published"] = _fmt_date(_r.get("published"))
|
||||
return self._json({"count": len(rows), "total": total, "offset": offset, "items": rows})
|
||||
|
||||
if path == "/api/export.csv":
|
||||
import csv as _csv
|
||||
cat = (q.get("category") or [None])[0]
|
||||
query = (q.get("q") or [""])[0].strip()
|
||||
priced = (q.get("priced") or ["0"])[0] in ("1", "true", "on")
|
||||
sort = (q.get("sort") or ["score"])[0]
|
||||
typ = (q.get("type") or ["all"])[0]
|
||||
rows, total = store.browse2(q=query, names=_names_in_category(cat), limit=5000, offset=0,
|
||||
sort=sort, priced=priced, typ=typ)
|
||||
import io as _io
|
||||
buf = _io.StringIO()
|
||||
w = _csv.writer(buf, delimiter=";")
|
||||
w.writerow(["source", "kind", "types", "title", "author", "published", "score", "price", "currency", "url"])
|
||||
for r in rows:
|
||||
w.writerow([r.get("source"), r.get("kind"), r.get("types"), (r.get("title") or "").replace(chr(10), " "),
|
||||
r.get("author"), r.get("published"), r.get("score"), r.get("price"),
|
||||
r.get("currency"), r.get("url")])
|
||||
data = buf.getvalue().encode("utf-8-sig")
|
||||
self.send_response(200)
|
||||
self.send_header("Content-Type", "text/csv; charset=utf-8")
|
||||
self.send_header("Content-Disposition", 'attachment; filename="omni.csv"')
|
||||
self.send_header("Content-Length", str(len(data)))
|
||||
self.end_headers()
|
||||
self.wfile.write(data)
|
||||
return
|
||||
|
||||
if path.startswith("/api/job/"):
|
||||
jid = path.rsplit("/", 1)[-1]
|
||||
return self._json(JOBS.get(jid) or {"state": "unknown"})
|
||||
|
||||
Reference in New Issue
Block a user