Cambio masivo de configuración vía CLI en múltiples perfiles/preferencias de usuario

Hola a todos,

Tengo un foro multilingüe, así que activé las opciones allow user locale y set locale from accept language header, y funciona de maravilla. Registré un usuario de prueba y noté que el idioma del navegador del usuario se guarda en el perfil del nuevo usuario (en lugar de (default)), lo cual es perfecto.

El único problema que tengo es que migré a 800 usuarios desde phpBB y todos tienen (default) en su perfil. Sé que una gran parte de ellos preferiría usar otro idioma, pero no quiero cambiar el inglés por defecto en la configuración global, ya que deseo que el inglés siga siendo el idioma predeterminado.

¿Podrías indicarme si es posible entrar a Discourse (./launcher enter app) y recorrer una lista de nombres de usuario o IDs (lo que sea) para cambiar el idioma en los perfiles de usuario especificados?

Estaba pensando en crear un script simple de bash como este:

while IFS= read -r username; do
  rails r "u = User.... $username"
done < list_of_usernames.txt

Pero me falta conocimiento de Discourse para ejecutar un comando que edite las preferencias de los usuarios… ¿Podrías ayudarme con esto?

Gracias.

Rudy

Sí, esto se puede hacer desde la consola de Rails. Para acceder a la consola de Rails, ejecuta ./launcher enter app y luego escribe rails c en el símbolo del sistema para iniciar la consola de Rails.

Sería prudente tener cuidado al recorrer todos los usuarios hasta que estés seguro de lo que va a suceder. Así es como lo probé para un usuario individual en mi sitio:

Primero, obtén una lista de los idiomas que utiliza Discourse:

I18n.available_locales

Esto imprimirá una larga lista de símbolos que Discourse utiliza para los idiomas. Por ejemplo: :be, :bg, :bs_BA, :ca...

Puedes usar estos símbolos para establecer el idioma. Por ejemplo, para actualizar el idioma de un usuario a francés:

u = User.find(1)
u.update(locale: :fr)

Si deseas recorrer los usuarios, tendrás que averiguar cómo obtener arrays de usuarios para cada idioma para poder iterar sobre ellos. Si tienes listas de nombres de usuario para cada idioma, eso podría usarse para encontrar a los usuarios. La forma sencilla de hacerlo desde la consola es convertir una lista de nombres de usuario en un array. Por ejemplo:

fr_users = ['bob', 'sally', 'john']

fr_users.each do |username|
    u = User.find_by(username: username)
    u.update(locale: :fr)
end

Si pruebas esto, procede con precaución. Asegúrate de crear una copia de seguridad de la base de datos de tu sitio antes de realizar los cambios.

Muchas gracias @simon, ese código me ayudó mucho.

No tengo absolutamente NINGUNA experiencia con Ruby, pero sí con otros lenguajes, así que no me llevó demasiado tiempo crear el siguiente código:

all_users = User.find_each()

all_users.each do |user|
    if user.id > 70 and user.active == true and user.admin == false and user.trust_level == 1 and user.suspended_at == nil and user.moderator == false
        puts "MODIFY: #{user.id}: #{user.trust_level}: \"#{user.username}\""
        user.update(locale: :fr)
    else
        # omitir este usuario
        puts "------: #{user.id}: #{user.trust_level}: \"#{user.username}\""
    end
end

No sé nada de Ruby, así que probablemente exista una forma más inteligente de hacerlo. Pero esto funciona para mí :wink: . Gracias.