абузы: free-панели new-api на вкладке (роут /api/panels + грид), CSS вынесен из JS, панельный классификатор даёт freeapi-вес, тесты
Some checks failed
ci / test (3.10) (push) Has been cancelled
ci / test (3.11) (push) Has been cancelled
ci / test (3.12) (push) Has been cancelled

This commit is contained in:
Vlad Gothbreach
2026-10-27 02:06:32 +03:00
parent b09cb5f873
commit 16512bf4a1
21 changed files with 1386 additions and 130 deletions

View File

@@ -13,8 +13,8 @@ import urllib.parse
from . import abuse as abuse_mod
from . import config, sources, source_state, store, taxonomy
BUCKET = ("CASE WHEN published GLOB '[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]*' "
"THEN substr(published,1,10) ELSE date(seen,'unixepoch') END")
BUCKET = ("CASE WHEN length(published)=10 AND published GLOB '[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]' "
"THEN published ELSE COALESCE(date(published,'localtime'),date(seen,'unixepoch','localtime')) END")
def _clean(v, n=0):
@@ -32,7 +32,7 @@ def _clean(v, n=0):
# ---------- обзор ----------
BUCKET_SEEN = "date(seen,'unixepoch')"
BUCKET_SEEN = "date(seen,'unixepoch','localtime')"
def timeline(days=30, cat=None, mode="pub"):
@@ -40,6 +40,8 @@ def timeline(days=30, cat=None, mode="pub"):
mode="pub" — по дате публикации (или дате попадания в базу, если публикации нет);
mode="seen" — строго по времени импорта: «что комбайн принёс за день».
last24 — скользящие 24 часа по выбранному mode; непарсируемая дата → seen.
"""
days = 30 if days is None else int(days or 0)
days = max(1, min(365, days))
@@ -57,6 +59,11 @@ def timeline(days=30, cat=None, mode="pub"):
for b, n, cve, sev in c.execute(sql, args):
if b:
got[b] = (int(n or 0), int(cve or 0), int(sev or 0))
clock = "seen" if mode == "seen" else "COALESCE(CAST(strftime('%s',published) AS REAL),seen)"
recent_where = where + (" AND " if where else " WHERE ") + clock + " >= ? AND " + clock + " <= ?"
now = time.time()
last24 = c.execute("SELECT COUNT(*) FROM items" + recent_where,
args + [now - 86400, now]).fetchone()[0]
today = _dt.date.today()
out = []
for i in range(days - 1, -1, -1):
@@ -65,7 +72,8 @@ def timeline(days=30, cat=None, mode="pub"):
out.append({"day": d, "n": n, "cve": cve, "sev": sev})
return {"ok": True, "days": days, "mode": mode, "points": out,
"total": sum(p["n"] for p in out),
"last24": (out[-1] or {}).get("n", 0),
"last24": int(last24),
"today": out[-1]["n"],
"max": max([p["n"] for p in out] or [0])}