Si vous disposez d’un site communautaire qui utilise également (mais pas exclusivement) Discourse, vous pouvez souhaiter fournir un sous-forum restreint pour chacun de vos groupes, par exemple en tant qu’espace de travail. Voici comment faire, en Ruby :
-
Assurez-vous que vos appels API s’authentifient en tant qu’utilisateur disposant de privilèges d’administrateur.
-
Créez un groupe de forum incluant les leaders de votre groupe et les utilisateurs réguliers
params = {
"group": {
"name": "<group_name_with_underscores>",
"full_name": "<nom du groupe>",
"title": "Membre de <nom du groupe>", # optionnel : surnom de forum pour les membres du groupe
"mentionable_level": 99, # optionnel : qui peut @mentionner ce groupe ?
"messageable_level": 99, # optionnel : qui peut envoyer un message à tout le groupe ?
"owner_usernames": "<pseudo du forum des leaders du groupe, séparés par des virgules>",
"usernames": "<pseudo du forum des autres membres du groupe, séparés par des virgules>"
}
}
r = Discourse.make_request("/admin/groups.json", params, "POST", true)
En cas de succès, trouvez le champ ‘id’ dans la réponse et notez-le ; c’est l’ID de votre groupe.
- Gardez le groupe externe et le groupe de forum synchronisés
# nouveaux membres simples
r = Discourse.make_request("/groups/#{group_id}/members.json", {"usernames": "<nouveaux_membres sous forme de chaîne séparée par des virgules>"}, "PUT", true)
# nouveaux leaders
r = Discourse.make_request("/admin/groups/#{group_id}/owners.json", {"group": { "usernames": "<nouveaux pseudo de leaders du forum, séparés par des virgules>" }}, "PUT", true)
# supprimer les membres qui ont quitté
r = Discourse.make_request("/groups/#{group_id}/members.json", {"usernames": "<membres_partants sous forme de chaîne séparée par des virgules>"}, "DELETE", true)
- Créez une sous-catégorie (alias sous-forum) accessible uniquement à ce groupe. Je recommande de créer manuellement un sous-forum « Workspaces » ou « Restreint » ou tout autre nom, qui sera la catégorie parente pour tous ceux-ci, et de le placer en bas de vos catégories. Notez que ce forum conteneur doit avoir « Tout le monde peut voir » (sinon Discourse affichera une erreur) et ne devrait probablement permettre à personne d’écrire. Ensuite, vous pouvez créer programmatiquement des sous-forums pour chaque nouveau groupe.
params = {
"name": "<nom du sous-forum, par exemple le même que le nom complet du groupe>",
"color": "<n'importe quoi>", # optionnel
"text_color": "<n'importe quoi>", # optionnel
"permissions": {
"<votre nom de groupe avec des underscores>": "1",
"admins": "1", # si vous ne l'avez pas, vous ne pourrez peut-être pas supprimer votre sous-forum sauf via l'API
"moderators": "1"
},
"parent_category_id": "<voir note ci-dessus>",
"allow_badges": true, # optionnel
"suppress_from_latest": true, # optionnel
}
r = Discourse.make_request("/categories.json", params, "POST", true)
En cas de succès, notez l’ID de catégorie que vous recevez en retour.
- Vous pouvez souhaiter pré-remplir ce sous-forum. Je donnerai à mon groupe un post wiki épinglé pour le partage de connaissances et la planification.
# créer un post régulier dans ce sous-forum
post_msg = "Bienvenue ! Ce post est modifiable par tous les membres du groupe et peut être utilisé comme référentiel de connaissances ainsi que pour suivre des projets communs.\n\n**Ce qui suit est un modèle que vous pouvez décider d'utiliser ou non.**\n\n**Liens utiles pour les membres du groupe :**\n\n- Lien 1\n\n- Lien 2\n\n- Lien 3\n\n**Voici les projets sur lesquels nous travaillons actuellement :**\n\n- Projet 1 - *commencé*. Impliqués : Membre 1, 2 et 3\n\n- Projet 2 - *phase de planification*. À discuter lors de notre prochaine réunion lundi."
params = { "raw": post_msg, title: "Wiki de connaissances pour #{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"]
# le transformer en wiki
begin
r = Discourse.make_request("/posts/#{post_id}/wiki", {"wiki": true}, "PUT", false)
rescue JSON::ParserError # L'API Discourse renverra une mauvaise réponse JSON, mais heureusement nous n'avons pas à la parser
end
# épingler ceci
r = Discourse.make_request("/t/topic/#{topic_id}/status", {
"status": "pinned",
"enabled": "true", # attention : doit être une chaîne, sinon le sujet sera désépinglé
"until": "3020-01-01 08:00+1:00" # pour toujours
}, "PUT", false)
end
Amusez-vous bien !