私有分类中已暂存用户不接收分类通知

我的实例上的暂存用户无法收到私有分类中帖子的电子邮件通知,即使他们已被添加到应授予其相应权限的群组中。这似乎是由于 Discourse 最近的某项变更导致的。


:ballet_shoes: 复现步骤

  1. 创建一个暂存用户
  1. 创建一个仅对特定群组可见的分类(成员拥有“创建/回复/查看”权限,但未分配其他权限)

  2. 通过在“批量添加到群组”按钮中输入其电子邮件地址,将暂存用户添加到该群组

  • “添加成员”对话框无法识别暂存用户的用户名,这可能是设计使然)
  • 不过,该用户确实会显示在成员列表中
  1. 进入暂存用户的偏好设置页面,将其对该分类的订阅状态设置为“关注”

  2. 在该私有分类中发布新帖子

:white_check_mark: 在我的社区开发站点(运行 v2.4.0.beta3 +10)上,这成功地向暂存用户以及任何关注该分类的非暂存用户发送了电子邮件通知。

:negative_squared_cross_mark: 在我们的生产站点(运行 2.4.0.beta9)上,该帖子的任何内容均未出现在用户的通知页面中。如果我在该用户的管理员页面点击“模拟登录”以取消暂存状态,通知便能正常接收。


:wrench: 这两个站点的配置几乎完全相同(均已启用 SSO)。


:art: 背景

我们的使用场景是将邮件列表迁移到 Discourse,但这些列表是面向社区内部特定子群体的(因此需要创建仅对特定群组成员可见的分类)。我们希望支持暂存用户,以便那些希望继续通过电子邮件进行互动的人能够更平滑地从现有列表过渡。

我们发现,让人们默认继续接收发送到邮件列表的所有消息的最简单方法是使用 Mozilla 的 group-category-notification 插件,使群组的所有成员自动“关注”该分类(切换到 Discourse 的主要优势之一是可以在不退出列表的情况下降低邮件接收频率,因此从现有行为——即接收所有消息——开始似乎是合理的)。

我读到过 将暂存用户添加到群组的功能“可能随时停止工作”,因此我也很乐意听取其他建议 :pray:

1 个赞

我们最近添加了一个修复,因为处于暂存阶段的用户收到了他们本不应看到的内容的通知:

@Roman 不过,如果用户有权访问该群组,应该可以正常工作,对吧?

5 个赞

@eviltrout 谢谢,这看起来正是问题所在:

# lib/guardian/topic_guardian.rb,第 152 行
-    can_see_category?(topic.category)
+    category = topic.category
+    can_see_category?(category) &&
+       (!category.read_restricted || !is_staged? || topic.user == user)

逻辑已从检查 can_see_category?(topic.category) 是否通过(我认为它是通过的,见下文),变为在所有情况下都禁止向已暂存(staged)的用户发送通知。

这看起来是个 bug?:bug: 否则,即使已明确授予权限,已暂存的用户也永远收不到私密分类中帖子的通知。我应该把它移到 bug 吗?

can_see_category?

我认为 can_see_category? 是通过的,因为最后一行:

def can_see_category?(category)
    return false unless category
    return true if is_admin?
    return true if !category.read_restricted
    return true if is_staged? && category.email_in.present? && category.email_in_allow_strangers
    # 这一行:
    secure_category_ids.include?(category.id)
  end
  • 用户处于暂存状态
  • 该分类已设置“邮件接收”地址
  • category.email_in_allow_strangers 已启用 我禁用了 email_in_allow_strangers,因为我意识到我不需要它……但 secure_category_ids.include?(category.id) 返回 true
1 个赞

我提交了一个拉取请求,恢复了已分阶段用户的通知功能:

编辑:已合并!谢谢大家!

6 个赞

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.