Erstellen eines User - Tag relation Plugins

Hallo, ich arbeite gerade an einem speziellen Plugin, konnte aber noch nicht herausfinden, wo ich anfangen soll (ich habe das Einführungsmaterial hier gelesen, einige einfache Plugins installiert und ein wenig mit deren Quellcode herumgespielt).

Das Setup: Ich habe eine CSV-Datei, die mehrere Benutzernamen aus dem System und einige Tags enthält, mit denen sie verknüpft sind. Ein Eintrag wie „user1, tag#1“ bedeutet zum Beispiel: „user1 kennt tag#1“. Viele Benutzer können mit einem Tag verknüpft sein und ein Benutzer kann mit vielen Tags verknüpft sein. Darüber hinaus wird diese CSV-Datei von Zeit zu Zeit aktualisiert (fast täglich). Die Datei befindet sich auf demselben Server, auf dem die Discourse-Instanz gehostet wird.

Wie das Plugin idealerweise funktionieren würde: Ich werde dies anhand eines Beispiel-CSV und eines Bildes erklären.

CSV:

userOP, tag#1
userOP, tag#2
user2, tag#1

Bei diesem CSV würde, wann immer ein Thema mit einem der in der CSV enthaltenen Tags erstellt wird (der Autor des Themas ist möglicherweise nicht auf der Liste), die ideale Ausgabe wie folgt aussehen:

Darüber hinaus kann ein Benutzer seine bekannten Tags als klickbare Links in seinem Benutzerbereich mit einem zusätzlichen Tab namens „Bekannte Tags“ sehen:

Idealerweise sollte dieser Tab über das Menü oben links schnell zugänglich sein:

Das heißt, basierend auf der in der CSV definierten Beziehung sollte es einen kleinen Text oder ein Abzeichen für jeden Benutzer (OP oder andere) geben, der unter dem Thema mit einem Tag postet, mit dem er verwandt ist.

Ich bin offen für Vorschläge, wie dies erreicht werden kann.

Auf der Rails-Seite müssen Sie die Benutzer-/Tag-Beziehungen zum Serializer hinzufügen, damit diese Daten für das Frontend verfügbar sind. Suchen Sie nach anderen Plugins, die add_to_serializer aufrufen, oder suchen Sie danach in der Discourse-Quelle, da es dort gut dokumentiert ist.

Dann können Sie einen Plugin-Outlet in Ember verwenden, um dies zur Seite hinzuzufügen. Die Dokumentation der Themenkomponente enthält Beispiele dafür.

Ich würde wahrscheinlich eine Route hinzufügen, um die benutzerdefinierten Benutzerfelder zu verwalten, anstatt eine CSV-Datei zu verwenden, aber wenn Sie den CSV-Weg gehen möchten, könnten Sie einen Job verwenden, der sie stündlich liest oder so etwas, also finden Sie ein Plugin, das etwas in jobs/scheduled hat.

Es gibt ein Discourse-Repository namens all_the_plugins, das ich manchmal durchsuche, um Beispiele für Dinge zu finden. Wenn Sie sich durch github.com/discourse wühlen, sollten Sie es finden können.

Vielen Dank für die Informationen. Das Mental Model, das ich jetzt habe, ist, dass ich ein benutzerdefiniertes Feld zu Tags hinzufügen sollte (wie tag_description) namens attached_users. Für das obige Beispiel sollte tag#1 attached_users: [“userOP”, “user1”] haben.

Dann sollte ich dies irgendwie zum Serializer hinzufügen und herausfinden, wie ich es im Beitrag anzeigen kann.

Während ich darüber nachdachte, hatte ich eine weitere Idee. Wenn ich Discourse Assign (Discourse Assign) verwende, um diese Benutzer basierend auf Tags Themen zuzuweisen. Ich kann diese Informationen bereits aus dem Thema abrufen und ich schätze, die Anzeige wäre einfacher. Discourse Assign bietet jedoch keine Möglichkeit, Benutzer programmatisch hinzuzufügen.

Die Verwendung von assign scheint eine gute Idee zu sein. Ich bin ziemlich sicher, dass Sie Benutzer über die API hinzufügen könnten. Siehe How to reverse engineer the Discourse API

Ich frage mich, ob das den Server zu sehr belasten würde. Denn es wird viele Zuweisungen geben und in der vorherigen Idee ist es im Wesentlichen nur eine Zuweisung zu Tags und muss nicht jedem Thema separat zugewiesen werden.

Die Verwendung eines vorhandenen, gewarteten Plugins ist wesentlich einfacher, als ein eigenes zu entwickeln und zu warten.

Sie können dies mit einem einfachen Plugin tun.

Was Sie tun müssen

Das Plugin muss Folgendes tun:

  1. Fügen Sie ein benutzerdefiniertes Feld für Benutzer namens known_tags hinzu, eine Liste von Zeichenfolgen.

  2. Fügen Sie eine Benutzeroberfläche im Benutzerprofil hinzu, in der der Benutzer known_tags bearbeiten kann. Ich glaube nicht, dass es notwendig ist, dafür einen völlig neuen Profil-Tab hinzuzufügen, aber Sie könnten es tun, wenn Sie möchten. Wenn Sie nicht möchten, dass Benutzer es selbst bearbeiten, machen Sie es nur für Administratoren bearbeitbar und gehen Sie einfach in die Benutzerprofile und aktualisieren Sie es anhand Ihrer CSV-Datei.

  3. Fügen Sie einen Event-Hook hinzu, der die Ereignisse before_create_post oder post_created im PostCreator verwendet, um den gewünschten Inhalt basierend auf den Tags im Thema zum Beitrag hinzuzufügen.

Wie es geht

Teile 1 und 2 sind den Beispiel-Plugins für andere Modelle im unten verlinkten Thema sehr ähnlich. Versuchen Sie, es analog herauszufinden. Wenn Sie wirklich nicht weiterkommen, fragen Sie mich nach einem Hinweis.

Teil 3 kommt ebenfalls in Ihre plugin.rb-Datei. Es wird ungefähr so aussehen

on(:post_created) |post, opts, user|
  if post.is_first_post? && post.topic.tags.present?
     user_ids = UserCustomField.where(name: 'known_tags', value: post.topic.tags).pluck(:user_id)
     usernames = User.where(id: user_ids).pluck(:username)
     new_raw = post.raw + "etwas etwas #{usernames}"
     PostRevisor.new(post).revise!(
      user,
      {
        raw: new_raw,
        edit_reason: "ein Grund"
      },
      skip_validations: true,
      bypass_bump: true
    )
  end
end

Versuchen Sie es selbst. Wenn Sie wirklich nicht weiterkommen, werde ich helfen. Ich bin immer eher bereit zu helfen, wenn es starke Beweise dafür gibt, dass Sie versuchen, es selbst herauszufinden :slight_smile:

2 „Gefällt mir“

Vielen Dank für die Bereitstellung einer sehr guten Roadmap, ich bin dabei! Kleine Frage:

Muss dieser Teil mit diesem Ansatz manuell erfolgen (manuell bedeutet, Einträge nacheinander über eine Schnittstelle hinzuzufügen)? Idealerweise möchte ich dies mit meinem Admin-API-Schlüssel hinzufügen, da die CSV-Datei etwas umfangreich ist und mit der Zeit wachsen wird.

Nein, das muss nicht manuell erfolgen. Es gibt einige verschiedene Möglichkeiten, die benutzerdefinierten Felder des Benutzers anhand der CSV-Datei auszufüllen. Es hängt wirklich davon ab, wie Sie die Aktualisierungen handhaben möchten. Ich würde vorschlagen, die anderen Teile zuerst zu erledigen und dies einfach mit einem kleinen Datensatz zu testen. Wenn Sie dann zufrieden sind, wie es funktioniert, fügen Sie einen automatischen Import für die CSV-Datei hinzu. Diesen Teil effizient zu gestalten, ist ein sekundärer Schritt.

1 „Gefällt mir“