fix(candidates): только внешние new-посты в списке кандидатов

- _fetch_candidates: в WHERE всегда is_own=0 AND status='new' → свои посты
  канала @dedinit (is_own=1, backfill) и published/rejected больше не
  показываются как кандидаты
- counts табов: считаются по внешним постам (не по жёсткому where), чтобы
  табы статусов показывали реальные счётчики
- change: candidates-only-external-new (skip_specs)
This commit is contained in:
kpa39l
2026-09-14 05:11:54 +00:00
parent e2bdb4a87b
commit acb49cc702
7 changed files with 149 additions and 4 deletions
+12 -3
View File
@@ -150,10 +150,18 @@ def _fetch_candidates(conn, direction: str, status: str, own: str, q: str, group
flat — сгруппированный список; counts — {статус: число} для фильтра-табов."""
where = []
params = []
# Кандидаты = только внешние (is_own=0) посты в статусе new.
# Свои посты канала (is_own=1) не являются кандидатами — это контент
# собственного канала, управляется отдельно (fan-out); published/rejected —
# уже решённые посты, им не место в очереди кандидатов.
where.append("p.is_own=0")
where.append("p.status='new'")
if direction:
where.append("p.direction=?")
params.append(direction)
if status:
if status and status != "new":
# Явный фильтр статуса (rejected/published) — просмотр решённых;
# для 'new' условие уже добавлено выше.
where.append("p.status=?")
params.append(status)
if own in ("1", "0"):
@@ -168,9 +176,10 @@ def _fetch_candidates(conn, direction: str, status: str, own: str, q: str, group
FROM posts p LEFT JOIN sources s ON s.id=p.source_id
{w}"""
rows = conn.execute(sql + " ORDER BY COALESCE(p.published_at,p.fetched_at) DESC LIMIT ?", params + [limit]).fetchall()
# counts для табов статуса: сколько кандидатов (внешних new) и сколько
# решённых (rejected/published) доступно для просмотра.
counts = {r["status"]: r["c"] for r in conn.execute(
"SELECT p.status, COUNT(*) c FROM posts p" + (" WHERE " + " AND ".join(where) if where else "") + " GROUP BY p.status",
params,
"SELECT p.status, COUNT(*) c FROM posts p WHERE p.is_own=0 GROUP BY p.status",
)}
counts[""] = sum(counts.values())
# статус по умолчанию для табов: если в выборке нет ничего "нового" — смотрим rejected