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)
- このグループのみがアクセスできるサブカテゴリ(別名:サブフォーラム)を作成します。すべてのサブフォーラムの親カテゴリとなる「Workspaces」や「Restricted」などのサブフォーラムを手動で作成し、カテゴリリストの最下部に配置することを推奨します。なお、このコンテナとなるフォーラムは「全員が閲覧可能」に設定する必要があります(そうしないと 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": "<see note above>",
"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
お楽しみください!