seeds.rb 3 KB
Newer Older
Zac Wood's avatar
Zac Wood committed
1
2
# This file should contain all the record creation needed to seed the database with its default values.
# The data can then be loaded with the rails db:seed command (or created alongside the database with db:setup).
3

Zac Wood's avatar
Zac Wood committed
4
5
6
7
8
9
require_relative 'patriot_web_parser'
require 'thwait'
require 'httparty'
require 'nokogiri'
require 'json'

Zac Wood's avatar
Zac Wood committed
10
# threads = []
Zac Wood's avatar
Zac Wood committed
11
12
13
14
15
16
17
18
19
20
21
total = {}
parser = PatriotWeb::Parser.new

# get the first semester only
semester = parser.parse_semesters.first

puts "DDOSing Patriot Web, buckle up kids"

# parse all subjects and their courses in the semester
parser.parse_subjects(semester).each do |subject|
  puts "Getting courses for #{subject}"
22
  # threads << Thread.new {
Zac Wood's avatar
Zac Wood committed
23
  total[subject] = parser.parse_courses_in_subject(subject)
24
  # }
Zac Wood's avatar
Zac Wood committed
25
26
27
end

# For testing, only get first subject
28
# subject = parser.parse_subjects(semester)[20]
Zac Wood's avatar
Zac Wood committed
29
30
31
# total[subject] = parser.parse_courses_in_subject(subject)

# wait for all the threads to finish
32
# ThreadsWait.all_waits(*threads)
Zac Wood's avatar
Zac Wood committed
33
34

# delete everything in the current database
Zac Wood's avatar
Zac Wood committed
35
Closure.delete_all
Zac Wood's avatar
Zac Wood committed
36
CourseSection.delete_all
37
38
39
Course.delete_all
Semester.delete_all

Zac Wood's avatar
Zac Wood committed
40
41
42
43
# create a semester for the next semester
semester = Semester.create! season: 'Fall', year: 2018
semester.save!

44
45
all_sections = []

Zac Wood's avatar
Zac Wood committed
46
47
48
total.each do |subject, sections|
  puts "Adding courses for #{subject}..."
  sections.each do |section|
49
50
51
52
    if section.nil? || !section.key?(:subj) || !section.key?(:course_number)
      puts "#{subject} failed section: #{section.class}"
      next
    end
Zac Wood's avatar
Zac Wood committed
53

54
55
    section_name = "#{section[:subj]} #{section[:course_number]} #{section[:section]}"

Zach Perkins's avatar
Zach Perkins committed
56
57
58
59
60
61
62
63
64
65
66
67
    all_sections.push(name: section_name,
                      crn: section[:crn],
                      section_type: section[:type],
                      title: section[:title],
                      instructor: section[:instructor],
                      start_date: section[:start_date],
                      end_date: section[:end_date],
                      days: section[:days],
                      start_time: section[:start_time],
                      end_time: section[:end_time],
                      location: section[:location],
                      course: course)
68

Zac Wood's avatar
Zac Wood committed
69
70
71
72
73
74
75
76
77
78
79
80
    # Find or create a course and set its semester
    # TODO: this breaks when you try to do more than one semester,
    # since just the subject + course_number do not uniquely identify a course
    # Check the semester as well
    course = Course.find_or_create_by(subject: section[:subj],
                                      course_number: section[:course_number])
    course.semester = semester
    course.save!

    # puts "Adding #{section_name}..."
  end
end
Zac Wood's avatar
Zac Wood committed
81

82
83
CourseSection.create!(all_sections)

Zac Wood's avatar
Zac Wood committed
84
85
86
87
88
89
# create closures for the days there will be no classes
# see: https://registrar.gmu.edu/calendars/fall-2018/
Closure.create! date: Date.new(2018, 9, 3), semester: semester
Closure.create! date: Date.new(2018, 10, 8), semester: semester
(21..25).each { |n| Closure.create! date: Date.new(2018, 11, n), semester: semester }
(10..19).each { |n| Closure.create! date: Date.new(2018, 12, n), semester: semester }