fix(candidates): после Отклонить остаёмся на кандидатах, кнопки действий над комментарием

- reject/reject-old (single + bulk): редирект на /candidates с текущей
  группировкой вместо /candidates?status=rejected — не прерываем отбор.
  Отклонённые доступны через фильтр статуса.
- candidates.html: Обработать/Переписать/Отклонить — один ряд над полем
  комментария (после переноса Опубликовать в approve-форму кнопки съехали).

changes: candidates-buttons-order, reject-stay-candidates (skip_specs, валидны).
This commit is contained in:
kpa39l
2026-09-15 16:30:19 +00:00
parent ee2f8ac61a
commit 562d787f1b
11 changed files with 551 additions and 29 deletions
+45 -26
View File
@@ -128,33 +128,38 @@
<small class="text-muted">{{ (selected.published_at or selected.fetched_at) | dt }}</small>
</div>
<div class="mb-2">
{% if selected.direction %}<span class="badge bg-secondary">{{ selected.direction }}</span>{% endif %}
{% if selected.relevance %}<span class="badge bg-{{ 'success' if selected.relevance=='critical' else 'info' }}">{{ selected.relevance }}</span>{% endif %}
{% if selected.interest %}<span class="badge bg-warning text-dark">interest {{ selected.interest }}</span>{% endif %}
{% if selected.is_own %}<span class="badge bg-warning text-dark">⭐ СВОЙ</span>{% endif %}
{% if selected.fwd_from_channel_id %}<span class="badge bg-light text-dark">↩︎ форвард</span>{% endif %}
<small class="text-muted ms-2">👁 {{ selected.views }} 💬 {{ selected.reactions_total }}</small>
{% if selected.url %}<a class="btn btn-sm btn-outline-secondary ms-2" href="{{ selected.url }}" target="_blank">Исходник</a>{% endif %}
</div>
{% if selected.direction %}<span class="badge bg-secondary">{{ selected.direction }}</span>{% endif %}
{% if selected.relevance %}<span class="badge bg-{{ 'success' if selected.relevance=='critical' else 'info' }}">{{ selected.relevance }}</span>{% endif %}
{% if selected.interest %}<span class="badge bg-warning text-dark">interest {{ selected.interest }}</span>{% endif %}
{% if selected.is_own %}<span class="badge bg-warning text-dark">⭐ СВОЙ</span>{% endif %}
{% if selected.fwd_from_channel_id %}<span class="badge bg-light text-dark">↩︎ форвард</span>{% endif %}
<small class="text-muted ms-2">👁 {{ selected.views }} 💬 {{ selected.reactions_total }}</small>
{% if selected.url %}<a class="btn btn-sm btn-outline-secondary ms-2" href="{{ selected.url }}" target="_blank">Исходник</a>{% endif %}
</div>
<details class="small text-muted mb-2">
<summary class="text-muted">Бейджи поста — что значит каждый цвет</summary>
<ul class="mb-0 mt-1" style="padding-left:1.2rem">
<li><span class="badge bg-secondary">направление</span> — тема (linux, tech, games…) — из классификатора</li>
<li><span class="badge bg-success">critical</span> / <span class="badge bg-info">high</span> — важность по мнению модели (зелёный = критичная, но не критичная; синий = важная)</li>
<li><span class="badge bg-warning text-dark">interest N</span> — интересность для твоего канала 1–5 (жёлтый, N — оценка; 5 = лучшее)</li>
<li><span class="badge bg-warning text-dark">⭐ СВОЙ</span> — пост твоего канала (dedinit)</li>
<li><span class="badge bg-light text-dark">↩︎ форвард</span> — пересланное сообщение</li>
</ul>
</details>
<div class="mb-3 d-flex flex-wrap gap-2">
<div class="mb-3">
{% set hid %}<input type="hidden" name="group_by" value="{{ group_by }}"><input type="hidden" name="direction" value="{{ direction }}"><input type="hidden" name="own" value="{{ own }}"><input type="hidden" name="q" value="{{ q }}">{% endset %}
{% if selected.status != 'published' %}
<form method="post" action="/posts/{{ selected.id }}/approve">
{{ hid }}
<button class="btn btn-success" type="submit">✅ Опубликовать</button>
</form>
{% endif %}
<div class="d-flex flex-wrap gap-2 mb-2">
{% if selected.status != 'published' %}
<form method="post" action="/posts/{{ selected.id }}/reclassify">
{{ hid }}
<button class="btn btn-info" type="submit">🤖 Обработать моделью</button>
<button class="btn btn-info" type="submit" title="Заново прогнать через модель (qwen3:8b): направление, релевантность, интерес — обновит бейджи">🤖 Обработать моделью</button>
</form>
{% endif %}
{% if selected.status != 'published' %}
<form method="post" action="/posts/{{ selected.id }}/rewrite">
{{ hid }}
<button class="btn btn-outline-primary" type="submit">✍️ Переписать</button>
<button class="btn btn-outline-primary" type="submit" title="Сгенерировать черновик пересказа через модель — затем можно отредактировать и сохранить (пойдёт в канал вместо оригинала, от вашего имени)">✍️ Переписать</button>
</form>
{% endif %}
{% if selected.status != 'rejected' and selected.status != 'published' %}
@@ -163,20 +168,34 @@
<button class="btn btn-outline-danger" type="submit">🚫 Отклонить</button>
</form>
{% endif %}
</div>
{% if selected.status != 'published' %}
<form method="post" action="/posts/{{ selected.id }}/approve" id="approve-form">
{{ hid }}
<button class="btn btn-success" type="submit" title="Опубликовать в канал: комментарий (если есть) первым, затем текст поста/пересказ, картинка, ссылка">✅ Опубликовать</button>
<label class="form-label small text-muted mb-0 mt-2 d-block">💬 Мой комментарий (будет первым в канале):</label>
<textarea class="form-control form-control-sm mt-1" name="comment" rows="2"
placeholder="Комментарий/анонс…">{{ selected.comment or '' }}</textarea>
<div class="mt-2">
<button class="btn btn-sm btn-outline-secondary" type="submit"
formaction="/posts/{{ selected.id }}/comment"
title="Сохранить комментарий в черновик (не публикует). Он подтянется при следующей публикации">💾 Сохранить комментарий</button>
</div>
</form>
{% endif %}
</div>
<div class="mb-3">
<form method="post" action="/posts/{{ selected.id }}/comment">
{{ hid }}
<label class="form-label small text-muted">💬 Мой комментарий (будет первым в канале):</label>
<textarea class="form-control form-control-sm" name="comment" rows="2"
placeholder="Комментарий/анонс…">{{ selected.comment or '' }}</textarea>
<button class="btn btn-sm btn-outline-secondary mt-1" type="submit">Сохранить комментарий</button>
</form>
{% if selected.rewritten_text %}
<div class="mt-2">
<label class="form-label small text-muted">✍️ Черновик пересказа (редактируйте и копируйте):</label>
<textarea class="form-control form-control-sm" rows="4" readonly>{{ selected.rewritten_text }}</textarea>
<label class="form-label small text-muted">✍️ Пересказ (редактируйте и сохраните — он пойдёт в канал от вашего имени):</label>
<form method="post" action="/posts/{{ selected.id }}/rewrite-save" class="row g-1">
{{ hid }}
<textarea class="form-control form-control-sm" name="rewritten_text" rows="5">{{ selected.rewritten_text }}</textarea>
<div class="col-auto mt-1">
<button class="btn btn-sm btn-outline-primary" type="submit">💾 Сохранить пересказ</button>
</div>
</form>
</div>
{% endif %}
</div>