Se possiedi un sito community che utilizza anche (ma non esclusivamente) Discourse, potresti voler fornire un sottoforum limitato per ciascuno dei tuoi gruppi, ad esempio come spazio di lavoro. Ecco come fare, in Ruby:
-
Assicurati che le tue chiamate API si autentichino come un utente con privilegi di Amministratore.
-
Crea un gruppo forum includendo i leader del tuo gruppo e gli utenti regolari
params = {
"group": {
"name": "<group_name_with_underscores>",
"full_name": "<group name>",
"title": "Member of <group name>", # opzionale: flair del forum per i membri del gruppo
"mentionable_level": 99, # opzionale: chi può menzionare @ questo gruppo?
"messageable_level": 99, # opzionale: chi può inviare messaggi all'intero gruppo?
"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)
Se lâoperazione ha successo, trova il campo âidâ nella risposta e ricordalo; è lâID del tuo gruppo.
- Mantieni sincronizzato il gruppo esterno e il gruppo forum
# nuovi membri semplici
r = Discourse.make_request("/groups/#{group_id}/members.json", {"usernames": "<new_members as comma-separated string>"}, "PUT", true)
# nuovi leader
r = Discourse.make_request("/admin/groups/#{group_id}/owners.json", {"group": { "usernames": "<new leader forum usernames as comma-separated string>"}}, "PUT", true)
# rimuovi i membri che hanno lasciato
r = Discourse.make_request("/groups/#{group_id}/members.json", {"usernames": "<leaving_members as comma-separated string>"}, "DELETE", true)
- Crea una sottocategoria (detta anche sottoforum) accessibile solo a questo gruppo. Ti consiglio di creare manualmente un sottoforum âWorkspacesâ o âRestrictedâ o simile, che fungerĂ da categoria genitore per tutti questi, posizionandolo in fondo alle tue categorie. Tieni presente che questo forum contenitore deve avere lâimpostazione âTutti possono vedereâ (altrimenti Discorse restituirĂ un errore) e probabilmente non dovrebbe permettere a nessuno di scrivere. Successivamente, puoi creare programmaticamente sottoforum per ogni nuovo gruppo.
params = {
"name": "<subforum name, e.g. same as group full name>",
"color": "<whatever>", # opzionale
"text_color": "<whatever>", # opzionale
"permissions": {
"<your group name with underscores>": "1",
"admins": "1", # se non lo imposti, potresti non riuscire a eliminare il tuo sottoforum se non tramite API
"moderators": "1"
},
"parent_category_id": "<see note above>",
"allow_badges": true, # opzionale
"suppress_from_latest": true, # opzionale
}
r = Discourse.make_request("/categories.json", params, "POST", true)
Se lâoperazione ha successo, ricorda lâID della categoria che ricevi in risposta.
- Potresti voler pre-riempire questo sottoforum. Io assegno al mio gruppo un post wiki fissato in alto per la condivisione delle conoscenze e la pianificazione.
# crea un post regolare in questo sottoforum
post_msg = "Benvenuti! Questo post è modificabile da tutti i membri del gruppo e può essere utilizzato come archivio di conoscenze nonchÊ per tracciare progetti comuni.\n\n**Di seguito trovi un modello che puoi decidere di utilizzare o meno.**\n\n**Link utili per i membri del gruppo:**\n\n- Link 1\n\n- Link 2\n\n- Link 3\n\n**Questi sono i progetti su cui stiamo attualmente lavorando:**\n\n- Progetto 1 - *avviato*. Coinvolti: Membro 1, 2 e 3\n\n- Progetto 2 - *fase di pianificazione*. Da discutere alla nostra prossima riunione di lunedÏ."
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"]
# trasformalo in wiki
begin
r = Discourse.make_request("/posts/#{post_id}/wiki", {"wiki": true}, "PUT", false)
rescue JSON::ParserError # l'API di Discourse restituirĂ una risposta JSON errata, ma fortunatamente non dobbiamo analizzarla
end
# fissalo in alto
r = Discourse.make_request("/t/topic/#{topic_id}/status", {
"status": "pinned",
"enabled": "true", # attenzione: deve essere una stringa, altrimenti rimuove il fissaggio del topic
"until": "3020-01-01 08:00+1:00" # per sempre
}, "PUT", false)
end
Buon divertimento!