Nous avons quelques centaines d’utilisateurs sur notre forum dont les noms (pas les noms d’utilisateur, les noms) ont été accidentellement définis sur leur adresse e-mail en raison de la configuration du fournisseur SSO externe (via WordPress) lors de la création de leurs comptes.
Existe-t-il un moyen relativement simple de modifier en masse ces noms de the_name@example.com à the_name (c’est-à-dire tronquer tout ce qui suit ‘@’) sans avoir à accéder manuellement à chaque profil pour les modifier un par un ?
Vous pouvez le faire depuis la console Rails. C’est plus compliqué que ce qui peut être expliqué ici, surtout puisque les adresses e-mail ne sont plus dans l’enregistrement de l’utilisateur. Si vous avez un budget, vous pouvez poster dans Marketplace ou me contacter directement.
Ou alors, si vous ne vous souciez pas de l’adresse e-mail réelle…
Quelque chose comme
users = User.where('username LIKE', '%@%')
Ensuite, vous bouclez et utilisez gsub pour supprimer tout ce qui suit le @. C’est le mieux que je puisse faire sur mon téléphone.
Je vous remercie pour votre réponse, @pfaffman. Je peux écrire le SQL, mais travailler dans une console Rails est un peu en dehors de mon domaine de compétence. Comment puis-je accéder à la console Python de Discourse ?
Ce serait bien – bien que je comprenne que cela puisse être potentiellement dangereux – d’avoir un outil comme l’Explorateur de données qui permettrait également d’écrire une requête UPDATE.
Quelqu’un sait-il s’il existe un moyen de connecter un outil SQL tiers (comme Sequel Pro ou équivalent) à la base de données en cours d’exécution dans Discourse auto-hébergé via Docker ?
Oui, mais le faire dans Rails rend beaucoup plus difficile de corrompre votre base de données. Par exemple, si vous le faites avec Rails, vous saurez que vous n’avez pas créé d’identifiants illégaux (et si une autre table doit être mise à jour lorsque vous modifiez celle sur laquelle vous travaillez, Rails le fera, pas le SQL).
cd /var/discourse
./launcher enter app
rails c
Maintenant, vous êtes dans Rails.
users=User.where("username like '%@%'")
users.each do |user|
user.name.gsub!(/@(.*)/,"")
puts "Nouveau nom : #{user.name}"
# user.save
end
Je pense que cela fera ce que vous voulez. Si cela semble correct, vous pouvez décommenter user.save et essayer votre chance.
Faites d’abord une sauvegarde, d’accord ? (Ou mieux, sur un serveur de staging.)
Je n’ai pas de serveur de staging pour cette instance Discourse, mais je peux faire une sauvegarde puis exécuter le code très tôt demain matin, quand il y aura probablement peu (voire aucun) trafic, afin de pouvoir restaurer immédiatement en cas de problème.
La truncature au niveau du @ laisse toujours les informations personnelles (adresse e-mail) largement visibles pour le Grand Méchant Internet (étant donné que la plupart des gens utilisent @gmail.com ou quelques autres grands fournisseurs). Vous feriez probablement mieux de les définir avec la même valeur que le nom d’utilisateur.
Merci @lionel-rowe, c’est un bon point. Les noms d’utilisateurs sont déjà cette même valeur (le nom d’utilisateur a été créé en prenant tout ce qui précède le ‘@’ dans l’adresse e-mail de l’utilisateur).