外部グループ向けに制限付きカテゴリを作成するには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. このグループのみがアクセスできるサブカテゴリ(別名:サブフォーラム)を作成します。すべてのサブフォーラムの親カテゴリとなる「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 を覚えておいてください。

  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