Благодарность за bypass_bump в вызовах REST API для редактирования первого сообщения в темах

Продолжая обсуждение из Как редактировать пост через API, не поднимая тему?:

Хочу выразить большую благодарность команде Discourse за добавление параметра bypass_bump! Это небольшой, но мощный инструмент — он позволяет скриптам и плагинам обновлять контент незаметно, не поднимая случайно старые темы в списке последних.

В нашем случае мы используем его для скриптов синхронизации ICS, что гарантирует, что темы поднимаются только при действительно значимых изменениях. Продуманное дополнение, которое помогает поддерживать чистоту на форумах сообщества и не нарушает опыт чтения — ещё раз спасибо!

Это не вводящий в заблуждение пост с похвалой, как мой предыдущий :see_no_evil_monkey:, потому что:

  • Discourse поддерживает флаг bypass_bump при редактировании поста; он предотвращает изменение даты поднятия темы, даже если вы редактируете последний (или единственный) пост. Это явно указано в опциях PostRevisor («- bypass_bump: не поднимать тему, даже если это последний пост»).
  • Тема с похвалой существует и прямо указывает на этот случай использования.
  • Исторически люди использовали обходной путь /t/{id}/reset-bump-date, поскольку эта опция не была широко известна/документирована в документации API, но она всё ещё доступна при необходимости.

Практическое замечание: при отправке PUT-запроса к /posts/{post_id}.json с новым raw и указанием bypass_bump=true, редактирование не отобразит тему в разделе /latest. (Официальная документация не описывает этот параметр явно, но он подключён на стороне сервера через PostRevisor.)

Я всё ещё не на 100% уверен в официальном статусе параметра bypass_bump в документации API — он нигде явно не упоминается.

Однако логи Python-скрипта синхронизации от Ethsim12 весьма показательны. Скрипт пытается вызвать API с параметром bypass_bump=true. Если бы этот параметр игнорировался или был некорректным, единственным механизмом, предотвращающим лишние обновления, стал бы добавленный ими запасной вариант — ручной вызов:

/t/{topic_id}/reset-bump-date

Таким образом, сам вывод логов становится убедительным доказательством. Если в логах видно, что темы обновляются, не появляясь в разделе /latest (и без необходимости использовать запасной вариант сброса), это довольно весомое подтверждение того, что bypass_bump активен и работает. Если же скрипт всегда прибегает к reset-bump-date, возможно, параметр не работает.

Иными словами, логи этого скрипта во многом помогают подтвердить, существует ли параметр bypass_bump и действительно ли Discourse его учитывает.

Вас может заинтересовать этот pull request

Спасибо за этот PR, moin — очень полезный контекст.

Для моего стороннего проекта (импортер ics_to_discourse.py) я как раз только что закоммитил изменение, чтобы остановить «шумное» обновление тем при календарных обновлениях:

Этот коммит добавляет логику для определения, является ли правка «существенной» (изменение времени, места и т. д.), и использует bypass_bump с запасным вариантом сброса даты обновления, чтобы обычные синхронизации ICS не поднимали темы без необходимости.

Так что этот PR идеально совпадает с тем, к чему я стремился — приятно видеть, что ядро движется в том же направлении. Как только поведение «не обновлять при правке» будет слито, я упрощу код и уберу дополнительный запасной вариант, но пока что этот коммит сохраняет всё в тишине на текущих установках Discourse.

Я только что заметил это в #praise и перенёс в Development, так как это довольно технический вопрос. Конечно, я очень ценю похвалу! :hugs:

Хм, я перечитал эту тему и понял, что не включил ещё один релевантный PR, когда я не был активен в университете и у меня было время писать код