将类别设为私有并添加用户至特定访问组

标题可能有点晦涩,但上下文是想将一个类别转换为“私有”,同时能够识别在特定时间范围内参与过该类别的所有用户,并将他们添加到某个组中,以便为该组设置访问权限。

假设该组可以提前创建。

目前支持的功能:

  • 创建组
  • 为组分配类别权限
  • 修改类别权限

缺少的功能是根据用户在特定时间范围内与该类别的互动情况,“将这些用户分配给一个组”的方法。

也许有可以执行的查询或代码可以识别这些用户并将他们分配给一个组?

我使用了一个数据探索器查询来找出在 user_actions 中参与了某个主题的用户:

-- [params]
-- int :topic = 3620561


select user_id,
       sum(action_type) actions,
       sum(case action_type when 5 then 1 else 0 end) replies
from user_actions ua
     join users u on u.id = ua.user_id
where target_topic_id = :topic
      and moderator is false
      and admin is false
group by ua.user_id

这包括了回复、点赞、编辑和提及等操作。我还有一个包含投票响应的查询。这是为了收集潜在客户,但我认为除了回复之外还做了一些事情的人可能对该主题有要求。“参与”的定义可能是一个有用的练习。

要扩展到整个类别,请与 topics t on target_topic_id = t.id 连接,并在 where 子句中添加 category_id。根据 ua.created_at 定义时间范围应该不难。

2 个赞

谢谢 @jericson,这正是我想要的。

我猜我可以将结果输入到一个查询中,然后将所有用户添加到一个组中。

有人有过这方面的经验吗?也许最好是粗暴地复制粘贴用户 ID 并运行一个 Ruby 函数,如果有什么可用的?

这通常是我首选的解决方案。但更有意义的做法是从批量操作示例中借鉴,并在 Rails 中对 User 对象应用 where 子句。(有一个测试环境在这种时候很有帮助!)

根据用户数量,您可以将逗号分隔的列表粘贴到“添加用户到组”框中,这是否有用?

(还有一个基于徽章将用户添加到组的自动化,您可以使用此 SQL 作为基础。不过,如果您对 Rails 选项满意,这可能有点复杂)

1 个赞

我正是为此(以及测试 Ember 5 会破坏什么 :stuck_out_tongue: )才把预演环境应用上线。

在接下来的几天里,我会深入研究一下,前提是我的“正经工作”能给我留出时间 :smiley:

以防其他人需要,在此留下完整的查询:

select ua.user_id, u.username, sum(action_type) actions, sum(case action_type when 5 then 1 else 0 end) replies from user_actions ua 
join users u on u.id = ua.user_id
join topics t on target_topic_id = t.id
where ua.created_at > 'YYYY-MM-DD'::date and t.category_id = CATEGORY_ID
group by ua.user_id, u.username;

只需将 YYY-MM-DD 替换为您的截止日期,将 CATEGORY_ID 替换为您的类别 ID。
结果将显示 user_id、username、actions 和 replies。

你能给我指一下那个脚本吗,@JammyDodger

我在@jericson 粘贴的链接里没找到。

我可以提取一个用户列表(大约有250个)。

1 个赞

我建议的选项在 UI 中可用,尽管第二个选项需要 Discourse Automation 插件(不过这是一个很好的插件 :slight_smile:

1 个赞

抱歉,我不明白那如何能帮到我。

我有一个用户 ID 列表(甚至用户名),我需要将它们添加到组中。
我看不到当前自动化中有任何可以帮助我的用例。只有根据徽章或自定义字段添加用户到组,但这只意味着增加一个额外的步骤(为所有这些用户添加一个徽章或为用户添加一个自定义字段,然后为我想要添加的特定用户添加一个值)。

难道没有 bulk_add_user_to_group 函数,甚至没有 add_user_to_group 函数,我可以简单地在循环中调用吗?

是的,用那种方式会有点麻烦。但是,如果你有一个较短的列表,你可以将资源管理器结果导出为 CSV,在记事本中打开,然后将它们复制并粘贴到“添加用户”框中:

你一次可能可以添加 250 个用户,尽管我还没有尝试过那么多。不过,如果不行的话,分几批应该也能完成。


也可以通过 API 使用 PUT 请求到 eg /groups/49/members.json 端点(你需要你自己的 group_id)并提供你的用户名/电子邮件列表来完成。

1 个赞

完美运行,我忘了你可以在 UI 中添加多个用户名 :slight_smile:

对于其他人,要导出 psql 查询结果,只需运行:

psql
\o /home/discourse/output.txt

<在此处插入你的查询>
\o
exit

现在在 /home/discourse/output.txt 中,你将获得查询结果,就像它在屏幕上打印出来一样。

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