Если у вас есть сайт сообщества, который также (но не исключительно) использует 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 # 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
Удачи!