Utilisez l'API pour créer des catégories restreintes pour des groupes externes

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 :

  1. Assurez-vous que vos appels API s’authentifient en tant qu’utilisateur disposant de privilèges d’administrateur.

  2. 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.

  1. 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)
  1. 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.

  1. 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 !

5 « J'aime »