使用 API 为外部群组创建受限制的类别

如果您拥有一个同时(但不限于)使用 Discourse 的社区网站,您可能希望为每个群组提供一个受限的子论坛,例如作为工作区。以下是 Ruby 实现方法:

  1. 确保您的 API 调用以具有管理员权限的用户身份进行身份验证。

  2. 创建一个包含群组领导者和普通用户的论坛群组

params = { 
  "group": { 
    "name": "<group_name_with_underscores>", 
    "full_name": "<group name>", 
    "title": "Member of <group name>", # 可选:群组成员的论坛标签
    "mentionable_level": 99, # 可选:谁可以 @ 提及该群组?
    "messageable_level": 99, # 可选:谁可以向整个群组发送消息?
    "owner_usernames": "<comma-separated forum usernames of your group leaders>",
    "usernames": "<comma-separated forum usernames of the other group members>"
   }
}
r = Discourse.make_request("/admin/groups.json", params, "POST", true)

如果成功,请在响应中找到 ‘id’ 字段并记住它;这就是您的群组 ID。

  1. 保持外部群组与论坛群组的同步
# 新增普通成员
r = Discourse.make_request("/groups/#{group_id}/members.json", {"usernames": "<new_members as comma-separated string>"}, "PUT", true)
# 新增领导者
r = Discourse.make_request("/admin/groups/#{group_id}/owners.json", {"group": { "usernames": "<new leader forum usernames as comma-separated string>"}}, "PUT", true)
# 移除已离开的成员
r = Discourse.make_request("/groups/#{group_id}/members.json", {"usernames": "<leaving_members as comma-separated string>"}, "DELETE", true)
  1. 创建一个仅对该群组可见的子类别(即子论坛)。建议您手动创建一个名为“工作区”、“受限区域”或其他名称的子论坛,作为所有这些子论坛的父类别,并将其放置在类别列表的底部。请注意,此容器论坛必须设置为“所有人都可见”(否则 Discourse 将报错),并且可能不应允许任何人发帖。然后,您可以为每个新群组以编程方式创建子论坛。
params = { 
  "name": "<subforum name, e.g. same as group full name>", 
  "color": "<whatever>", # 可选
  "text_color": "<whatever>", # 可选
  "permissions": { 
    "<your group name with underscores>": "1", 
    "admins": "1", # 如果没有此项,您可能无法通过 API 删除子论坛
    "moderators": "1" 
   }, 
  "parent_category_id": "<见上文说明>", 
  "allow_badges": true,  # 可选
  "suppress_from_latest": true, # 可选
}
r = Discourse.make_request("/categories.json", params, "POST", true)

如果成功,请记下返回的类别 ID。

  1. 您可能希望预先填充此子论坛。我将为我的群组创建一个置顶的维基帖子,用于知识共享和规划。
# 在此子论坛中创建普通帖子
post_msg = "欢迎!此帖子可由群组成员共同编辑,既可用作知识库,也可用于跟踪共同项目。\n\n**以下是您可以选择使用或不使用的模板。**\n\n**群组成员的有用链接:**\n\n- 链接 1\n\n- 链接 2\n\n- 链接 3\n\n**我们目前正在开展的项目:**\n\n- 项目 1 - *已开始*。参与人员:成员 1、2 和 3\n\n- 项目 2 - *规划阶段*。将在下周一的会议上讨论。"
params = { "raw": post_msg, title: "Knowledge Wiki for #{group_name}", "category": category_id, "archetype": "regular"}
r = Discourse.make_request("/posts", params, "POST", true)
if r and r.status == 200
  my_post = JSON.parse(r.body)
  post_id = my_post["id"]
  topic_id = my_post["topic_id"]
  # 将其转换为维基
  begin
    r = Discourse.make_request("/posts/#{post_id}/wiki", {"wiki": true}, "PUT", false)
    rescue JSON::ParserError  # Discourse API 将返回错误的 JSON 响应,但幸运的是我们无需解析此内容
  end
  # 置顶此主题
  r = Discourse.make_request("/t/topic/#{topic_id}/status", { 
    "status": "pinned", 
    "enabled": "true", # 注意:必须是字符串,否则将取消置顶
    "until": "3020-01-01 08:00+1:00" # 永久
  }, "PUT", false)
end

祝您使用愉快!

5 个赞