Création d'un plugin de relation Utilisateur - Tag

Bonjour, je travaille actuellement sur un plugin spécifique mais je n’ai pas encore trouvé par où commencer (j’ai lu le matériel d’introduction ici et j’ai installé quelques plugins simples et joué un peu avec leur code source).

La configuration : J’ai un fichier CSV qui contient plusieurs noms d’utilisateur du système et quelques tags auxquels ils sont associés. Par exemple, une entrée “user1, tag#1” signifie : “user1 connaît le tag#1”. De nombreux utilisateurs peuvent être associés à un tag et un utilisateur peut être associé à de nombreux tags. De plus, ce CSV sera mis à jour de temps en temps (presque tous les jours). Le fichier se trouve sur le même serveur qui héberge l’instance Discourse.

Comment le plugin fonctionnerait idéalement : Je vais l’expliquer à l’aide d’un exemple de CSV et d’une image.

CSV :

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

Étant donné ce CSV, chaque fois qu’un sujet est créé avec l’un des tags inclus dans le CSV (l’auteur du sujet peut ne pas être sur la liste). Le résultat idéal devrait être le suivant :

De plus, un utilisateur peut voir ses tags connus sous forme de liens cliquables dans son panneau utilisateur avec un onglet supplémentaire appelé “Known Tags” :

Idéalement, cet onglet devrait être rapidement accessible depuis le menu en haut à gauche :

C’est-à-dire, en fonction de la relation définie dans le CSV, il devrait y avoir un petit texte ou un badge pour tout utilisateur (OP ou autre) qui publie dans un sujet avec un tag auquel il est associé.

Je suis ouvert aux suggestions sur la façon d’y parvenir.

Du côté de Rails, vous devrez ajouter ces relations utilisateur/balise au sérialiseur afin que ces données soient disponibles pour le front-end. Recherchez d’autres plugins qui appellent add_to_serializer ou recherchez-le dans le code source de Discourse, car il y est bien documenté.

Vous pourrez ensuite utiliser un point de sortie de plugin dans Ember pour l’ajouter à la page. La documentation des composants de thème contient des exemples à ce sujet.

Je suggérerais d’ajouter une route pour gérer les champs utilisateur personnalisés plutôt que d’utiliser un fichier CSV, mais si vous souhaitez utiliser la méthode CSV, vous pourriez avoir besoin d’un job qui le lit toutes les heures, par exemple. Recherchez donc un plugin qui contient quelque chose dans jobs/scheduled.

Il existe un dépôt Discourse appelé all_the_plugins que j’utilise parfois pour rechercher des exemples. Si vous parcourez github.com/discourse, vous devriez pouvoir le trouver.

Merci pour ces informations. Le modèle mental que j’ai actuellement est que je devrais ajouter un champ personnalisé aux balises (comme tag_description) appelé attached_users. Pour l’exemple ci-dessus, la balise n°1 devrait avoir attached_users: ["userOP", "user1"].

Ensuite, je devrais ajouter cela d’une manière ou d’une autre au sérialiseur et trouver comment l’afficher dans la publication.

En réfléchissant à cela, j’ai eu une autre idée. Si j’utilise discourse assign (Discourse Assign) pour attribuer ces utilisateurs aux sujets en fonction des balises. Je peux déjà récupérer ces informations du sujet et je suppose que leur affichage serait plus facile. Cependant, discourse assign ne fournit aucun moyen d’ajouter des utilisateurs par programmation.

Utiliser assign semble être une bonne idée. Je suis à peu près sûr que vous pourriez ajouter des utilisateurs avec l’API. Voir Comment faire de l’ingénierie inverse de l’API Discourse

Je me demande si cela ne pèserait pas trop sur le serveur. Car il y aura de nombreuses affectations et dans l’idée précédente, il s’agit essentiellement d’une affectation à des balises et non d’une affectation à chaque sujet séparément.

L’utilisation d’un plugin existant et maintenu sera beaucoup plus facile que le développement et la maintenance du vôtre.

Vous pouvez le faire avec un simple plugin.

Ce que vous devez faire

Le plugin devra faire ce qui suit :

  1. Ajouter un champ personnalisé utilisateur appelé known_tags, une liste de chaînes de caractères.

  2. Ajouter une interface dans le profil utilisateur où l’utilisateur peut modifier known_tags. Je ne pense pas qu’il soit nécessaire d’ajouter un onglet de profil entièrement nouveau pour cela, mais vous pourriez le faire si vous le souhaitez. Si vous ne voulez pas que les utilisateurs le modifient eux-mêmes, faites en sorte qu’il ne soit modifiable que par les administrateurs et allez simplement dans les profils des utilisateurs et mettez-le à jour en fonction de votre fichier CSV.

  3. Ajouter un hook d’événement qui utilise les événements before_create_post ou post_created dans PostCreator pour ajouter le contenu que vous souhaitez au message en fonction des tags du sujet.

Comment faire

Les parties 1 et 2 sont très similaires aux plugins d’exemple pour d’autres modèles dans le sujet lié ci-dessous. Essayez de le comprendre par analogie. Si vous êtes vraiment bloqué, demandez-moi un indice.

La partie 3 ira également dans votre fichier plugin.rb. Elle ressemblera à ceci :

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 + "quelque chose quelque chose #{usernames}"
     PostRevisor.new(post).revise!(
      user,
      {
        raw: new_raw,
        edit_reason: "une raison"
      },
      skip_validations: true,
      bypass_bump: true
    )
  end
end

Essayez par vous-même. Si vous êtes vraiment bloqué, je vous aiderai. Je suis toujours plus enclin à aider s’il y a des preuves solides que vous essayez de le comprendre par vous-même :slight_smile:

2 « J'aime »

Merci beaucoup pour cette très bonne feuille de route, je suis dessus ! Petite question :

Cette partie doit-elle être manuelle avec cette approche (par manuel, j’entends ajouter des entrées une par une via une interface) ? Idéalement, j’aimerais ajouter cela en utilisant ma clé d’API d’administrateur car le fichier csv est un peu chargé et grossira avec le temps.

Non, cela n’a pas besoin d’être manuel. Il existe plusieurs façons de remplir les champs personnalisés de l’utilisateur à partir du CSV. Cela dépend vraiment de la manière dont vous souhaitez gérer les mises à jour. Je suggère de faire les autres parties en premier et de tester cela avec un petit ensemble de données. Ensuite, si vous êtes satisfait de son fonctionnement, ajoutez une importation automatique pour le CSV. Rendre cette partie efficace est une étape secondaire.

1 « J'aime »