Alteração em massa de configuração via CLI em múltiplos perfis/preferências de usuário

Olá a todos,

Tenho um fórum multilíngue, então ativei as opções allow user locale e set locale from accept language header, e funcionou perfeitamente. Criei um usuário de teste e notei que o idioma do navegador do usuário foi salvo no perfil do novo usuário (em vez de (default)), o que é excelente.

O único problema é que migrei 800 usuários do phpBB e todos eles têm (default) no perfil. Sei que uma grande parte deles gostaria de usar um idioma diferente, mas não quero alterar o inglês padrão na configuração global, pois desejo que o inglês permaneça como idioma padrão.

Você poderia me dizer se é possível entrar no Discourse (./launcher enter app) e percorrer uma lista de nomes de usuários / IDs (qualquer coisa) para alterar o idioma nos perfis dos usuários especificados?

Pensei em criar um script bash simples assim:

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

Mas estou com falta de conhecimento sobre o Discourse para executar um comando que edite as preferências do usuário… Poderia me ajudar com isso?

Obrigado.

Rudy

Sim, isso pode ser feito no console do Rails. Para acessar o console do Rails, execute ./launcher enter app e, em seguida, digite rails c no prompt para iniciar o console.

Tenha cuidado ao percorrer todos os usuários até ter certeza do que vai acontecer. Aqui está como testei para um usuário individual no meu site:

Primeiro, obtenha uma lista dos locais usados pelo Discourse:

I18n.available_locales

Isso imprimirá uma longa lista de símbolos que o Discourse usa para locais. Por exemplo: :be, :bg, :bs_BA, :ca...

Você pode usar esses símbolos para definir o local. Por exemplo, para atualizar o local de um usuário para francês:

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

Se você quiser percorrer os usuários, precisará descobrir como obter arrays de usuários para cada local para que possa iterar sobre eles. Se você tiver listas de nomes de usuários para cada local, isso pode ser usado para encontrar os usuários. A maneira simples de fazer isso no console é converter uma lista de nomes de usuários em um array. Por exemplo:

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

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

Se você tentar isso, proceda com cuidado. Certifique-se de criar um backup do banco de dados do seu site antes de fazer as alterações.

Muito obrigado @simon - esse código me ajudou muito.

Não tenho absolutamente NENHUMA experiência com Ruby, mas tenho experiência com outras linguagens, então não me levou muito tempo para criar o seguinte 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
        # pular este usuário
        puts "------: #{user.id}: #{user.trust_level}: \"#{user.username}\""
    end
end

Não sei nada sobre Ruby, então provavelmente existe uma maneira mais inteligente de fazer isso. Mas isso funciona para mim :wink: . Obrigado.