cartodb/lib/tasks/legends.rake
2020-06-15 10:58:47 +08:00

101 lines
3.0 KiB
Ruby

namespace :carto do
namespace :legends do
namespace :migration do
desc 'Migrate html type legends to custom'
task migrate_html_to_custom: :environment do
html_legends = Carto::Legend.where(type: 'html')
html_legends_count = html_legends.count
errored = []
puts "#{html_legends_count} html type legends..."
html_legends.each_with_index do |legend, index|
if Carto::Layer.exists?(legend.layer_id) && !legend.update_attributes(type: 'custom')
errored << legend
end
printf "(#{index}/#{html_legends_count})"
end
2.times { puts }
unless errored.empty?
puts "Errored legend migrations (#{errored.count}):"
errored.each do |legend|
puts "#{legend.id}: #{legend.errors.full_messages.join(',')}"
end
end
end
desc 'Fix custom legends with images'
task migrate_custom_image: :environment do
include Carto::MapcappedVisualizationUpdater
CSS_URL_REGEX = /^(?:url\(['"]?)(.*?)(?:['"]?\))$/
STATIC_ASSETS_REGEX = /http:\/\/com.cartodb.users-assets.production.s3.amazonaws.com(.*)/
puts "Updating base layer urls"
layers = Carto::Layer.joins(:legends).where(legends: { type: 'custom' })
total = layers.count
acc = 0
errors = 0
puts "Updating #{total} layers"
layers.find_each do |layer|
acc += 1
puts "#{acc} / #{total}" if (acc % 100).zero?
begin
visualization = layer.visualization
next unless visualization
success = update_visualization_and_mapcap(visualization) do |vis, persisted|
vis.data_layers.each do |l|
acc_legend = 0
l.legends.each do |legend|
acc_category = 0
categories = legend[:definition][:categories]
categories && categories.each do |category|
icon = category[:icon]
css_url_match = icon && CSS_URL_REGEX.match(icon)
if css_url_match
icon = css_url_match[1]
category[:icon] = icon
end
static_assets_match = icon && STATIC_ASSETS_REGEX.match(icon)
if static_assets_match
icon = "https://s3.amazonaws.com/com.cartodb.users-assets.production#{static_assets_match[1]}"
category[:icon] = icon
end
acc_category += 1
end
legend.save if persisted
acc_legend += 1
end
end
end
raise 'MapcappedVisualizationUpdater returned false' unless success
rescue => e
errors += 1
STDERR.puts "Error updating layer #{layer.id}: #{e.inspect}. #{e.backtrace.join(',')}"
end
end
puts "Finished. Total: #{total}. Errors: #{errors}"
end
end
end
end