Массовое изменение конфигурации через CLI в нескольких профилях пользователей/предпочтениях

Всем привет,

У меня многоязычный форум, поэтому я включил опции «Разрешить выбор языка пользователем» и «Устанавливать язык из заголовка Accept-Language», и всё работает отлично. Я создал тестового пользователя и заметил, что язык браузера этого пользователя сохраняется в его профиле (вместо значения «(по умолчанию)»), что просто замечательно.

Единственная проблема в том, что я мигрировал 800 пользователей из phpBB, и у всех в профиле указано «(по умолчанию)». Я знаю, что многие из них хотели бы использовать другой язык, но я не хочу менять английский язык по умолчанию в глобальной конфигурации, так как хочу, чтобы он оставался основным.

Подскажите, пожалуйста, возможно ли зайти в консоль Discourse (./launcher enter app), перебрать список имен пользователей / ID (или что-то другое) и изменить язык в указанных профилях пользователей?

Я думал создать простой bash-скрипт примерно такого вида:

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

Но мне не хватает знаний о Discourse, чтобы выполнить команду для редактирования настроек пользователя… Не могли бы вы мне помочь с этим?

Спасибо.

Руди

Да, это можно сделать через консоль Rails. Чтобы открыть консоль Rails, выполните ./launcher enter app, затем введите rails c в приглашении, чтобы запустить консоль.

Я бы рекомендовал быть осторожным при переборе всех пользователей, пока вы не уверены, что именно произойдёт. Вот как я тестировал это для отдельного пользователя на своём сайте:

Сначала получите список локалей, используемых Discourse:

I18n.available_locales

Это выведет длинный список символов, которые Discourse использует для локалей. Например: :be, :bg, :bs_BA, :ca...

Эти символы можно использовать для установки локали. Например, чтобы изменить язык пользователя на французский:

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

Если вы хотите перебрать всех пользователей, вам нужно будет найти способ получить массивы пользователей для каждой локали, чтобы можно было перебирать их. Если у вас есть списки имён пользователей для каждой локали, их можно использовать для поиска пользователей. Простой способ сделать это из консоли — преобразовать список имён пользователей в массив. Например:

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

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

Если вы решите попробовать это, действуйте осторожно. Обязательно создайте резервную копию базы данных вашего сайта перед внесением изменений.

Большое спасибо @simon — этот код мне очень помог.

У меня абсолютно НЕТ опыта работы с Ruby, но есть опыт в других языках, поэтому мне не потребовалось много времени, чтобы написать следующий код:

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
        # пропустить этого пользователя
        puts "------: #{user.id}: #{user.trust_level}: \"#{user.username}\""
    end
end

Я ничего не знаю о Ruby, поэтому наверняка существует более изящный способ сделать это. Но этот вариант работает для меня :wink: . Спасибо.