Skip to content

Instantly share code, notes, and snippets.

@kamilbednarz
Last active July 17, 2024 07:53
Show Gist options
  • Save kamilbednarz/783c560842bcf8296cb1ba8a2c33a451 to your computer and use it in GitHub Desktop.
Save kamilbednarz/783c560842bcf8296cb1ba8a2c33a451 to your computer and use it in GitHub Desktop.
Olive Grove generatoin script
# 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