Last active
July 17, 2024 07:53
-
-
Save kamilbednarz/783c560842bcf8296cb1ba8a2c33a451 to your computer and use it in GitHub Desktop.
Olive Grove generatoin script
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# EDlink Olive Grove District generation | |
require 'faker' | |
require 'digest' | |
# To always get the same names | |
Faker::Config.random = Random.new(42); | |
I18n::Debug.logger = Logger.new('/dev/null') | |
def fake_guid(key) | |
hash = Digest::SHA1.hexdigest(key) | |
[ | |
hash[0..7], | |
hash[8..11], | |
hash[12..15], | |
hash[16..19], | |
hash[20..31], | |
].join('-') | |
end | |
# Prepare output directory | |
# directory = '/Users/kamil/workspace/edlink/olive-grove/olive-grove'; | |
directory = 'OneRoster/'; | |
system("mkdir -p #{directory}"); | |
# Generate schools | |
school_names = { | |
high: 10.times.map do |i| | |
{ | |
name: "#{Faker::Ancient.titan} #{Faker::Ancient.god} High School", | |
id: fake_guid("high-school-#{i}") | |
} | |
end, | |
middle: 10.times.map do |i| | |
{ | |
name: "#{Faker::Ancient.titan} #{Faker::Ancient.god} Middle School", | |
id: fake_guid("middle-school-#{i}") | |
} | |
end, | |
elementary: 20.times.map do |i| | |
{ | |
name: "#{Faker::Ancient.titan} #{Faker::Ancient.god} Elementary School", | |
id: fake_guid("elementary-school-#{i}") | |
} | |
end | |
}; | |
SCHOOL_CSV_HEADERS = %w[sourcedId name status type] | |
schools_csv = CSV.open(File.join(directory, 'orgs.csv'), 'w'); | |
schools_csv << SCHOOL_CSV_HEADERS; | |
school_names.each do |category, configs| | |
configs.each do |config| | |
schools_csv << [config[:id], config[:name], 'active', 'school']; | |
end | |
end; | |
schools_csv.close; | |
# Generate academic sessions | |
TERMS_CSV_HEADERS = %w[sourcedId status title type startDate endDate schoolYear]; | |
SCHOOL_YEAR = 2024; | |
terms_csv = CSV.open(File.join(directory, 'academicSessions.csv'), 'w'); | |
terms_csv << TERMS_CSV_HEADERS; | |
TERM_ID_FY = fake_guid("term - 2024/25 FY"); | |
TERM_ID_S1 = fake_guid("term - 2024/25 S1"); | |
TERM_ID_S2 = fake_guid("term - 2024/25 S2"); | |
# OneRoster: | |
# terms_csv << [TERM_ID_FY, 'active', '2024/25 FY', 'schoolYear', '2024-08-10', '2025-06-30', SCHOOL_YEAR]; | |
# terms_csv << [TERM_ID_S1, 'active', '2024/25 S1', 'schoolYear', '2024-08-10', '2025-01-31', SCHOOL_YEAR]; | |
# terms_csv << [TERM_ID_S2, 'active', '2024/25 S2', 'schoolYear', '2025-02-01', '2025-06-30', SCHOOL_YEAR]; | |
# Edlink | |
terms_csv << [TERM_ID_FY, 'active', '2024/25 FY', 'school_year', '2024-08-10', '2025-06-30', SCHOOL_YEAR]; | |
terms_csv << [TERM_ID_S1, 'active', '2024/25 S1', 'semester', '2024-08-10', '2025-01-31', SCHOOL_YEAR]; | |
terms_csv << [TERM_ID_S2, 'active', '2024/25 S2', 'semester', '2025-02-01', '2025-06-30', SCHOOL_YEAR]; | |
terms_csv.close; | |
# Generate Courses | |
COURSES_CSV_HEADERS = %w[sourcedId orgSourcedId status title courseCode]; | |
courses_csv = CSV.open(File.join(directory, 'courses.csv'), 'w'); | |
courses_csv << COURSES_CSV_HEADERS; | |
school_names.each do |category, configs| | |
configs.each do |config| | |
courses = if %i[high middle].include?(category) | |
{ | |
'MATH' => { name: 'Mathematics', id: fake_guid("course-#{config[:id]}-MATH") }, | |
'ENG' => { name: 'English', id: fake_guid("course-#{config[:id]}-ENG") }, | |
'SCI' => { name: 'Science', id: fake_guid("course-#{config[:id]}-SCI") }, | |
'GEO' => { name: 'Geography', id: fake_guid("course-#{config[:id]}-GEO") }, | |
'PE' => { name: 'PhysEd', id: fake_guid("course-#{config[:id]}-PE") } | |
} | |
else | |
{ | |
'HR' => { name: 'Homeroom', id: fake_guid("course-#{config[:id]}-HR") }, | |
'READ' => { name: 'Reading', id: fake_guid("course-#{config[:id]}-READ") }, | |
} | |
end | |
config[:courses] = {}; | |
courses.each do |code, args| | |
config[:courses][code] = args[:id]; | |
courses_csv << [args[:id], config[:id], 'active', args[:name], code]; | |
end | |
end | |
end | |
courses_csv.close; | |
CLASSES_CSV_HEADERS = %w[sourcedId status title courseSourcedId classType schoolSourcedId termSourcedIds]; | |
classes_csv = CSV.open(File.join(directory, 'classes.csv'), 'w'); | |
classes_csv << CLASSES_CSV_HEADERS; | |
school_names.each do |category, configs| | |
configs.each do |config| | |
25.times do |index| | |
courses = %i[high middle].include?(category) ? %w[MATH ENG SCI GEO PE] : %w[HR READ]; | |
terms = %i[high middle].include?(category) ? [TERM_ID_S1, TERM_ID_S2] : [TERM_ID_FY]; | |
courses.each do |course| | |
terms.each do |term| | |
classes_csv << [ | |
fake_guid("class-#{config[:id]}-#{course}-#{index}-#{term}"), | |
'active', | |
"#{course} Section #{index}", | |
config[:courses][course], | |
'scheduled', | |
config[:id], | |
term | |
] | |
end | |
end | |
end | |
end | |
end; | |
classes_csv.close; | |
USERS_CSV = %w[sourcedId status enabledUser orgSourcedIds role username givenName familyName middleName role identifier email grades]; | |
users_csv = CSV.open(File.join(directory, 'users.csv'), 'w'); | |
users_csv << USERS_CSV; | |
ENROLLMENTS_CSV = %w[sourcedId userSourcedId classSourcedId role schoolSourcedId]; | |
enrollments_csv = CSV.open(File.join(directory, 'enrollments.csv'), 'w'); | |
enrollments_csv << ENROLLMENTS_CSV; | |
school_names.each do |category, configs| | |
configs.each do |config| | |
# Students | |
grades = if category == :high | |
['10', '11', '12'] | |
elsif category == :middle | |
['06', '07', '08'] | |
else | |
['KG', '01', '02'] | |
end | |
700.times do |index| | |
guid = fake_guid("student-#{config[:id]}-#{index}"); | |
users_csv << [ | |
guid, | |
'active', | |
'true', | |
config[:id], | |
'student', | |
Faker::Internet.username, | |
Faker::Name.first_name, | |
Faker::Name.last_name, | |
Faker::Name.middle_name, | |
'student', | |
"student-#{config[:id]}-#{index}", | |
Faker::Internet.email, | |
grades[index % 3] | |
]; | |
classes_index = index % 25; | |
courses = %i[high middle].include?(category) ? %w[MATH ENG SCI GEO PE] : %w[HR READ]; | |
terms = %i[high middle].include?(category) ? [TERM_ID_S1, TERM_ID_S2] : [TERM_ID_FY]; | |
terms.each do |term| | |
courses.each do |course_code| | |
enrollments_csv << [ | |
fake_guid("enrollment-#{course_code}-#{guid}"), | |
guid, | |
fake_guid("class-#{config[:id]}-#{course_code}-#{classes_index}-#{term}"), | |
'student', | |
config[:id] | |
]; | |
end | |
end; | |
end; | |
# Teachers | |
25.times do |index| | |
guid = fake_guid("teacher-#{config[:id]}-#{index}") | |
users_csv << [ | |
guid, | |
'active', | |
'true', | |
config[:id], | |
'teacher', | |
Faker::Internet.username, | |
Faker::Name.first_name, | |
Faker::Name.last_name, | |
Faker::Name.middle_name, | |
'teacher', | |
"teacher-#{config[:id]}-#{index}", | |
Faker::Internet.email, | |
'' | |
]; | |
courses = %i[high middle].include?(category) ? %w[MATH ENG SCI GEO PE] : %w[HR READ]; | |
terms = %i[high middle].include?(category) ? [TERM_ID_S1, TERM_ID_S2] : [TERM_ID_FY]; | |
course_code = courses[index % courses.size]; | |
terms.each do |term| | |
enrollments_csv << [ | |
fake_guid("enrollment-#{course_code}-#{guid}"), | |
guid, | |
fake_guid("class-#{config[:id]}-#{course_code}-#{index}-#{term}"), | |
'teacher', | |
config[:id] | |
]; | |
end; | |
end | |
end; | |
# Generate administrators for each group of schools | |
2.times do |index| | |
users_csv << [ | |
fake_guid("admin-#{index}"), | |
'active', | |
'true', | |
configs.map { |config| config[:id] }.join(','), | |
'administrator', | |
Faker::Internet.username, | |
Faker::Name.first_name, | |
Faker::Name.last_name, | |
Faker::Name.middle_name, | |
'administrator', | |
"admin-#{index}", | |
Faker::Internet.email, | |
'' | |
] | |
end; | |
end; | |
users_csv.close; | |
enrollments_csv.close; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment