Используйте 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  # API Discourse вернёт некорректный 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 лайков