DEV: Add rake task for generating avatars from SSO
This commit is contained in:
parent
df7dab9dce
commit
b2fee68b3f
|
@ -118,6 +118,7 @@ class UserAvatar < ActiveRecord::Base
|
||||||
max_file_size: SiteSetting.max_image_size_kb.kilobytes,
|
max_file_size: SiteSetting.max_image_size_kb.kilobytes,
|
||||||
tmp_file_name: "sso-avatar",
|
tmp_file_name: "sso-avatar",
|
||||||
follow_redirect: true,
|
follow_redirect: true,
|
||||||
|
skip_rate_limit: !!options&.fetch(:skip_rate_limit, false),
|
||||||
)
|
)
|
||||||
|
|
||||||
return unless tempfile
|
return unless tempfile
|
||||||
|
|
|
@ -117,6 +117,7 @@ class UserProfile < ActiveRecord::Base
|
||||||
max_file_size: SiteSetting.max_image_size_kb.kilobytes,
|
max_file_size: SiteSetting.max_image_size_kb.kilobytes,
|
||||||
tmp_file_name: "sso-profile-background",
|
tmp_file_name: "sso-profile-background",
|
||||||
follow_redirect: true,
|
follow_redirect: true,
|
||||||
|
skip_rate_limit: true,
|
||||||
)
|
)
|
||||||
|
|
||||||
return unless tempfile
|
return unless tempfile
|
||||||
|
|
|
@ -573,3 +573,72 @@ task "import:update_first_post_created_at" => :environment do
|
||||||
|
|
||||||
log "Done"
|
log "Done"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
desc "Update avatars from external_avatar_url in SSO records"
|
||||||
|
task "import:update_avatars_from_sso" => :environment do
|
||||||
|
log "Updating avatars from SSO records"
|
||||||
|
|
||||||
|
sql = <<~SQL
|
||||||
|
SELECT user_id, external_avatar_url
|
||||||
|
FROM single_sign_on_records s
|
||||||
|
WHERE NOT EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM user_avatars a
|
||||||
|
WHERE a.user_id = s.user_id
|
||||||
|
)
|
||||||
|
SQL
|
||||||
|
|
||||||
|
queue = SizedQueue.new(1000)
|
||||||
|
threads = []
|
||||||
|
|
||||||
|
threads << Thread.new do ||
|
||||||
|
DB.query_each(sql) { |row| queue << { user_id: row.user_id, url: row.external_avatar_url } }
|
||||||
|
queue.close
|
||||||
|
end
|
||||||
|
|
||||||
|
max_count = DB.query_single(<<~SQL).first
|
||||||
|
SELECT COUNT(*)
|
||||||
|
FROM single_sign_on_records s
|
||||||
|
WHERE NOT EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM user_avatars a
|
||||||
|
WHERE a.user_id = s.user_id
|
||||||
|
)
|
||||||
|
SQL
|
||||||
|
|
||||||
|
status_queue = Queue.new
|
||||||
|
status_thread =
|
||||||
|
Thread.new do
|
||||||
|
error_count = 0
|
||||||
|
current_count = 0
|
||||||
|
|
||||||
|
while !(status = status_queue.pop).nil?
|
||||||
|
error_count += 1 if !status
|
||||||
|
current_count += 1
|
||||||
|
|
||||||
|
print "\r%7d / %7d (%d errors)" % [current_count, max_count, error_count]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
20.times do
|
||||||
|
threads << Thread.new do
|
||||||
|
while row = queue.pop
|
||||||
|
begin
|
||||||
|
UserAvatar.import_url_for_user(
|
||||||
|
row[:url],
|
||||||
|
User.find(row[:user_id]),
|
||||||
|
override_gravatar: true,
|
||||||
|
skip_rate_limit: true,
|
||||||
|
)
|
||||||
|
status_queue << true
|
||||||
|
rescue StandardError
|
||||||
|
status_queue << false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
threads.each(&:join)
|
||||||
|
status_queue.close
|
||||||
|
status_thread.join
|
||||||
|
end
|
||||||
|
|
Loading…
Reference in New Issue