如果您拥有一个同时(但不限于)使用 Discourse 的社区网站,您可能希望为每个群组提供一个受限的子论坛,例如作为工作区。以下是 Ruby 实现方法:
-
确保您的 API 调用以具有管理员权限的用户身份进行身份验证。
-
创建一个包含群组领导者和普通用户的论坛群组
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。
- 保持外部群组与论坛群组的同步
# 新增普通成员
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)
- 创建一个仅对该群组可见的子类别(即子论坛)。建议您手动创建一个名为“工作区”、“受限区域”或其他名称的子论坛,作为所有这些子论坛的父类别,并将其放置在类别列表的底部。请注意,此容器论坛必须设置为“所有人都可见”(否则 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。
- 您可能希望预先填充此子论坛。我将为我的群组创建一个置顶的维基帖子,用于知识共享和规划。
# 在此子论坛中创建普通帖子
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
祝您使用愉快!