Дубликатор событий: дублирование событий/тем календаря в новый период времени

:information_source: Краткое описание Позволяет авторизованным пользователям дублировать события/темы календаря (созданные через Discourse Calendar and Events ) в новый период времени. Работает с одной темой или целой серией с тегом (например, все темы с тегом `grand-prix`), с этапом проверки для редактирования предлагаемых дат перед подтверждением.
:hammer_and_wrench: Ссылка на репозиторий GitHub - louking/discourse-event-duplicator: discourse plugin to duplicate events · GitHub
:open_book: Руководство по установке Как устанавливать плагины в Discourse

Краткое описание

Этот плагин был создан для сообщества бегунов, у которых календарь в основном состоит из одних и тех же событий, происходящих каждый год, но в смещенные даты. Ежегодное ручное воссоздание темы для каждого события означало дублирование блока [event ...], исправление заголовка и поиск того, какие из них уже были переделаны. Это было утомительно и чревато ошибками. Event Duplicator автоматизирует этот процесс: выберите исходное событие или целую серию с тегом, получите предлагаемую новую дату, просмотрите или отредактируйте ее и подтвердите.

См. docs/USAGE.md для полного руководства по использованию: кто может им пользоваться, дублирование серии против одной темы, как работает этап проверки.

Возможности

  • Дублирование серии: выберите категорию и один или несколько тегов (например, grand-prix, signature-race; совпадения объединяются по логическому ИЛИ и удаляются дубликаты, поэтому тема с несколькими совпадающими тегами отображается только один раз), необязательно с ограничением по диапазону исходных дат, затем просмотрите предлагаемые даты следующего события перед подтверждением.
  • Дублирование одного события: тот же процесс проверки и подтверждения для одной темы за раз, из меню администратора этой темы (иконка гаечного ключа).
  • Редактируемый этап проверки: в каждой строке отображается исходная дата начала рядом с предлагаемой новой датой, которую можно редактировать (с точностью до дня), а также редактируемый заголовок. Дата окончания всегда вычисляется автоматически на основе длительности исходного события, поэтому она не может рассинхронизироваться с отредактированной датой начала.
  • Две настраиваемые стратегии смещения дат, выбираемые для каждого запуска с настраиваемым значением по умолчанию:
    • Та же календарная дата: сдвиг вперед на заданное количество месяцев.
    • N-й будний день месяца: сохраняет, например, “3-е субботу месяца”, даже если сдвиг попадает в другой месяц.
  • Настраиваемое значение смещения: сдвиг вперед на любое количество месяцев (12, т.е. один год, по умолчанию), а не только ежегодно. Полезно для ежемесячных, ежеквартальных или других повторяющихся периодов. Можно переопределить для каждого запуска, с глобальным значением по умолчанию через новую настройку (ниже).
  • Флаг “Дата TBD”: для событий, реальная дата которых еще не определена, пометьте строку. Настраиваемая аннотация (по умолчанию (date TBD)) добавляется к заголовку темы и имени события.
  • Отслеживание дубликатов: предотвращает повторное дублирование одного и того же события (актуально, так как тема может иметь более одного тега серии). Уже продублированные темы помечаются и по умолчанию не выбираются на этапе проверки, с возможностью явного повторного выбора для принудительного дублирования. Удаление продублированной темы автоматически освобождает исходную для повторного дублирования, а восстановление — снова блокирует ее.
  • Обратная связь после дублирования: успешно продублированные строки превращаются в ссылку на новую тему прямо в таблице проверки. Реальные ошибки сообщаются для каждой строки, а не прерывают всю партию.

Требования

  • discourse-calendar должен быть установлен и включен. Этот плагин дублирует события, используя собственную разметку постов [event ...] и модель DiscoursePostEvent::Event discourse-calendar, вместо создания отдельного хранилища дат.
  • Тестировалось на Discourse 2026.7.0. Не проверено на более ранних версиях.

Настройка

Все настройки находятся в Админ → Настройки → Плагины, найдите event_duplicator:

Настройка По умолчанию Описание
event_duplicator_enabled выкл Включает плагин.
event_duplicator_allowed_groups staff Группы (в дополнение к обычным правам создания тем в категории), которым разрешено дублировать события. Примечание: пустой список означает “никто”, а не “все”. Добавьте группу “все”, чтобы полностью открыть этот доступ.
event_duplicator_default_date_strategy Та же календарная дата Правило смещения даты по умолчанию; можно переопределить для каждого запуска.
event_duplicator_default_shift_months 12 Значение смещения по умолчанию, в месяцах; можно переопределить для каждого запуска.
event_duplicator_tbd_annotation (date TBD) Текст, добавляемый к заголовку/имени события продублированной темы, если она помечена как TBD на этапе проверки. Оставьте пустым, чтобы полностью отключить функцию аннотации.

Авторизация является логическим И трех проверок: обычные права категории Discourse, членство в event_duplicator_allowed_groups и собственное разрешение discourse-calendar на создание постов [event].

Известные ограничения

  • Редактирование дат на этапе проверки имеет точность только до дня (нет редактирования времени суток). Это осознанное решение по области применения: целевой сценарий — повторяющиеся даты гонок/событий, а не время.

Исходный код / проблемы

Обновлено 2026-08-01: v1.1.0 добавляет настраиваемое смещение по месяцам, см. ниже

4 лайка

Отличная работа! И спасибо, что поделились этим с другими. Это эффективно закрывает пробел в функциональности calendar-and-events.

Мне кажется, что, возможно, его лучше назвать «Дубликатор ежегодных событий», поскольку он, судя по всему, не предназначен для ежемесячного дублирования.

Не могли бы вы расширить его функционал, чтобы охватить и ежемесячные сценарии использования?

У нас много ежемесячных, двухмесячных и трехмесячных (то есть ежеквартальных) событий, которые проходят в X-й понедельник (и т. д.) месяца. Они содержат значительный объем документации и загруженных файлов, из-за чего они не подходят для стандартного механизма повторяющихся событий.

В настоящее время это требует довольно много ручных действий, и ошибки неизбежны!!

Из-за более сжатых сроков, чтобы это работало, вероятно, потребуется какой-то механизм уведомлений (например, личное сообщение владельцу темы и/или администраторам) после завершения текущего события (если оно отмечено соответствующим тегом).

1 лайк

Возможно. Один из вариантов — добавить в представление дублирующихся событий элемент управления «сдвиг (месяцы)», значение по умолчанию для которого будет определяться новым параметром. Это то, что вы ищете?

Я создал задачу add n months shift support · Issue #19 · louking/discourse-event-duplicator · GitHub для отслеживания этого вопроса. У меня сейчас много других задач, поэтому я не уверен, какой приоритет будет у этой работы. Однако, на первый взгляд, кажется, что это довольно быстрое изменение.

Честно говоря, эта часть меня меньше всего интересует. Если бы события были частью серии (то есть имели определённый тег), плагину пришлось бы запоминать, какое из отмеченных событий было последним, отслеживать появление нового события в конце серии и т. д. Я предполагаю, что потребности в таких уведомлениях будут разнообразными, и я не думаю, что смогу учесть все возможные варианты.

1 лайк

Отлично, спасибо.

Понятно! Но, если подумать, это можно довольно легко реализовать с помощью простой закладки.

@nathank Сдвиг (по месяцам) был выпущен в версии v1.1.0.

На странице обзора теперь есть поле «Сдвиг (по месяцам)» рядом с выпадающим списком правила «Дата». По умолчанию оно равно 12, что соответствует предыдущему поведению, но вы можете переопределить его для каждого запуска. Также появилось новое глобальное настройка event_duplicator_default_shift_months, если вы хотите установить другое значение по умолчанию для всего сайта.

Это работает с обоими правилами даты. Ежемесячная или ежеквартальная серия, требующая определённого дня недели, по-прежнему использует правило «тот же день недели месяца», но с заданным вами интервалом в месяцах вместо фиксированного года.

Обновитесь до версии v1.1.0, чтобы получить эту функцию (пересоберите приложение, если в вашем app.yml зафиксирован конкретный тег). В проблеме #19 можно найти детали реализации, если интересно.

Думаю, имеет смысл также обновить исходное сообщение. Я, скорее всего, займусь этим завтра.

1 лайк