CLI를 통해 여러 사용자 프로필/환경 설정 일괄 변경

여러분 안녕하세요,

다국어 포럼을 운영 중이라 allow user locale와 set locale from accept language header를 활성화했는데, 잘 작동하고 있습니다. 테스트 사용자를 등록해 보니 사용자 웹 브라우저 언어가 (default) 대신 새 사용자 프로필에 저장되는 것을 확인했는데, 이는 완벽합니다.

제가 겪는 유일한 문제는 phpBB에서 800명의 사용자를 마이그레이션했는데, 모두 사용자 프로필에 (default)가 표시된다는 점입니다. 상당수가 다른 언어를 사용하길 원할 것이라는 것은 알고 있지만, 영어를 기본 언어로 유지하고 싶으므로 전역 설정의 기본 영어를 변경하고 싶지 않습니다.

Discourse(./launcher enter app)에 접속하여 사용자 이름/ID 목록(어떤 것이든)을 반복하면서 지정된 사용자 프로필의 언어를 변경하는 것이 가능한지 알려 주실 수 있을까요?

이처럼 간단한 bash 스크립트를 작성하는 것을 고려하고 있습니다:

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

하지만 사용자 설정을 편집하는 명령을 실행하는 데 필요한 Discourse 지식이 부족합니다… 이 부분에 대해 도움을 주실 수 있을까요?

감사합니다.

Rudy

네, rails 콘솔에서 이 작업을 수행할 수 있습니다. rails 콘솔에 접근하려면 ./launcher enter app을 실행한 후 프롬프트에서 rails c를 입력하여 rails 콘솔을 시작하세요.

무엇이 발생할지 확실하지 않을 때까지 모든 사용자를 반복하는 것은 주의해야 합니다. 제 사이트에서 개별 사용자를 테스트한 방법은 다음과 같습니다:

먼저, 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
        # skip this user
        puts "------: #{user.id}: #{user.trust_level}: \"#{user.username}\""
    end
end

Ruby에 대해 아무것도 모르기 때문에 더 깔끔한 방법이 있을 수도 있습니다. 하지만 저에게는 이 정도면 잘 작동하네요 :wink: . 감사합니다.