lecture-attendance-manager/app/models/course.rb
Joshua Coles 7344ac3d67
All checks were successful
Build and Publish Docker Container / build (push) Successful in 5m55s
Make it a little generic, time to step away for now
2023-10-07 16:05:26 +01:00

78 lines
2.4 KiB
Ruby

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