mirror of
https://gitverse.ru/kpa39l/vesti.git
synced 2026-09-29 09:55:03 +00:00
openspec: архив 14 завершённых change-ов (веб-фиксы, crawler-queue, own-content-hub, publisher-service); спеки влиты в openspec/specs
This commit is contained in:
@@ -0,0 +1,3 @@
|
||||
schema: spec-driven
|
||||
skip_specs: true
|
||||
created: 2026-09-15
|
||||
@@ -0,0 +1,31 @@
|
||||
# selected-list
|
||||
|
||||
## Design
|
||||
|
||||
### БД
|
||||
|
||||
- Статус `selected` — новое значение `posts.status`, миграция не нужна (status — TEXT без CHECK).
|
||||
- Колонка `is_read` уже есть. Новых колонок нет.
|
||||
|
||||
### Маршруты веб (`web/app.py`)
|
||||
|
||||
- `GET /candidates` — без изменений (кандидаты = new). Из шаблона убираем approve/comment/reject/reclassify/rewrite кнопки, добавляем «⭐ Отобрать».
|
||||
- `POST /candidates/select` — теперь «отобрать»: `UPDATE posts SET status='selected' WHERE id=? AND is_own=0 AND status='new'`. Удалить из старого черновика прежний смысл (выбор поста для просмотра) — он больше для «выбора карточки» не нужен (клик по карточке — GET ссылка, выборка кнопкой «Отобрать»).
|
||||
- `GET /selected` — главный новый: список отобранных (status=selected, is_own=0), двухпанельный как /candidates, но с полным функционалом. Копия логики /candidates с параметром status='selected'.
|
||||
- `POST /selected/select` — выбор карточки в отобранных (аналог старого candidates/select, но GET-переход по ссылке, form не нужна).
|
||||
- `POST /posts/{id}/reject` — уже есть, редиректит на /candidates; добавить `back` с параметром (чтобы из selected вести обратно в selected).
|
||||
- `impl_approve` — уже публикует rewritten_text если он есть; ok.
|
||||
- Bulk в selected: action=select (для кандидатов), approve/reject/process/reject-old — там же, где в candidates.
|
||||
|
||||
### Шаблоны
|
||||
|
||||
- `candidates.html` — правый блок: только статус/бейджи + «⭐ Отобрать» (single) + bulk. Убрать approve-form/comment/reclassify/rewrite/reject.
|
||||
- `selected.html` — НОВЫЙ (клон candidates.html) с полным функционалом + поле `rewritten_text` ВСЕГДА рядом с оригиналом + кнопки.
|
||||
- `base.html` — навбар: ссылка «Отобранные» (со счётчиком) между «Кандидаты» и «Опубликовано».
|
||||
|
||||
### Открытые решения
|
||||
|
||||
- GET /candidates рендерит и левую панель; в кандидатах больше нет «выбора для просмотра» —
|
||||
клик по карточке открывает пост (selected) — оставим клик по ссылке на правосторонний
|
||||
просмотр (тот же механизм `?selected=`), но сам статус «отобрать» — отдельной кнопкой.
|
||||
- В /selected — «🚫 Отклонить» отобранного → status=rejected, редирект на /selected.
|
||||
@@ -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).
|
||||
@@ -0,0 +1,14 @@
|
||||
# selected-list
|
||||
|
||||
- [x] OpenSpec change создан (proposal/design) — skip_specs
|
||||
- [x] openspec validate selected-list
|
||||
- [x] web/app.py: GET /selected (двухпанельный, status=selected) + выбор поста (переклики с candidates)
|
||||
- [x] web/app.py: POST /posts/{id}/select (new → selected) + bulk action=select
|
||||
- [x] web/app.py: _cand_back(+src), все обработчики (reject/comment/reclassify/rewrite/rewrite-save/approve/bulk) — учитывают src
|
||||
- [x] web/templates/selected.html: список + полный функционал + редактор «Мой пост» рядом с оригиналом
|
||||
- [x] web/templates/candidates.html: только «⭐ Отобрать» (single + bulk) — убраны approve/reject/process/rewrite/comment/редактор
|
||||
- [x] web/templates/base.html: навбар «⭐ Отобранные»
|
||||
- [x] bulk rewrite (переписать выбранные)
|
||||
- [x] Тесты: select single/bulk → /selected; кнопки; rewrite (реальный Ollama) → rewritten_text; живой HTTP
|
||||
- [x] Откат тестовых мутаций (85/109 → new)
|
||||
- [x] Обновить STATUS.md + коммит/пуш
|
||||
Reference in New Issue
Block a user