Convertir une catégorie en privée et ajouter des utilisateurs à un groupe spécifique avec accès

Le titre est peut-être un peu cryptique, mais le contexte est de convertir une catégorie en « privée » tout en ayant un moyen d’identifier tous les utilisateurs qui y ont participé dans le passé \\u003cintervalle de temps\\u003e et de les ajouter à un groupe afin qu’il puisse être défini comme ayant accès.

Supposons que le groupe puisse être créé avant cela.

Ce qui est actuellement pris en charge :

  • Créer un groupe
  • Assigner des autorisations pour un groupe à une catégorie
  • Modifier les autorisations de la catégorie

Ce qui manque, c’est un moyen de dire « assigner ces utilisateurs à un groupe », en fonction de leur interaction dans cette catégorie sur une période spécifique.

Peut-être existe-t-il une requête ou un code que je peux exécuter pour identifier ces utilisateurs et les assigner à un groupe ?

J’ai utilisé une requête Data Explorer pour déterminer qui a participé à un sujet en fonction de user_actions :

-- [params]
-- int :topic = 3620561


select user_id,
       sum(action_type) actions,
       sum(case action_type when 5 then 1 else 0 end) replies
from user_actions ua
     join users u on u.id = ua.user_id
where target_topic_id = :topic
      and moderator is false
      and admin is false
group by ua.user_id

Cela inclut des actions telles que les réponses, les likes, les modifications et les mentions. J’ai également une requête qui inclut les réponses aux sondages. C’était pour collecter des prospects, mais je m’attends à ce que certaines des personnes qui ont fait autre chose que répondre aient un droit sur le sujet. Définir « participé » pourrait être un exercice utile.

Pour étendre à la catégorie entière, joignez avec topics t on target_topic_id = t.id et ajoutez category_id à la clause where. Il ne devrait pas être difficile de définir l’intervalle de temps en fonction de ua.created_at.

2 « J'aime »

Merci @jericson, c’est exactement ce que je cherchais.

Je suppose que je pourrais alimenter les résultats dans une requête qui ajoute ensuite tous les utilisateurs à un groupe.
Quelqu’un a-t-il eu de l’expérience dans ce domaine ? Peut-être vaut-il mieux copier-coller brutalement les identifiants des utilisateurs et exécuter une fonction Ruby s’il y en a une de disponible ?

C’est généralement ma solution préférée. Mais il est probablement plus judicieux de s’inspirer des exemples d’opérations en masse et d’appliquer la clause where sur l’objet User dans Rails. (Avoir un environnement de test pour ce genre de moment aide !)

Selon le nombre, vous pouvez coller une liste séparée par des virgules dans la zone Ajouter des utilisateurs au groupe, si cela peut vous être utile ?

(Il existe également une automatisation pour ajouter des utilisateurs à un groupe en fonction d’un badge, pour laquelle vous pourriez utiliser cette requête SQL comme base. Cela pourrait être un peu compliqué si vous êtes satisfait de l’option Rails cependant)

1 « J'aime »

J’ai juste apporté l’application de l’environnement de staging pour cette raison (et aussi pour tester ce qui casse avec ember 5 :stuck_out_tongue: )

Je vais me pencher dessus dans les prochains jours, si mon « vrai travail » me laisse le temps :smiley:

Juste pour que la requête soit complète au cas où d’autres en auraient besoin :

select ua.user_id, u.username, sum(action_type) actions, sum(case action_type when 5 then 1 else 0 end) replies from user_actions ua 
join users u on u.id = ua.user_id
join topics t on target_topic_id = t.id
where ua.created_at > 'YYYY-MM-DD'::date and t.category_id = CATEGORY_ID
group by ua.user_id, u.username;

Remplacez simplement YYY-MM-DD par votre date limite et CATEGORY_ID par votre ID de catégorie.
Le résultat affichera l’ID utilisateur, le nom d’utilisateur, les actions et les réponses.

Pouvez-vous m’indiquer ce script @JammyDodger ?

Je ne le vois pas dans le lien partagé par @jericson

Je peux extraire une liste d’utilisateurs (elle sera d’environ 250).

1 « J'aime »

Les options que j’ai suggérées sont disponibles dans l’interface utilisateur, bien que la seconde nécessite le plugin Discourse Automation (c’est un bon plugin cependant :slight_smile:)

1 « J'aime »

Je suis désolé, mais je ne comprends pas comment cela pourrait m’aider.

J’ai une liste d’identifiants d’utilisateur (ou même de noms d’utilisateur) et je dois les ajouter à un groupe.
Je ne vois dans les automatisations actuelles aucun cas d’utilisation qui pourrait m’aider. Il n’y a que l’ajout à un groupe basé sur des badges ou un champ personnalisé, mais cela ne signifie qu’ajouter une étape supplémentaire (ajouter un badge à tous ces utilisateurs ou ajouter un champ personnalisé aux utilisateurs, puis ajouter une valeur aux utilisateurs spécifiques que je veux).

N’y a-t-il pas une fonction bulk_add_user_to_group ou même une fonction add_user_to_group que je pourrais simplement appeler en boucle peut-être ?

Oui, ce serait un peu plus compliqué de faire comme ça. Mais si vous avez une liste assez courte, vous pouvez exporter les résultats de l’explorateur en CSV, ouvrir dans le Bloc-notes, et copier-coller dans la boîte Ajouter des utilisateurs :

Vous pourriez en faire 250 d’un coup, bien que je n’aie pas essayé avec autant. Une poignée de lots devrait suffire, sinon.


Il devrait également être possible via l’API en utilisant une requête PUT vers le point de terminaison par exemple /groups/49/members.json (vous aurez besoin de votre propre group_id) avec une liste de vos noms d’utilisateur/e-mails.

1 « J'aime »

Ça a parfaitement fonctionné, j’avais oublié qu’on pouvait ajouter plusieurs noms d’utilisateur à l’interface :slight_smile:

Pour les autres, pour exporter le résultat de la requête psql, exécutez simplement :

psql
\o /home/discourse/output.txt
<votre requête ici>
\o
exit

Maintenant, dans /home/discourse/output.txt, vous aurez le résultat de la requête tel qu’il serait affiché à l’écran.

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.