Move calendar scraping to a model method
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user