Conversion en masse de sujets d'une Catégorie vers des MP de Groupe

Je prévois de convertir un tas de sujets en MP de groupe afin de déprécier certaines catégories peu utilisées. Nous ne pouvons pas le faire via l’interface utilisateur (un par un seulement), ni trouver un moyen groupé de le faire.

D’après ce que je peux dire, cela devrait fonctionner via la console :

  1. Identifier les sujets par leur catégorie
  2. Changer topic.archetype en private_message
  3. Changer topic.subtype en ‘user_to_user’
  4. Mettre topic.category à Null
  5. Dans topic_groups (ou peut-être topic_allowed_groups), ajouter une ligne avec le group_id et le topic_id pertinents

Cette approche a-t-elle du sens ? Je dois d’abord déterminer la différence entre ces tables topic/groups. Et le faire dans un bac à sable pour commencer !!

1 « J'aime »

Cela pourrait fonctionner. De plus, si vous ne saviez pas, vous pouvez faire quelque chose comme

 topics = Topic.where(category: 10)

  topics.update_all(archetype: xxx, topic_category: nil)

Ou quelque chose comme ça. Si vous connaissiez update_all, ce n’est pas une nouveauté.

2 « J'aime »

Merci Jay ! Ce serait bien et rapide pour la première moitié. Cependant, je dois aussi m’assurer qu’ils finissent par devenir des chefs de groupe.

Avez-vous une idée de ce que je dois faire avec les tables topic_groups / topic_allowed_groups ? Je ne pense pas pouvoir m’en sortir avec un update_all pour celles-ci.

1 « J'aime »

J’ai depuis lors (il a fallu du temps, c’est clair !) trouvé deux façons d’y parvenir. Vous pouvez le faire via l’interface utilisateur (UI), ce qui fonctionne bien pour les petites catégories (et les petits groupes). Il faut faire attention à ne pas déclencher de notifications inutiles pendant l’opération, mais c’est tout à fait faisable.

Alternativement, vous pouvez utiliser la console Rails (en supposant que vous êtes auto-hébergé), ce qui est plus rapide et beaucoup plus puissant.

Depuis l’interface utilisateur (UI)

  1. Supprimez les autres membres du groupe du Groupe (mais conservez une liste des noms d’utilisateur/e-mails afin de pouvoir les rajouter facilement). Cela évitera qu’ils soient notifiés.
  2. Parcourez chaque sujet dans la Catégorie, en convertissant chacun d’eux en MP (Message Privé) à l’aide du menu de la clé à molette d’administration
    • Je trouve cela plus facile à faire en ouvrant chaque sujet dans son propre onglet, puis en les parcourant un par un
  3. Ajoutez le Groupe à chacun des Sujets (maintenant des MP)
  4. Réajoutez les membres du Groupe au groupe
  5. Nettoyez/supprimez tous les « petits messages » dans chaque Message de Groupe comme souhaité

Dans la console Rails

Accédez à la console en entrant dans le conteneur, puis en appelant la console :

./launcher enter app
  rails c

Définissez la Catégorie et le Groupe, puis copiez le script ci-dessous dans la console :

category_id = =CategoryID= 
group_name = '=GroupName='

group = Group.find_by('lower(name) = ?', group_name.downcase)
about_id = Category.find(category_id).topic_id

topic_ids = Topic.where(category_id: category_id).where.not(id: about_id).pluck(:id)

Topic.where(id: topic_ids).find_each do |topic|
  topic.archetype = Archetype.private_message
  topic.category_id = nil
  topic.subtype = 'user_to_user'
  topic.save!

  TopicAllowedGroup.find_or_create_by!(topic_id: topic.id, group_id: group.id)

  Post.where(topic_id: topic.id).pluck(:user_id).uniq.each do |uid|
    TopicAllowedUser.find_or_create_by!(topic_id: topic.id, user_id: uid)
  end
end

Ceci ne notifie pas les utilisateurs du tout, et préserve joliment les utilisateurs participant aux messages (au cas où ils ne seraient pas dans le Groupe)

1 « J'aime »