Браузеры залипали на старом index.html (эвристический кеш без Cache-Control),
из-за чего не подхватывали новый билд. Теперь index.html — no-store, а
ассеты с хешем в имени — immutable на год.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
CMS copp74.ru дописывает в хвост ссылки путь публикации (/page/<uuid>),
из-за чего последний slug ломался. Теперь при чтении URL берём часть
slug'а до первого «/» и убираем дубли — покорёженные ссылки работают.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
NewsFeed читает category/tag/period/q из query-параметров при загрузке
и пишет их обратно в URL при изменении фильтров. Теперь адрес в строке
браузера — готовая ссылка: ?category=slug1,slug2 открывает ленту сразу
с выбранными колледжами (для кнопок на внешнем сайте).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Параметр category в /news принимает несколько slug'ов через запятую
(category_id IN ...), обратно совместим с одиночным slug. FilterBar:
чипы колледжей стали переключателями (можно отметить несколько),
filters.category теперь массив.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
run_import останавливал группу по batch_new==0, из-за чего для групп
без строгого фильтра (strict_filter=False) фоновый импорт обрывался на
первом батче без новых записей и не доходил до более старых
нетегированных постов.
_process_post теперь возвращает статус imported|exists|skipped, а
условие остановки ветвится: строгий фильтр — прежнее поведение,
без фильтра — стоп только когда весь батч уже в БД.
Заодно run_history_import передаёт screen_name для корректных source_url.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
nginx: любой путь кроме /admin, /editor/, /api/ редиректит на /.
Использован named location @spa чтобы избежать повторной маршрутизации
при внутреннем редиректе try_files → /index.html.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- VkSource: добавлено поле screen_name, заполняется из VK API при добавлении источника
- vk_parser: source_url теперь в формате vk.com/{screen_name}?w=wall{owner}_{post}
вместо устаревшего vk.com/wall{owner}_{post}
- _vk_post_exists: проверка через LIKE чтобы находить оба формата URL
- admin_vk: автоматически получает screen_name при создании/обновлении источника
- admin_system: исправлен regex в repair-media-urls — только /news-media/ URL
- Alembic миграция: b2c3d4e5f6a7 добавляет колонку screen_name в vk_sources
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>