Move calendar scraping to a model method

This commit is contained in:
2023-10-04 14:41:15 +01:00
parent ef3642678d
commit 0e0d26d06d
5 changed files with 67 additions and 82 deletions
-71
View File
@@ -1,71 +0,0 @@
class ScrapeCalendarJob < ApplicationJob
queue_as :default
def clean_up_lecture_title(unit_code, short_lecture_title) end
def perform(*args)
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
unit_codes = Course.all.map(&:unit_code)
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.in?(unit_codes)
{
unit_code:,
short_lecture_title:,
start_time:,
event_uuid:,
}
end
events
.compact
.filter { |attrs| attrs[:unit_code].in? unit_codes }
.group_by { |attrs| attrs[:unit_code] }
.map do |unit_code, course_events|
course = Course.find_by(unit_code: unit_code)
lecture_counter = 0
course_events.each do |event|
# Naive check to see if we've already created this lecture
if course.lectures.find_by(event_uuid: event[:event_uuid]).present? || course.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
course.lectures.create!(
title: title,
start_time: event[:start_time],
event_uuid: event[:event_uuid],
)
end
end
end
end