|
| 1 | +class CalendarsController < ApplicationController |
| 2 | + skip_authorization_check :only => [:index] |
| 3 | + |
| 4 | + # GET /calendars |
| 5 | + def index |
| 6 | + calendar = Icalendar::Calendar.new |
| 7 | + |
| 8 | + Conference.all.each do |conference| |
| 9 | + if params[:full] |
| 10 | + event_schedules = conference.program.selected_event_schedules( |
| 11 | + includes: [{ event: %i[event_type speakers submitter] }] |
| 12 | + ) |
| 13 | + calendar = build_icalendar_from_proposals(calendar, event_schedules.map(&:event), conference) |
| 14 | + else |
| 15 | + calendar = build_icalender_from_conference(calendar, conference) |
| 16 | + end |
| 17 | + end |
| 18 | + |
| 19 | + respond_to do |format| |
| 20 | + format.ics do |
| 21 | + calendar.publish |
| 22 | + render inline: calendar.to_ical |
| 23 | + end |
| 24 | + end |
| 25 | + end |
| 26 | + |
| 27 | + private |
| 28 | + |
| 29 | + def build_icalender_from_conference(calendar, conference) |
| 30 | + calendar.event do |event| |
| 31 | + event.dtstart = conference.start_date |
| 32 | + event.dtstart.ical_params = { 'VALUE'=>'DATE' } |
| 33 | + event.dtend = conference.end_date |
| 34 | + event.dtend.ical_params = { 'VALUE'=>'DATE' } |
| 35 | + event.duration = "P#{(conference.end_date - conference.start_date + 1).floor}D" |
| 36 | + event.created = conference.created_at |
| 37 | + event.last_modified = conference.updated_at |
| 38 | + event.summary = conference.title |
| 39 | + event.description = conference.description |
| 40 | + event.uid = conference.guid |
| 41 | + event.url = conference_url(conference.short_title) |
| 42 | + |
| 43 | + venue = conference.venue |
| 44 | + if venue |
| 45 | + event.geo = venue.latitude, venue.longitude if venue.latitude && venue.longitude |
| 46 | + |
| 47 | + location = '' |
| 48 | + location += "#{venue.street}, " if venue.street |
| 49 | + location += "#{venue.postalcode} #{venue.city}, " if venue.postalcode && venue.city |
| 50 | + location += venue.country_name if venue.country_name |
| 51 | + event.location = location if location |
| 52 | + end |
| 53 | + end |
| 54 | + calendar |
| 55 | + end |
| 56 | + |
| 57 | + # adds events to icalendar for proposals in a conference |
| 58 | + def build_icalendar_from_proposals(calendar, proposals, conference) |
| 59 | + proposals.each do |proposal| |
| 60 | + calendar.event do |event| |
| 61 | + event.dtstart = proposal.time |
| 62 | + event.dtend = proposal.time + proposal.event_type.length * 60 |
| 63 | + event.duration = "PT#{proposal.event_type.length}M" |
| 64 | + event.created = proposal.created_at |
| 65 | + event.last_modified = proposal.updated_at |
| 66 | + event.summary = proposal.title |
| 67 | + event.description = proposal.abstract |
| 68 | + event.uid = proposal.guid |
| 69 | + event.url = conference_program_proposal_url(conference.short_title, proposal.id) |
| 70 | + venue = conference.venue |
| 71 | + if venue |
| 72 | + event.geo = venue.latitude, venue.longitude if venue.latitude && venue.longitude |
| 73 | + |
| 74 | + location = '' |
| 75 | + location += "#{proposal.room.name} - " if proposal.room.name |
| 76 | + location += " - #{venue.street}, " if venue.street |
| 77 | + location += "#{venue.postalcode} #{venue.city}, " if venue.postalcode && venue.city |
| 78 | + location += "#{venue.country_name}, " if venue.country_name |
| 79 | + event.location = location |
| 80 | + end |
| 81 | + if proposal.difficulty_level && proposal.track |
| 82 | + event.categories = proposal.title, "Difficulty: #{proposal.difficulty_level.title}", "Track: #{proposal.track.name}" |
| 83 | + end |
| 84 | + end |
| 85 | + end |
| 86 | + calendar |
| 87 | + end |
| 88 | +end |
0 commit comments