namespace :open_conference_ware do namespace :schedule do namespace :import do desc "Import schedule from CSV file." task :csv => :environment do unless ENV['CSV'] and ENV['EVENT'] puts <<-HERE schedule:import:csv Usage: rake schedule:import:csv RAILS_ENV=production EVENT=2010 CSV=schedule.csv CSV format: Your CSV file must have a header with these titles and data: * date * time * proposal_id HERE exit 1 end event_slug = ENV['EVENT'] csv_file = ENV['CSV'] event = Event.find_by_slug(event_slug) puts "* Loaded event by slug: #{event.slug}" has_seen_header = false puts "* Reading CSV file: #{csv_file}" CSV.foreach(csv_file) do |row| date, time, proposal_id = row if has_seen_header proposal = Proposal.find(proposal_id) datetime = Time.zone.parse "#{date} #{time}" puts "- Setting #{datetime.inspect} for #{proposal.title}" proposal.update_attribute(:start_time, datetime) else expected_header = %w[date time proposal_id] unless expected_header == row puts "ERROR: your CSV file header must be #{expected_header.inspect}" exit 1 end puts "* Validated CSV header" has_seen_header = true end end end desc "Import schedule from Google Spread Sheet" task :google_spreadsheet => :environment do require 'google_spreadsheet' if raw = SECRETS.schedule_google_spreadsheet auth = OpenStruct.new(raw) else puts <<-HERE ERROR: No credentials found for importing. Please add your credentials in the following format to your "config/secrets.yml" file: schedule_google_spreadsheet: login: 'your@google.account' password: 'your_password' key: 'your_key' HERE raise ArgumentError, "No credentials" end gs = GoogleSpreadsheet.login(auth.login, auth.password).spreadsheet_by_key(auth.key) print "- Loading ... " STDOUT.flush data = gs.worksheets.select{|sheet| sheet.title.include?("Exportable")}.map do |sheet| sheet.rows[1..-1].map do |row| { :id => row[0], :room_id => row[1], :start_time => Time.zone.parse("#{row[2]} #{row[3]}") } end end.flatten puts "#{data.size} records" print "- Saving ..." STDOUT.flush data.each do |scheduled| if scheduled[:id].to_i > 0 begin session = Proposal.find(scheduled[:id]) session.room_id = scheduled[:room_id] session.start_time = scheduled[:start_time] session.save rescue ActiveRecord::RecordNotFound puts "! Unknown record: #{scheduled.inspect}" end end end puts "done!" end end end end