You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
4.0 KiB
98 lines
4.0 KiB
module Report
|
|
class Exports
|
|
def self.create
|
|
academic_years = ::AcademicYear.all
|
|
districts = ::District.all
|
|
use_student_survey_items = ::SurveyItem.student_survey_items.map(&:id)
|
|
schools = ::School.all.includes(:district)
|
|
|
|
reports = {
|
|
"Subcategory by School & District" => lambda { |schools, academic_years|
|
|
Report::Subcategory.to_csv(schools:, academic_years:, subcategories: ::Subcategory.all)
|
|
},
|
|
"Measure by District only" => lambda { |schools, academic_years|
|
|
Report::MeasureSummary.to_csv(schools:, academic_years:, measures: ::Measure.all)
|
|
},
|
|
"Measure by School & District" => lambda { |schools, academic_years|
|
|
Report::Measure.to_csv(schools:, academic_years:,
|
|
measures: ::Measure.all)
|
|
},
|
|
"Survey Item by Item" => lambda { |schools, academic_years|
|
|
Report::SurveyItemByItem.to_csv(schools:, academic_years:)
|
|
},
|
|
"Survey Item by Grade" => lambda { |schools, academic_years|
|
|
Report::SurveyItemByGrade.to_csv(schools:, academic_years:,
|
|
use_student_survey_items:)
|
|
},
|
|
"Survey Entries by Measure" => lambda { |schools, academic_years|
|
|
Report::SurveyItemResponse.to_csv(schools:, academic_years:, use_student_survey_items:)
|
|
}
|
|
}
|
|
|
|
reports.each do |report_name, runner|
|
|
report_name = report_name.gsub(" ", "_").downcase
|
|
|
|
academic_years.each do |academic_year|
|
|
districts.each do |district|
|
|
# Each year
|
|
threads = []
|
|
threads << Thread.new do
|
|
response_count = ::SurveyItemResponse.where(school: district.schools, academic_year: academic_year).count
|
|
if response_count > 100
|
|
schools = district.schools
|
|
report_name = report_name.gsub(" ", "_").downcase
|
|
|
|
::FileUtils.mkdir_p ::Rails.root.join("tmp", "exports", report_name, academic_year.range, district.name)
|
|
|
|
filename = "#{report_name}_#{academic_year.range}_#{district.name}.csv"
|
|
filepath = Rails.root.join("tmp", "exports", report_name, academic_year.range, district.name, filename)
|
|
csv = runner.call(schools, [academic_year])
|
|
|
|
File.write(filepath, csv)
|
|
end
|
|
end
|
|
threads.each(&:join)
|
|
GC.start
|
|
end
|
|
# All districts
|
|
response_count = ::SurveyItemResponse.where(school: districts.flat_map(&:schools), academic_year: academic_year).count
|
|
next unless response_count > 100
|
|
|
|
threads = []
|
|
threads << Thread.new do
|
|
::FileUtils.mkdir_p ::Rails.root.join("tmp", "exports", report_name, academic_year.range, "all_districts")
|
|
|
|
filename = "#{report_name}_all_districts.csv"
|
|
filepath = Rails.root.join("tmp", "exports", report_name, academic_year.range, "all_districts", filename)
|
|
csv = runner.call(districts.flat_map(&:schools), [academic_year])
|
|
|
|
File.write(filepath, csv)
|
|
end
|
|
threads.each(&:join)
|
|
GC.start
|
|
end
|
|
|
|
districts.each do |district|
|
|
# # All years for each district
|
|
threads = []
|
|
threads << Thread.new do
|
|
response_count = ::SurveyItemResponse.where(school: district.schools, academic_year: academic_years).count
|
|
next unless response_count > 100
|
|
|
|
::FileUtils.mkdir_p ::Rails.root.join("tmp", "exports", report_name, "all_years", district.name)
|
|
|
|
filename = "#{report_name}_all_years_#{district.name}.csv"
|
|
filepath = Rails.root.join("tmp", "exports", report_name, "all_years", district.name, filename)
|
|
csv = runner.call(district.schools, academic_years)
|
|
|
|
File.write(filepath, csv)
|
|
GC.start
|
|
end
|
|
threads.each(&:join)
|
|
GC.start
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|