44 lines
1.3 KiB
Ruby
44 lines
1.3 KiB
Ruby
namespace :opendoors do
|
|
|
|
class UrlUpdater
|
|
def update_work(row)
|
|
begin
|
|
work = Work.find(row["AO3 id"])
|
|
if work&.imported_from_url.blank? || work&.imported_from_url == row["URL Imported From"]
|
|
work.imported_from_url = row["Original URL"]
|
|
work.save!
|
|
"#{work.id}\twas updated: its import url is now #{work.imported_from_url}"
|
|
else
|
|
"#{work.id}\twas not changed: its import url is #{work.imported_from_url}"
|
|
end
|
|
rescue StandardError => e
|
|
"#{row["AO3 id"]}\twas not changed: #{e}"
|
|
end
|
|
end
|
|
end
|
|
|
|
desc "Map import urls based on spreadsheet data - required fields: 'AO3 id', 'URL Imported From', 'Original URL'"
|
|
task :import_url_mapping, [:csv] => :environment do |_t, args|
|
|
loc = if args[:csv].nil?
|
|
puts "Where is the Open Doors CSV located?"
|
|
STDIN.gets.chomp
|
|
else
|
|
args[:csv]
|
|
end
|
|
|
|
begin
|
|
f = File.open("opendoors_result.txt", "w")
|
|
url_updater = UrlUpdater.new
|
|
|
|
CSV.foreach(loc, headers: true) do |row|
|
|
result = url_updater.update_work(row)
|
|
puts result
|
|
f.write(result)
|
|
end
|
|
rescue TypeError => e # No or invalid CSV file
|
|
puts "Error parsing CSV file #{loc}: #{e.message}"
|
|
ensure
|
|
f.close
|
|
end
|
|
end
|
|
end
|