class Course < ApplicationRecord has_many :lectures, dependent: :destroy has_many :work_items, dependent: :destroy # A course has a standalone connection to its recordings. To be displayed they must be associated with a lecture but # we them independently to avoid re-importing lectures. has_many :recordings, dependent: :destroy def lectures_and_work_items (lectures + work_items).sort_by(&:start_time) end def import_from_calendar! ics_file = HTTParty.get("https://mytimetable.bath.ac.uk/ical?6519757b&group=false&timetable=!MjAyMyFzdHVkZW50c2V0ITRDRjQ5MjlGRTg1M0Q4N0MyMDZENTVDNUQ3QTJFNzk0&eu=amMzMDkxQGJhdGguYWMudWs=&h=MiuDbRiudE_Yf7B25v2SfEuFCtmYGkFb5sAUI3yGmtY=") calendars = Icalendar::Calendar.parse(ics_file) calendar = calendars.first events = calendar.events.map do |event| summary = event.summary match = summary.split('-') # Handle odd events we don't care about next if match.length != 2 unit_code = match[0] short_lecture_title = match[1] start_time = event.dtstart.to_time event_uuid = event.uid.to_s next if unit_code.nil? || short_lecture_title.nil? || event_uuid.nil? || start_time.nil? || unit_code != self.unit_code { unit_code:, short_lecture_title:, start_time:, event_uuid:, } end lecture_counter = 0 events.compact.each do |event| # Naive check to see if we've already created this lecture if lectures.find_by(event_uuid: event[:event_uuid]).present? || lectures.find_by( start_time: (event[:start_time].beginning_of_hour + 5.minutes)..(event[:start_time].beginning_of_hour + 1.hour + 5.minutes) ).present? next end if event[:short_lecture_title].starts_with? "Lec" lecture_counter += 1 title = "Lecture #{lecture_counter}" else title = event[:short_lecture_title] end lectures.create!( title: title, start_time: event[:start_time], event_uuid: event[:event_uuid], ) end end # What should this do for existing attendances? def renumber_lectures! lectures.group_by(&:kind).each do |kind, lectures| lectures.sort_by(&:start_time).each_with_index do |lecture, index| lecture.update!(title: "#{kind.to_s.humanize} #{index + 1}") end end end end