Verwenden Sie die API, um eingeschränkte Kategorien für externe Gruppen zu erstellen

Wenn Sie eine Community-Website haben, die auch (aber nicht ausschließlich) Discourse nutzt, möchten Sie möglicherweise für jede Ihrer Gruppen ein eingeschränktes Unterforum bereitstellen, beispielsweise als Arbeitsbereich. So geht’s in Ruby:

  1. Stellen Sie sicher, dass Ihre API-Aufrufe als Benutzer mit Administratorrechten authentifiziert werden.

  2. Erstellen Sie eine Forumgruppe, die die Führungskräfte und regulären Benutzer Ihrer Gruppe enthält.

params = { 
  "group": { 
    "name": "<group_name_with_underscores>", 
    "full_name": "<group name>", 
    "title": "Mitglied von <group name>", # optional: Forum-Flair für Gruppenmitglieder
    "mentionable_level": 99, # optional: Wer kann diese Gruppe @ erwähnen?
    "messageable_level": 99, # optional: Wer kann die gesamte Gruppe kontaktieren?
    "owner_usernames": "<durch Komma getrennte Forum-Benutzernamen Ihrer Gruppenführer>",
    "usernames": "<durch Komma getrennte Forum-Benutzernamen der anderen Gruppenmitglieder>"
   }
}
r = Discourse.make_request("/admin/groups.json", params, "POST", true)

Bei Erfolg finden Sie das Feld „id" in der Antwort und merken es sich; das ist die ID Ihrer Gruppe.

  1. Halten Sie die externe Gruppe und die Forumgruppe synchron.
# neue einfache Mitglieder
r = Discourse.make_request("/groups/#{group_id}/members.json", {"usernames": "<neue Mitglieder als durch Komma getrennte Zeichenkette>"}, "PUT", true)
# neue Führungskräfte
r = Discourse.make_request("/admin/groups/#{group_id}/owners.json", {"group": { "usernames": "<neue Führungskräfte-Forum-Benutzernamen als durch Komma getrennte Zeichenkette>"}}, "PUT", true)
# entferne Mitglieder, die die Gruppe verlassen haben
r = Discourse.make_request("/groups/#{group_id}/members.json", {"usernames": "<verlassende Mitglieder als durch Komma getrennte Zeichenkette>"}, "DELETE", true)
  1. Erstellen Sie eine Unterkategorie (auch Unterforum genannt), die nur für diese Gruppe zugänglich ist. Ich empfehle, manuell ein Unterforum „Workspaces" oder „Eingeschränkt" oder ähnlich zu erstellen, das als übergeordnete Kategorie für alle diese dient, und es am Ende Ihrer Kategorien zu platzieren. Beachten Sie, dass dieses Container-Forum „Jeder kann sehen" muss haben (sonst gibt Discourse einen Fehler aus) und wahrscheinlich niemandem das Schreiben erlauben sollte. Anschließend können Sie programmgesteuert Unterforen für jede neue Gruppe erstellen.
params = { 
  "name": "<Unterforum-Name, z. B. gleich dem vollständigen Gruppennamen>", 
  "color": "<beliebig>", # optional
  "text_color": "<beliebig>", # optional
  "permissions": { 
    "<Ihr Gruppenname mit Unterstrichen>": "1", 
    "admins": "1", # ohne diese Einstellung könnten Sie Ihr Unterforum nur über die API löschen
    "moderators": "1" 
   }, 
  "parent_category_id": "<siehe Hinweis oben>", 
  "allow_badges": true,  # optional
  "suppress_from_latest": true, # optional
}
r = Discourse.make_request("/categories.json", params, "POST", true)

Bei Erfolg merken Sie sich die zurückgegebene Kategorien-ID.

  1. Möglicherweise möchten Sie dieses Unterforum vorab füllen. Ich werde meiner Gruppe einen angepinnten Wiki-Beitrag für Wissensaustausch und Planung geben.
# Erstellen Sie einen regulären Beitrag in diesem Unterforum
post_msg = "Willkommen! Dieser Beitrag kann von allen Mitgliedern der Gruppe bearbeitet werden und kann als Wissensspeicher sowie zur Verfolgung gemeinsamer Projekte genutzt werden.\n\n**Im Folgenden finden Sie eine Vorlage, die Sie nach Belieben verwenden oder ignorieren können.**\n\n**Nützliche Links für Gruppenmitglieder:**\n\n- Link 1\n\n- Link 2\n\n- Link 3\n\n**Dies sind die Projekte, an denen wir derzeit arbeiten:**\n\n- Projekt 1 - *gestartet*. Beteiligt: Mitglied 1, 2 und 3\n\n- Projekt 2 - *Planungsphase*. Wird auf unserem nächsten Treffen am Montag diskutiert."
params = { "raw": post_msg, title: "Wissens-Wiki für #{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"]
  # Machen Sie daraus ein Wiki
  begin
    r = Discourse.make_request("/posts/#{post_id}/wiki", {"wiki": true}, "PUT", false)
    rescue JSON::ParserError  # Die Discourse-API gibt eine fehlerhafte JSON-Antwort zurück, aber wir müssen diese glücklicherweise nicht parsen
  end
  # Pinne dies
  r = Discourse.make_request("/t/topic/#{topic_id}/status", { 
    "status": "pinned", 
    "enabled": "true", # Vorsicht: muss ein String sein, sonst wird das Thema entsperrt
    "until": "3020-01-01 08:00+1:00" # für immer
  }, "PUT", false)
end

Viel Spaß!

5 „Gefällt mir“