diff --git a/app/controllers/exports_controller.rb b/app/controllers/exports_controller.rb index 306634f3..d2affa8b 100644 --- a/app/controllers/exports_controller.rb +++ b/app/controllers/exports_controller.rb @@ -30,7 +30,7 @@ class ExportsController < ApplicationController report = params[:report] if ["Survey Item - By Item", "Survey Item - By Grade", "Survey Entries - by Measure"].include?(report) - use_student_survey_items = student_survey_types[params[:student_survey_type]] + use_student_survey_items = student_survey_types[params[:student_survey_type]] || ::SurveyItem.student_survey_items.pluck(:id) reports[report].call(schools, academic_years, use_student_survey_items) else reports[report].call(schools, academic_years) @@ -88,8 +88,7 @@ class ExportsController < ApplicationController filename: "beyond_learning_loss_response_rate_#{Date.today}.csv" }, "Survey Item - By Item" => lambda { |schools, academic_years, use_student_survey_items| - data = Report::SurveyItemByItem.to_csv(schools:, academic_years:, - use_student_survey_items:) + data = Report::SurveyItemByItem.to_csv(schools:, academic_years:, use_student_survey_items:) send_data data, disposition: "attachment", filename: "survey_item_by_item_#{Date.today}.csv" }, diff --git a/app/models/report/beyond_learning_loss.rb b/app/models/report/beyond_learning_loss.rb index af6e11b9..e5f1dbae 100644 --- a/app/models/report/beyond_learning_loss.rb +++ b/app/models/report/beyond_learning_loss.rb @@ -21,10 +21,18 @@ module Report Thread.new do while school = jobs.pop(true) academic_years.each do |academic_year| - scales.each do |scale| - respondents = Respondent.by_school_and_year(school:, academic_year:) - next if respondents.nil? + respondents = Respondent.by_school_and_year(school:, academic_year:) + next if respondents.nil? + + begin_date = ::SurveyItemResponse.where(school:, + academic_year:).where.not(recorded_date: nil).order(:recorded_date).first&.recorded_date&.to_date + end_date = ::SurveyItemResponse.where(school:, + academic_year:).where.not(recorded_date: nil).order(:recorded_date).last&.recorded_date&.to_date + date_range = "#{begin_date} - #{end_date}" + all_grades = Respondent.grades_that_responded_to_survey(academic_year:, school:) + grades = "#{all_grades.first}-#{all_grades.last}" + scales.each do |scale| response_rate = scale.measure.subcategory.response_rate(school:, academic_year:) next unless response_rate.meets_student_threshold? || response_rate.meets_teacher_threshold? @@ -37,16 +45,8 @@ module Report scale.score(school:, academic_year:) end - begin_date = ::SurveyItemResponse.where(school:, - academic_year:).where.not(recorded_date: nil).order(:recorded_date).first&.recorded_date&.to_date - end_date = ::SurveyItemResponse.where(school:, - academic_year:).where.not(recorded_date: nil).order(:recorded_date).last&.recorded_date&.to_date - date_range = "#{begin_date} - #{end_date}" - row = [response_rate, scale, school, academic_year] - all_grades = respondents.enrollment_by_grade.keys - grades = "#{all_grades.first}-#{all_grades.last}" mutex.synchronize do data << [school.district.name, school.name, diff --git a/app/models/report/beyond_learning_loss_school_response_rates.rb b/app/models/report/beyond_learning_loss_school_response_rates.rb index fde20f30..fa6e28d2 100644 --- a/app/models/report/beyond_learning_loss_school_response_rates.rb +++ b/app/models/report/beyond_learning_loss_school_response_rates.rb @@ -48,7 +48,8 @@ module Report academic_year:).where.not(recorded_date: nil).order(:recorded_date).last&.recorded_date&.to_date date_range = "#{begin_date} - #{end_date}" - all_grades = respondents.enrollment_by_grade.keys + all_grades = Respondent.grades_that_responded_to_survey(academic_year:, school:) + grades = "#{all_grades.first}-#{all_grades.last}" mutex.synchronize do diff --git a/app/models/report/measure.rb b/app/models/report/measure.rb index b1185f7b..c2bc7d9f 100644 --- a/app/models/report/measure.rb +++ b/app/models/report/measure.rb @@ -21,26 +21,25 @@ module Report Thread.new do while school = jobs.pop(true) academic_years.each do |academic_year| - measures.each do |measure| - respondents = Respondent.by_school_and_year(school:, academic_year:) - next if respondents.nil? + respondents = Respondent.by_school_and_year(school:, academic_year:) + next if respondents.nil? - response_rate = measure.subcategory.response_rate(school:, academic_year:) - next unless response_rate.meets_student_threshold? || response_rate.meets_teacher_threshold? + begin_date = ::SurveyItemResponse.where(school:, + academic_year:).where.not(recorded_date: nil).order(:recorded_date).first&.recorded_date&.to_date + end_date = ::SurveyItemResponse.where(school:, + academic_year:).where.not(recorded_date: nil).order(:recorded_date).last&.recorded_date&.to_date + date_range = "#{begin_date} - #{end_date}" + all_grades = Respondent.grades_that_responded_to_survey(academic_year: academic_year, school: school) + grades = "#{all_grades.first}-#{all_grades.last}" + measures.each do |measure| score = measure.score(school:, academic_year:) zone = measure.zone(school:, academic_year:).type.to_s.capitalize - begin_date = ::SurveyItemResponse.where(school:, - academic_year:).where.not(recorded_date: nil).order(:recorded_date).first&.recorded_date&.to_date - end_date = ::SurveyItemResponse.where(school:, - academic_year:).where.not(recorded_date: nil).order(:recorded_date).last&.recorded_date&.to_date - date_range = "#{begin_date} - #{end_date}" + response_rate = measure.subcategory.response_rate(school:, academic_year:) + next unless response_rate.meets_student_threshold? || response_rate.meets_teacher_threshold? row = [response_rate, measure, school, academic_year] - - all_grades = respondents.enrollment_by_grade.keys - grades = "#{all_grades.first}-#{all_grades.last}" mutex.synchronize do data << [measure.name, measure.measure_id, diff --git a/app/models/report/measure_summary.rb b/app/models/report/measure_summary.rb index b9b64242..9c1520b9 100644 --- a/app/models/report/measure_summary.rb +++ b/app/models/report/measure_summary.rb @@ -20,21 +20,17 @@ module Report workers = pool_size.times.map do Thread.new do while measure = jobs.pop(true) - academic_years.each do |academic_year| - respondents = Respondent.where(school: schools, academic_year:) - - enrollment = respondents.map do | respondent| respondent.enrollment_by_grade.keys end.flatten.compact.uniq.sort - grades_with_responses = ::SurveyItemResponse.where(school: schools, academic_year:).where.not(grade: nil).pluck(:grade).uniq.sort - all_grades = (enrollment & grades_with_responses).sort - grades = "#{all_grades.first}-#{all_grades.last}" + all_grades = Respondent.grades_that_responded_to_survey(academic_year: academic_years, school: schools) + grades = "#{all_grades.first}-#{all_grades.last}" + district = schools.first.district + academic_years.each do |academic_year| begin_date = ::SurveyItemResponse.where(school: schools, academic_year:).where.not(recorded_date: nil).order(:recorded_date).first&.recorded_date&.to_date end_date = ::SurveyItemResponse.where(school: schools, academic_year:).where.not(recorded_date: nil).order(:recorded_date).last&.recorded_date&.to_date date_range = "#{begin_date} - #{end_date}" - district = schools.first.district row = [measure, district, academic_year] mutex.synchronize do diff --git a/app/models/report/subcategory.rb b/app/models/report/subcategory.rb index afcb0a73..ac3fdc47 100644 --- a/app/models/report/subcategory.rb +++ b/app/models/report/subcategory.rb @@ -21,26 +21,25 @@ module Report Thread.new do while school = jobs.pop(true) academic_years.each do |academic_year| - subcategories.each do |subcategory| - respondents = Respondent.by_school_and_year(school:, academic_year:) - next if respondents.nil? + respondents = Respondent.by_school_and_year(school:, academic_year:) + next if respondents.nil? - response_rate = subcategory.response_rate(school:, academic_year:) - next unless response_rate.meets_student_threshold? || response_rate.meets_teacher_threshold? + begin_date = ::SurveyItemResponse.where(school:, + academic_year:).where.not(recorded_date: nil).order(:recorded_date).first&.recorded_date&.to_date + end_date = ::SurveyItemResponse.where(school:, + academic_year:).where.not(recorded_date: nil).order(:recorded_date).last&.recorded_date&.to_date + date_range = "#{begin_date} - #{end_date}" + all_grades = Respondent.grades_that_responded_to_survey(academic_year:, school:) + grades = "#{all_grades.first}-#{all_grades.last}" + subcategories.each do |subcategory| score = subcategory.score(school:, academic_year:) zone = subcategory.zone(school:, academic_year:).type.to_s.capitalize - - begin_date = ::SurveyItemResponse.where(school:, - academic_year:).where.not(recorded_date: nil).order(:recorded_date).first&.recorded_date&.to_date - end_date = ::SurveyItemResponse.where(school:, - academic_year:).where.not(recorded_date: nil).order(:recorded_date).last&.recorded_date&.to_date - date_range = "#{begin_date} - #{end_date}" + response_rate = subcategory.response_rate(school:, academic_year:) + next unless response_rate.meets_student_threshold? || response_rate.meets_teacher_threshold? row = [response_rate, subcategory, school, academic_year] - all_grades = respondents.enrollment_by_grade.keys - grades = "#{all_grades.first}-#{all_grades.last}" mutex.synchronize do data << [school.district.name, school.name, diff --git a/app/models/report/survey_item_by_grade.rb b/app/models/report/survey_item_by_grade.rb index 3bcfe7c5..c8136d65 100644 --- a/app/models/report/survey_item_by_grade.rb +++ b/app/models/report/survey_item_by_grade.rb @@ -15,13 +15,7 @@ module Report # also get a map of grade->survey_id sufficient_survey_items = {} - grades = [] - schools.each do |school| - academic_years.each do |academic_year| - grades.concat(school.grades(academic_year:)) - end - end - grades = grades.uniq.reject { |grade| grade == -1 }.reject(&:nil?) # remove preschool and nil grades + grades = Respondent.grades_that_responded_to_survey(academic_year: academic_years, school: schools) grades.each do |grade| sufficient_survey_items[grade] ||= Set.new diff --git a/app/models/report/survey_item_by_item.rb b/app/models/report/survey_item_by_item.rb index 76d5e357..d5b640f3 100644 --- a/app/models/report/survey_item_by_item.rb +++ b/app/models/report/survey_item_by_item.rb @@ -39,13 +39,7 @@ module Report "Academic Year" ] - grades = [] - schools.each do |school| - academic_years.each do |academic_year| - grades.concat(school.grades(academic_year:)) - end - end - grades = grades.uniq.reject { |grade| grade == -1 }.reject(&:nil?) # remove preschool and nil grades + grades = Respondent.grades_that_responded_to_survey(academic_year: academic_years, school: schools) grades.each do |value| if value == 0 diff --git a/app/models/respondent.rb b/app/models/respondent.rb index d2e1b90b..81989f5f 100644 --- a/app/models/respondent.rb +++ b/app/models/respondent.rb @@ -34,4 +34,12 @@ class Respondent < ApplicationRecord def total_educators (total_teachers || 0) + (total_esp || 0) end + + def self.grades_that_responded_to_survey(academic_year:, school:) + respondents = Respondent.where(school:, academic_year:) + + enrollment = respondents.map { |respondent| respondent.enrollment_by_grade.keys }.flatten.compact.uniq.sort + grades_with_responses = ::SurveyItemResponse.where(school:, academic_year:).where.not(grade: nil).pluck(:grade).uniq.sort + (enrollment & grades_with_responses).sort + end end