Si tienes un sitio comunitario que también (pero no exclusivamente) utiliza Discourse, es posible que desees proporcionar un subforo restringido para cada uno de tus grupos, por ejemplo, como un espacio de trabajo. Así es como hacerlo, en Ruby:
-
Asegúrate de que tus llamadas a la API se autenticen como un usuario con privilegios de administrador.
-
Crea un grupo de foro que incluya a los líderes de tu grupo y a los usuarios regulares
params = {
"group": {
"name": "<nombre_del_grupo_con_guiones_bajos>",
"full_name": "<nombre del grupo>",
"title": "Miembro de <nombre del grupo>", # opcional: insignia de foro para miembros del grupo
"mentionable_level": 99, # opcional: ¿quién puede mencionar (@) a este grupo?
"messageable_level": 99, # opcional: ¿quién puede enviar mensajes a todo el grupo?
"owner_usernames": "<nombres de usuario de los líderes del grupo separados por comas>",
"usernames": "<nombres de usuario de los demás miembros del grupo separados por comas>"
}
}
r = Discourse.make_request("/admin/groups.json", params, "POST", true)
Si tiene éxito, busca el campo ‘id’ en la respuesta y anótalo; ese es el ID de tu grupo.
- Mantén sincronizado el grupo externo y el grupo del foro
# nuevos miembros simples
r = Discourse.make_request("/groups/#{group_id}/members.json", {"usernames": "<nuevos_miembros como cadena separada por comas>"}, "PUT", true)
# nuevos líderes
r = Discourse.make_request("/admin/groups/#{group_id}/owners.json", {"group": { "usernames": "<nuevos nombres de usuario de líderes separados por comas>" }}, "PUT", true)
# eliminar miembros que se fueron
r = Discourse.make_request("/groups/#{group_id}/members.json", {"usernames": "<miembros_que_se_fueron como cadena separada por comas>"}, "DELETE", true)
- Crea una subcategoría (también conocida como subforo) que solo sea accesible para este grupo. Recomiendo crear manualmente un subforo “Espacios de trabajo” o “Restringido” o lo que sea, que será la categoría principal para todos estos, y colocarlo al final de tus categorías. Ten en cuenta que este foro contenedor debe tener “Todos pueden ver” (de lo contrario, Discourse dará un error) y probablemente no debería permitir que nadie escriba. Luego, puedes crear programáticamente subforos para cada nuevo grupo.
params = {
"name": "<nombre del subforo, por ejemplo, igual al nombre completo del grupo>",
"color": "<lo que sea>", # opcional
"text_color": "<lo que sea>", # opcional
"permissions": {
"<nombre del grupo con guiones bajos>": "1",
"admins": "1", # si no tienes esto, es posible que no puedas eliminar tu subforo excepto a través de la API
"moderators": "1"
},
"parent_category_id": "<ver nota anterior>",
"allow_badges": true, # opcional
"suppress_from_latest": true, # opcional
}
r = Discourse.make_request("/categories.json", params, "POST", true)
Si tiene éxito, anota el ID de categoría que recibes como respuesta.
- Es posible que desees prellenar este subforo. Le daré a mi grupo un post wiki fijado para compartir conocimientos y planificación.
# crea un post regular en este subforo
post_msg = "¡Bienvenido! Este post es editable por todos los miembros del grupo y puede usarse como un repositorio de conocimientos, así como para rastrear proyectos comunes.\n\n**Lo siguiente es una plantilla que puedes decidir usar o no.**\n\n**Enlaces útiles para los miembros del grupo:**\n\n- Enlace 1\n\n- Enlace 2\n\n- Enlace 3\n\n**Estos son los proyectos en los que estamos trabajando actualmente:**\n\n- Proyecto 1 - *iniciado*. Participantes: Miembro 1, 2 y 3\n\n- Proyecto 2 - *fase de planificación*. Para discutir en nuestra próxima reunión el lunes."
params = { "raw": post_msg, title: "Wiki de Conocimientos para #{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"]
# conviértelo en wiki
begin
r = Discourse.make_request("/posts/#{post_id}/wiki", {"wiki": true}, "PUT", false)
rescue JSON::ParserError # La API de Discourse dará una respuesta JSON incorrecta, pero afortunadamente no tenemos que analizarla
end
# fíjalo
r = Discourse.make_request("/t/topic/#{topic_id}/status", {
"status": "pinned",
"enabled": "true", # cuidado: debe ser una cadena, de lo contrario se desancla el tema
"until": "3020-01-01 08:00+1:00" # para siempre
}, "PUT", false)
end
¡Diviértete!