Modifica in blocco della configurazione tramite CLI in più profili utente/preferenze

Ciao a tutti,

Ho un forum multilingue, quindi ho abilitato allow user locale e set locale from accept language header e funziona benissimo. Ho registrato un utente di prova e ho notato che la lingua del browser dell’utente viene salvata nel profilo del nuovo utente (invece di (default)), il che è perfetto.

L’unico problema è che ho migrato 800 utenti da phpBB e tutti hanno (default) nel profilo utente. So che una grossa parte di loro vorrebbe usare una lingua diversa, ma non voglio cambiare l’inglese predefinito nella configurazione globale perché voglio che l’inglese rimanga la lingua predefinita.

Potreste dirmi se è possibile accedere a Discourse (./launcher enter app), scorrere l’elenco dei nomi utente o ID (qualsiasi cosa) e modificare la lingua nei profili utente specificati?

Stavo pensando di creare uno script bash semplice come questo:

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

Ma mi mancano le conoscenze su Discourse per eseguire un comando che modifichi le preferenze degli utenti… Potreste aiutarmi con questo?

Grazie.

Rudy

Sì, questo può essere fatto dalla console di Rails. Per accedere alla console di Rails, esegui ./launcher enter app, quindi inserisci rails c al prompt per avviare la console di Rails.

Farei attenzione a scorrere tutti gli utenti fino a quando non sei sicuro di cosa accadrà. Ecco come l’ho testato per un singolo utente sul mio sito:

Prima di tutto, ottieni un elenco delle localizzazioni utilizzate da Discourse:

I18n.available_locales

Questo stamperà un lungo elenco di simboli che Discourse utilizza per le localizzazioni. Ad esempio :be, :bg, :bs_BA, :ca...

Puoi utilizzare questi simboli per impostare la localizzazione. Ad esempio, per aggiornare la localizzazione di un utente in francese:

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

Se vuoi scorrere gli utenti, dovrai capire come ottenere array di utenti per ogni localizzazione in modo da poterli scorrere. Se hai elenchi di nomi utente per ogni localizzazione, questi potrebbero essere utilizzati per trovare gli utenti. Il modo semplice per farlo dalla console è convertire un elenco di nomi utente in un array. Ad esempio:

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

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

Se provi questo, procedi con cautela. Assicurati di creare un backup del database del tuo sito prima di apportare le modifiche.

Grazie mille @simon: quel codice mi è stato di grande aiuto.

Non ho assolutamente alcuna esperienza con Ruby, ma ho esperienza con altri linguaggi, quindi non mi è voluto molto tempo per scrivere il seguente codice:

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
        # salta questo utente
        puts "------: #{user.id}: #{user.trust_level}: \"#{user.username}\""
    end
end

Non so nulla di Ruby, quindi probabilmente esiste un modo più intelligente per farlo. Ma questo funziona per me :wink: . Grazie.