feat(candidates): список отобранных между кандидатами и опубликованными

- новый статус selected; в кандидатах только «⭐ Отобрать» (single+bulk)
- /selected — отдельный список: вся обработка (классификация/переписывание/комментарий/публикация)
- классификация только по кнопке (токены на кандидатов не тратятся)
- рядом с оригиналом — поле «✍️ Мой пост» (rewritten_text всегда виден), туда ложится черновик «Переписать»
- все обработчики учитывают src (candidates|selected) для редиректов
This commit is contained in:
kpa39l
2026-09-15 17:37:11 +00:00
parent b542e9b4fa
commit ae8af8de9c
9 changed files with 469 additions and 98 deletions
@@ -0,0 +1,44 @@
# selected-list: список отобранных между кандидатами и опубликованными
## Улучшение
Сейчас пайплайн «кандидаты → опубликованные» без промежуточного шага:
- Кандидаты (new): куча новых постов, классификация всех через LLM (токены), обработка
(comment/approve/reject/reclassify/rewrite) прямо здесь — всё сразу.
- Пользователь: «репост никому не интересен, подпишутся на первоисточник» — нужен
собственный подготовленный пост. Отбираем понравившееся руками, готовим свой пост
уже в отобранных.
## Изменения
### Новый статус `selected`
- `posts.status`: добавляем значение `selected` («отобранный»).
- Кандидаты = `status='new'` (внешние). Отобранные = `status='selected'` (внешние).
- Свой контент (is_own=1) — не кандидаты и не отобранные (управляется отдельно).
### Веб
- **Кандидаты (`/candidates`)**: только «⭐ Отобрать» (single + bulk `select`).
БЕЗ approve/reject/comment/reclassify/rewrite — обработка живёт в отобранных.
Кнопки «Обработать моделью/Переписать/Отклонить/Опубликовать/комментарий» — убираем.
- **Отобранные (`/selected`)**: новый экран, полный функционал:
- карточки слева (как кандидаты), статус selected
- справа: бейджи, комментарий, «✅ Опубликовать», «💾 Сохранить комментарий»,
«🤖 Обработать моделью» (reclassify), «✍️ Переписать» (rewrite),
«💾 Сохранить пересказ», «🚫 Отклонить»
- bulk: approve / reject / process / select
- `published` — без изменений.
### Редактор всегда виден
В отобранных рядом с оригиналом поста — поле редактирования (textarea `rewritten_text`):
- показывается ВСЕГДА (не только если уже есть пересказ)
- в него кладётся результат «✍️ Переписать» (rewrite)
- редактируется вручную
- при публикации (approve) — body = rewritten_text если есть, иначе оригинал (уже так в card.py)
### Экономия токенов
- Краулер НЕ классифицирует новые (сейчас и так worker не в кроне; classified остаётся 0).
- Классификация — только по кнопке «🤖 Обработать моделью» В ОТОБРАННЫХ (reclassify на selected).