事件复制器:将日历事件/主题复制到新时间段

: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-prixsignature-race;匹配结果取并集并去重,因此具有多个匹配标签的主题仅显示一次),可选择限制源日期范围,然后在确认前审核建议的下一次发生日期。
  • 单事件复制:针对单个主题执行相同的审核和确认流程,通过该主题的管理菜单(扳手图标)访问。
  • 可编辑的审核步骤:每一行显示原始开始日期旁边建议的新日期(可编辑,粒度为天),以及可编辑的标题。结束日期始终根据源事件自身的持续时间自动推导,因此不会因开始日期的编辑而不同步。
  • 两种可插拔的日期偏移策略,每次运行时可选,并配有可配置默认值:
    • 相同日历日期:按配置的月数向前偏移。
    • 月份第 N 个星期几:即使偏移落在不同月份,也保留例如“每月第三个星期六”的规则。
  • 可配置的偏移量:按任意月数向前偏移(默认为 12,即一年),不仅限于年度。适用于每月、每季度或其他重复周期。每次运行时可覆盖,并通过新设置(见下文)提供站点范围的默认值。
  • “日期待定”标记:对于现实世界中日期尚未确定的事件,标记该行。可配置的注释(默认 (date TBD))将附加到主题标题和事件名称中。
  • 复制跟踪:防止重复复制同一事件两次(相关因为一个主题可以携带多个系列标签)。已复制的主题在审核中默认被标记并取消选中,需明确重新勾选才能强制覆盖。删除复制后的主题会自动释放其源,以便重新复制;恢复删除则会重新锁定。
  • 复制后反馈:成功复制的行会在审核表中直接变为指向新主题的链接。真正的失败会按行报告,而不是中止整个批次。

要求

  • 必须安装并启用 discourse-calendar。本插件通过 discourse-calendar 自身的 [event ...] 帖子标记和 DiscoursePostEvent::Event 模型来复制事件,而不是发明单独的日期存储。
  • 针对 Discourse 2026.7.0 进行测试。未在更早版本中验证。

配置

所有设置均在 管理 → 设置 → 插件 下,搜索 event_duplicator

设置 默认值 描述
event_duplicator_enabled 关闭 启用插件。
event_duplicator_allowed_groups staff 允许复制事件的组(除了正常的每类别主题创建权限)。注意:空列表表示无人,而非所有人。添加“everyone”组以完全开放此权限。
event_duplicator_default_date_strategy 相同日历日期 默认日期偏移规则;每次运行时可覆盖。
event_duplicator_default_shift_months 12 默认偏移量,以月为单位;每次运行时可覆盖。
event_duplicator_tbd_annotation (date 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 Shift(月份)功能已在 v1.1.0 中发布。

审核页面现在在“日期”规则下拉菜单旁边增加了一个“Shift(月份)”字段。默认值为 12,行为与之前相同,但您可以为每次运行单独覆盖该值。此外,如果您希望设置不同的全局默认值,还有一个新的 event_duplicator_default_shift_months 站点设置。

它适用于两种日期规则。需要特定星期几的月度或季度系列仍然会应用“同月同星期几”的处理方式,只是按照您设置的月份间隔而非固定的年份间隔进行。

请更新至 v1.1.0 以获取该功能(如果您的 app.yml 固定了特定标签,请重新构建)。如果您感兴趣,问题 #19 中包含了实现细节。

我认为更新主帖(OP)也是合理的。我预计明天会完成更新。

1 个赞