# Design: rewrite-as-author ## 1. candidates.html (блок пересказа) ```diff {% if selected.rewritten_text %}
- - + +
+ {{ hid }} + +
+
{% endif %} ``` ## 2. app.py — новый эндпоинт ```python @app.post("/posts/{post_id}/rewrite-save") async def post_rewrite_save(post_id, request, group_by="", direction="", own="", q=""): _require_auth(request) conn = _db() p = conn.execute("SELECT id FROM posts WHERE id=?", (post_id,)).fetchone() if not p: return RedirectResponse(..., status_code=302) form = await request.form() draft = str(form.get("rewritten_text") or "").strip() conn.execute("UPDATE posts SET rewritten_text=? WHERE id=?", (draft or None, post_id)) conn.commit(); conn.close() return RedirectResponse(..., status_code=302) ``` ## 3. card.py — тело и подпись ```python body = (post.get("rewritten_text") or post.get("text") or "").strip() rewritten = bool((post.get("rewritten_text") or "").strip()) ... if rewritten: tail = "✍️ Дед в АйТи (@dedinit)" + (f" · Источник: {orig}" if orig else "") elif is_own: ... # как было elif orig: tail = f"🔗 Оригинал: {orig}" ``` ## Верификация - `py_compile web/app.py publisher/card.py` - Реальный кандидат с rewritten_text (id=4): GET /candidates?selected=4 → textarea без readonly, есть «Сохранить пересказ». - `make_card` (read-only БД) с постом id=4 → текст начинается с пересказа, содержит «Дед в АйТи», не содержит «🔗 Оригинал»; media сохраняется (если есть).