From 8592a82381691483c2afdae43151de3c6f842f1f Mon Sep 17 00:00:00 2001 From: kpa39l Date: Wed, 16 Sep 2026 16:37:24 +0000 Subject: [PATCH] =?UTF-8?q?fix(sources):=20=D0=BF=D0=BE=D0=BB=D0=B5=20chan?= =?UTF-8?q?nel=20=D0=B2=20=D1=84=D0=BE=D1=80=D0=BC=D0=B5=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D0=B5=D0=B3=D1=80=D0=B0=D0=BC-=D0=B8=D1=81=D1=82=D0=BE?= =?UTF-8?q?=D1=87=D0=BD=D0=B8=D0=BA=D0=B0=20(fix-sources-add-channel)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Форма добавления не имела поля channel, валидатор требует его для crawler=telegram → 'telegram-источнику нужен channel'. Добавлено поле в add-форму (required для telegram через JS), показ channel в таблице у telegram-источников. Backend не менялся. web/templates/sources.html ранее отсутствовал в git — добавлен. --- STATUS.md | 7 +- .../fix-sources-add-channel/.openspec.yaml | 3 + .../changes/fix-sources-add-channel/design.md | 55 +++++++ .../fix-sources-add-channel/proposal.md | 34 ++++ .../changes/fix-sources-add-channel/tasks.md | 15 ++ web/templates/sources.html | 155 ++++++++++++++++++ 6 files changed, 268 insertions(+), 1 deletion(-) create mode 100644 openspec/changes/fix-sources-add-channel/.openspec.yaml create mode 100644 openspec/changes/fix-sources-add-channel/design.md create mode 100644 openspec/changes/fix-sources-add-channel/proposal.md create mode 100644 openspec/changes/fix-sources-add-channel/tasks.md create mode 100644 web/templates/sources.html diff --git a/STATUS.md b/STATUS.md index 1334d8f..e3ddcc0 100644 --- a/STATUS.md +++ b/STATUS.md @@ -1,8 +1,12 @@ # VESTI — Статус -Обновлено: 2026-09-15 (RSS: сохранение абзацев/разметки в текстах новостей) +Обновлено: 2026-09-16 (fix-sources-add-channel: поле channel в форме добавления TG-источника) ## Текущее состояние +- **fix-sources-add-channel** (2026-09-16): добавление telegram-источника через веб снова работает. Поле `channel` добавлено в форму (required для telegram через JS) и показывается в таблице. Причина: UI-форма не имела поля channel. `web/templates/sources.html` ранее отсутствовал в git — добавлен. - **FEDIVERSE-ПУБЛИКАЦИЯ РАБОТАЕТ** (2026-09-13): publisher-service умеет публиковать карточки в GoToSocial (social.dedinit.ru) от имени бот-аккаунта **@vesti@dedinit.ru** (Mastodon-совместимый API). Change `gotosocial-publisher`. - Аккаунт **vesti** создан на GtS (2026-09-13, confirmed+approved, admin=0), OAuth-приложение `vesti-publisher` (client_id=01B09QNDM9YQ2VQVSRXHCVAV6K), токен в .env (`GT_SOCIAL_ACCESS_TOKEN`, scope `read write`), канал `VESTI_GTS_CHANNELS=@vesti@dedinit.ru`. - healthz publisher: блок `gotosocial` — url, account=vesti, token_set=true, account_ok=true. diff --git a/openspec/changes/fix-sources-add-channel/.openspec.yaml b/openspec/changes/fix-sources-add-channel/.openspec.yaml new file mode 100644 index 0000000..63c288a --- /dev/null +++ b/openspec/changes/fix-sources-add-channel/.openspec.yaml @@ -0,0 +1,3 @@ +schema: spec-driven +created: 2026-09-16 +skip_specs: true \ No newline at end of file diff --git a/openspec/changes/fix-sources-add-channel/design.md b/openspec/changes/fix-sources-add-channel/design.md new file mode 100644 index 0000000..f4e4470 --- /dev/null +++ b/openspec/changes/fix-sources-add-channel/design.md @@ -0,0 +1,55 @@ +# fix-sources-add-channel + +## Дизайн + +### 1. Форма добавления — поле channel (web/templates/sources.html) + +Вставить после поля `url` (перед `crawler`), чтобы telegram-поля шли вместе: + +```html +
+ + +
+``` + +Поле обязательное только для telegram: маленький inline-скрипт в конце формы +переключает атрибут `required` при смене `select[name=crawler]`: + +```html + +``` + +### 2. Таблица — показ channel у telegram (web/templates/sources.html) + +В колонке crawler (строки 91-93) добавить вывод channel для telegram, +по аналогии с feed_url для rss: + +```html + {{ s['crawler'] }} + {% if s['crawler'] == 'rss' and s['feed_url'] %}
{{ s['feed_url'] }}{% endif %} + {% if s['crawler'] == 'telegram' and s['channel'] %}
{{ s['channel'] }}{% endif %} + +``` + +### 3. Backend — без изменений + +`web/app.py::_form_source` уже собирает `channel` (строка 877), +`sources/sources.py::_validate_source` уже проверяет (строка 218), +`db_source_to_yaml` уже пишет в yaml (строка 181). Правки только в шаблоне. + +## Проверка + +1. `openspec validate fix-sources-add-channel` — чисто. +2. Ручной тест через веб: добавить telegram-источник с channel → success; + без channel → браузер подсветит поле, серверная ошибка не нужна. +3. Рестарт `vesti-web`, проверить страницу /sources. \ No newline at end of file diff --git a/openspec/changes/fix-sources-add-channel/proposal.md b/openspec/changes/fix-sources-add-channel/proposal.md new file mode 100644 index 0000000..4f0e26d --- /dev/null +++ b/openspec/changes/fix-sources-add-channel/proposal.md @@ -0,0 +1,34 @@ +# fix-sources-add-channel + +Добавление telegram-источника из веб-модерации падало с ошибкой +«telegram-источнику нужен channel», хотя пользователь заполнял slug и название. + +## Why + +В форме добавления источника (`web/templates/sources.html`) поле `channel` +отсутствовало. `_form_source()` в `web/app.py` читает `channel` из формы, +`_validate_source()` в `sources/sources.py:218` требует его для `crawler=telegram` +— поэтому любой telegram-источник, добавленный через веб, отклонялся, +а rss-источник — нет (feed_url в форме есть). + +## What Changes + +- **web/templates/sources.html (форма добавления)**: добавлено поле `channel` + с подсказкой «@handle или t.me/... для telegram»; для `crawler=telegram` + становится `required` (маленький inline-скрипт переключает). +- **web/templates/sources.html (таблица)**: у telegram-источников под crawler + показывается `channel` (аналогично feed_url у rss), чтобы было видно, + какой канал привязан. + +## Why Not + +- Не трогаем backend: `_form_source`, `_validate_source`, `add_or_update_source` + уже корректно работают с полем `channel` — не хватало только UI. +- Не делаем авто-подстановку channel из url — разные форматы + (@handle, t.me/name, https://t.me/s/name), подстановка ненадёжна. + +## Impact + +- Telegram-источники снова можно добавлять из веб-модерации. +- В таблице виден привязанный канал — легче отлаживать нерабочие источники. +- Никаких изменений БД и БД-миграций — только шаблон. \ No newline at end of file diff --git a/openspec/changes/fix-sources-add-channel/tasks.md b/openspec/changes/fix-sources-add-channel/tasks.md new file mode 100644 index 0000000..20bf7ce --- /dev/null +++ b/openspec/changes/fix-sources-add-channel/tasks.md @@ -0,0 +1,15 @@ +# fix-sources-add-channel + +## Problem + +Форма добавления источника не имеет поля `channel`, хотя валидатор +(`_validate_source`) требует его для telegram-источников → добавление +telegram-источника из веб падает с «telegram-источнику нужен channel». + +## Tasks + +- [x] sources.html (add-форма): поле `channel` после url, required для telegram +- [x] sources.html (таблица): показ channel у telegram-источников +- [x] openspec validate clean +- [x] рестарт vesti-web; ручная проверка /sources (добавление telegram-источника) +- [x] STATUS.md актуализирован; commit + push gitverse \ No newline at end of file diff --git a/web/templates/sources.html b/web/templates/sources.html new file mode 100644 index 0000000..58f5c99 --- /dev/null +++ b/web/templates/sources.html @@ -0,0 +1,155 @@ +{% extends "base.html" %} +{% block title %}Источники{% endblock %} +{% block content %} +

📡 Источники Статус краулеров →

+ +{% if did %} +
+ {{ did }} +
+{% endif %} + + +
+
➕ Добавить источник
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + + +
+
+ + +
+
+
+ + +
+
+
+
+ +
+
+ + +
+
🗂️ Таблица ({{ sources|length }}) + источник истины: sources.yaml (правки пишутся в yaml + БД) +
+
+ + + + + + + + + {% for s in sources %} + + + + + + + + + + + + + {% endfor %} + +
slugНазваниеcrawlerdirectionlangpriorityenabledстатуспослед. запускдействия
{{ s['slug'] }} +
+
+ +
+
+
+
{{ s['crawler'] }} + {% if s['crawler'] == 'rss' and s['feed_url'] %}
{{ s['feed_url'] }}{% endif %} + {% if s['crawler'] == 'telegram' and s['channel'] %}
{{ s['channel'] }}{% endif %} +
{{ s['direction'] or '—' }} + {% if s['error_count'] %}
{{ s['error_count'] }} err{% endif %} +
{{ s['lang'] or 'ru' }} +
+ +
+
+ + {{ 'вкл' if s['enabled'] else 'пауза' }} + + + {% if s['status'] == 'dead' %}dead + {% elif s['status'] == 'alive' %}alive + {% elif s['status'] == 'new' %}new + {% else %}{{ s['status'] }}{% endif %} + {% if s['enabled'] == 0 %}пауза{% endif %} + {{ s['last_fetch'] or '—' }}{% if s['last_error'] %}
{{ s['last_error'][:40] }}{% endif %}
+
+ +
+
+ +
+
+
+
+{% endblock %} \ No newline at end of file