osbridge/openconferenceware

View on GitHub
lib/tasks/export.rake

Summary

Maintainability
Test Coverage
namespace :open_conference_ware do
  namespace :export do
    def write_file(name, data)
      File.open(name,'w') {|f| f.write( data )}
    end

    # -[ Speakers ]---------------

    namespace :speakers do
      def speakers
        scope = ENV["EVENT"] ? Event.find_by_slug(ENV["EVENT"]).proposals : Proposal
        return scope.confirmed.populated.map(&:users).flatten.sort_by(&:last_name).uniq
      end

      desc "Exports basic speaker badge information to speakers.csv"
      task :brief => :environment do
        write_file( 'speakers.csv', speakers.to_comma(:brief) )
        puts "Basic speaker information written to speakers.csv"
      end

      desc "Exports full speaker information to speakers.csv"
      task :full => :get_speakers do
        write_file( 'speakers.csv', speakers.to_comma(:full) )
        puts "Full speaker information written to speakers.csv"
      end
    end

    desc "See: export:speakers:brief"
    task :speakers => 'speakers:brief'

    # -[ Users ]---------------

    namespace :users do
      def users
        User.order('last_name')
      end

      desc "Exports basic user information to users.csv"
      task :brief => :environment do
        write_file( 'users.csv', users.to_comma(:brief) )
        puts "Basic user information written to users.csv"
      end

      desc "Exports full user information to speakers.csv"
      task :full => :get_speakers do
        write_file( 'users.csv', users.to_comma(:full) )
        puts "Full user information written to users.csv"
      end
    end

    desc "See: export:users:brief"
    task :users => 'users:brief'

    # -[ Sessions ]------------

    desc "Export session information CSV for schedule monitor cards"
    task :session_card_csv => :environment do
      event = ENV['EVENT'].nil? ? OpenConferenceWare::Event.current : OpenConferenceWare::Event.find_by_slug(ENV['EVENT'])
      CSV.open('session_cards.csv','w') do |csv|
        csv << %w(room start_time title speakers)
        event.proposals.confirmed.order('start_time ASC').each do |session|
          row = []
          row << (session.room ? session.room.name : '')
          row << session.start_time.strftime("%A, %B %d, %I:%M%p")
          row << session.title
          row << session.users.map{|u| u.fullname}.join(', ')
          csv << row
        end
      end
    end

    namespace :room_schedule do
      desc "Export per-room schedule PDF"
      task :pdf => :environment do
        event = ENV['EVENT'].nil? ? OpenConferenceWare::Event.current : OpenConferenceWare::Event.find_by_slug(ENV['EVENT'])
        Prawn::Document.generate('RoomSchedule.pdf', :page_size => 'LETTER', :margin => [18,18,18,18]) do |pdf|
          pdf.font_families.update( "HelveticaNeueLTPro" => {
                :bold   => "HelveticaNeueLTPro-BdCn.ttf",
                :normal => "HelveticaNeueLTPro-Lt.ttf",
                :condensed => "HelveticaNeueLTPro-Cn.ttf",
                :ltcondensed => "HelveticaNeueLTPro-LtCn.ttf",
                :boldnormal => "HelveticaNeueLTPro-Bd.ttf",
                :roman => "HelveticaNeueLTPro-Roman.ttf"
              })

          event.rooms.each do |room|
            room.proposals.confirmed.group_by{|p| p.start_time.to_date}.each do |day, sessions|
              pdf.font "HelveticaNeueLTPro", :style => :boldnormal, :size => 30
              pdf.fill_color "000000"
              pdf.text "#{room.name}: #{day.strftime("%A, %B %d, %Y")}", :kerning => true

              sessions.sort_by{|s| s.start_time }.each do |session|
                pdf.font "HelveticaNeueLTPro", :style => :boldnormal, :size => 14
                pdf.fill_color 88, 55, 0, 0 # speaker blue
                pdf.text "#{session.start_time.strftime("%I:%M%p").gsub(/^0/,'')} \u002D #{session.end_time.strftime("%I:%M%p").gsub(/^0/,'')}", :kerning => true

                pdf.font "HelveticaNeueLTPro", :style => :boldnormal, :size => 18
                pdf.fill_color "000000"
                pdf.text session.title, :kerning => true

                pdf.font "HelveticaNeueLTPro", :style => :boldnormal, :size => 12
                pdf.fill_color 74, 0, 44, 0 # volunteer green
                pdf.text session.users.map{|u| u.fullname}.join(', '), :kerning => true

                pdf.move_down 2

                pdf.font "HelveticaNeueLTPro", :style => :roman, :size => 10
                pdf.fill_color "000000"
                pdf.text session.excerpt, :kerning => true

                pdf.move_down 15
              end
              pdf.start_new_page
            end
          end
        end
      end

      desc "Export per-room schedule CSV"
      task :csv => :environment do

        event = ENV['EVENT'].nil? ? OpenConferenceWare::Event.current : OpenConferenceWare::Event.find_by_slug(ENV['EVENT'])
        CSV.open('RoomSchedule.csv','w') do |csv|
          csv << ['room', 'day'] + (1..10).map{|n| ["s#{n}_start_time", "s#{n}_end_time", "s#{n}_title", "s#{n}_presenters", "s#{n}_excerpt", "s#{n}_track", "s#{n}_session_type"] }.flatten
          event.rooms.each do |room|
            room.proposals.confirmed.group_by{|p| p.start_time.to_date}.each do |day, sessions|
                row = []
            end
          end
        end
      end

      desc "Export per-room schedule XML"
      task :xml => :environment do
        xml = ""
        xm = Builder::XmlMarkup.new(:target => xml, :indent => 2)
        event = ENV['EVENT'].nil? ? OpenConferenceWare::Event.current : OpenConferenceWare::Event.find_by_slug(ENV['EVENT'])

        xm.instruct!
        xm.Root do
          event.rooms.each do |room|
            room.proposals.confirmed.group_by{|p| p.start_time.to_date}.each do |day, sessions|
              xm.room_schedule do
                xm.schedule_title "#{room.name}: #{day.strftime("%A, %B %d, %Y")}"
                sessions.sort_by{|s| s.start_time }.each do |session|
                  xm.session('id' => session.id) do
                    # xm.start_time session.start_time.strftime("%I:%M%p")
                    # xm.end_time session.end_time.strftime("%I:%M%p")
                    xm.start_and_end "#{session.start_time.strftime("%I:%M%p")} - #{session.start_time.strftime("%I:%M%p")}"
                    xm.title session.title
                    xm.presenters session.users.map{|u| u.fullname}.join(', ')
                    xm.excerpt do
                      xm.cdata! session.excerpt
                    end
                    # xm.session_type session.session_type && session.session_type.title
                    # xm.track session.track.title
                    # xm.description session.description
                  end
                end
              end
            end
          end
        end

        File.write('RoomSchedule.xml', xml)
      end
    end

  end
end