diff --git a/WALKTHROUGH.md b/WALKTHROUGH.md index 3f86290..dfc951f 100644 --- a/WALKTHROUGH.md +++ b/WALKTHROUGH.md @@ -477,3 +477,47 @@ curl -s -X POST http://127.0.0.1:8410/api/v1/publish -H 'Content-Type: applicati 2. Закрыть rich-repost-card (архив) + архивировать gotosocial-publisher после подтверждения. 3. Пометить аккаунт vesti как **bot** (в GtS 0.22.1 bot-флаг: PATCH /api/v1/accounts/update_credentials → bot:true, либо actor_type Service) — не критично, желательно. 4. Фан-аут направлений → каналы (в т.ч. fediverse-каналы по направлениям). + +## Сессия 2026-09-14 — кандидаты: внешние new-посты + сохранение группировки + +### Контекст +Два раунда багов страницы /candidates, оба закрыты через OpenSpec. + +### Что сделано +1. **change `candidates-only-external-new`** (коммит `acb49cc`): + - Баг: в списке кандидатов показывались одобренные (published) и отклонённые (rejected) посты; при группировке по дате все посты выглядели «своими» (846 backfill @dedinit, is_own=1, status=new — группы 04-06.2026 целиком свои). Пользователь: «в списке кандидатов не должно быть одобренных», «они не мои, я их не одобрял». + - Диагностика: `_fetch_candidates` при пустом `status` (фильтр «Все» = дефолт) НЕ добавлял `p.status` → в списке все статусы. Свои посты — не кандидаты. + - Решение (вариант B — выбор пользователя через clarify): жёстко `p.is_own=0 AND p.status='new'`. Separately: counts табов пересчитаны отдельным запросом (внешние: new=164, published=5, rejected=3), чтобы не показывать 0/0. + - Проверка: юнит-скрипт + живой curl (0 «СВОЙ», 164 поста, только внешние источники); группы 04-06.2026 исчезли. +2. **change `keep-candidates-context`** (коммит `0999424`): + - Баг (репорт пользователя): «когда я в группировке дата отклонил кандидата, открылась страница с пустым списком „нет кандидатов по фильтру" и фильтр сбросился на „источник"; я должен остаться на той же группировке». + - Причины: (1) жёсткое `p.status='new'` AND явный `status=rejected` → пустая выборка; (2) редирект `/posts/{id}/reject` жёстко на `/candidates?status=rejected` без group_by. + - Решение: жёсткое `new` только при пустом параметре статуса (явный статус — единственный фильтр); хелпер `_cand_back()` строит URL возврата с group_by/direction/own/q; во все формы правой панели (approve/reclassify/rewrite/reject/comment) добавлены скрытые поля контекста. + - Проверка: юнит (`status=rejected` → 4 поста, published → 5, дефолт → 163 new внешних) + живой curl (скрытые поля в 6 формах, `?group_by=date&status=rejected` → 4 поста, 0 «нет кандидатов»). +3. Рестарт `vesti-web` (syntax OK → systemctl restart → active). +4. **Доки**: STATUS.md («Сделано (сессия кандидаты-фиксы 2026-09-14)» + «Итоговое состояние страницы кандидатов»), TODO.md (2 строки закрыты), WALKTHROUGH.md (эта секция), коммиты `acb49cc`, `0999424`, `e9f7c96`. + +### Питфолы +- `grep` с `f`-строками в шаблоне (`RedirectResponse(url=f"/candidates`) — спецсимволы ломали командную строку; использовать search_files (ripgrep) вместо shell-grep. +- Пароль веба — /tmp/vesti_pass.txt (значение не фиксировать в доках). + +### Команды +```bash +cd /opt/vesti +.venv/bin/python -m crawler ... # диагностика выборки: /tmp/diag_fetch_own.py +# юнит-проверка контекста: .venv/bin/python /tmp/verify_context.py +# живая проверка: bash /tmp/check_context.sh (логин + group_by=date + status=rejected) +sudo systemctl restart vesti-web && systemctl is-active vesti-web # active +``` + +### Итоговое состояние +- Кандидаты = внешние `status='new'` (163), без своих/published/rejected. +- После reject/approve/comment/reclassify/rewrite — возврат в ту же группировку с сохранением фильтров. +- `?status=rejected` / `?status=published` — работают (4 и 5 внешних постов соответственно). +- Тихие change: `candidates-only-external-new`, `keep-candidates-context` — задачи [x]; архивировать после подтверждения. + +### Следующая сессия +1. Проработать **candidates-mail-ui** (2 панели) — открытые вопросы см. предыдущая сессия. +2. Архив `candidates-only-external-new`, `keep-candidates-context` + rich-repost-card + gotosocial-publisher (delta в specs). +3. Пометить аккаунт vesti как **bot** (GtS 0.22.1, PATCH update_credentials bot:true / actor_type Service). +4. Фан-аут направлений → каналы (в т.ч. fediverse-каналы).