Completed
Push — update_ical ( df1f6d...3c35fe )
by
unknown
01:22
created

SchedulesController.load_event()   A

Complexity

Conditions 1

Size

Total Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
dl 0
loc 9
rs 9.6666
c 0
b 0
f 0
1
class SchedulesController < ApplicationController
2
  def index
3
    unless Settings.show_schedule? || params[:force]
4
      redirect_to home_page_path
5
      return
6
    end
7
    @event = Event.current_event
8
    render layout: 'schedule'
9
  end
10
11
  def ical
12
    event = Event.current_event
13
14
    sessions = event.sessions.includes([:room, :timeslot])
15
16
17
    cal = Icalendar::Calendar.new
18
19
    # Set up timezone
20
    cal.timezone do |t|
21
      t.tzid = "America/Chicago"
22
23
      t.daylight do |d|
24
        d.tzoffsetfrom = "-0600"
25
        d.tzoffsetto   = "-0500"
26
        d.tzname       = "CDT"
27
        d.dtstart      = "19700308T020000"
28
        d.rrule        = "FREQ=YEARLY;BYMONTH=3;BYDAY=2SU"
29
      end
30
31
      t.standard do |s|
32
        s.tzoffsetfrom = "-0500"
33
        s.tzoffsetto   = "-0600"
34
        s.tzname       = "CST"
35
        s.dtstart      = "19701101T020000"
36
        s.rrule        = "FREQ=YEARLY;BYMONTH=11;BYDAY=1SU"
37
      end
38
    end
39
40
    sessions.each do |session|
41
      next if session.timeslot.nil?
42
43
      cal.event do |e|
44
        e.summary     = session.title
45
        e.organizer   = Icalendar::Values::CalAddress.new('', cn: session.presenter_names.join("\\, "))
46
        e.description = session.summary
47
        e.dtstart     = session.timeslot.starts_at.to_datetime
48
        e.dtend       = session.timeslot.ends_at.to_datetime
49
50
        e.location    = session.room.name
51
      end
52
    end
53
54
    render plain: cal.to_ical, :content_type => 'text/calendar'
55
  end
56
57
  def event_timeslots
58
    @event_timeslots ||= load_event.timeslots
59
  end
60
  helper_method :event_timeslots
61
62
  private
63
64
  def load_event
65
    event = Event.includes(timeslots: { sessions: [:room, :presenters] }).find(Event.current_event.id)
66
67
    # Preload vote counts in order to sort sessions by popularity
68
    Session.preload_attendance_counts(
69
      event.timeslots.map(&:sessions).flatten)
70
71
    event
72
  end
73
74
end
75