fix: hide scores on analyze page for scores that don't meet the student threshold of 25%

rpp-main
rebuilt 2 years ago
parent 7bd7923d41
commit ce5340648f

@ -19,16 +19,22 @@ class SurveyItemResponse < ActiveRecord::Base
scope :averages_for_grade, lambda { |survey_items, school, academic_year, grade| scope :averages_for_grade, lambda { |survey_items, school, academic_year, grade|
SurveyItemResponse.where(survey_item: survey_items, school:, SurveyItemResponse.where(survey_item: survey_items, school:,
academic_year:, grade:).group(:survey_item).average(:likert_score) academic_year:, grade:).group(:survey_item).having("count(*) >= 10").average(:likert_score)
} }
scope :averages_for_gender, lambda { |survey_items, school, academic_year, gender| scope :averages_for_gender, lambda { |survey_items, school, academic_year, gender|
SurveyItemResponse.where(survey_item: survey_items, school:, SurveyItemResponse.where(survey_item: survey_items, school:,
academic_year:, gender:).group(:survey_item).average(:likert_score) academic_year:, gender:, grade: school.grades(academic_year:)).group(:survey_item).having("count(*) >= 10").average(:likert_score)
} }
scope :averages_for_income, lambda { |survey_items, school, academic_year, income| scope :averages_for_income, lambda { |survey_items, school, academic_year, income|
SurveyItemResponse.where(survey_item: survey_items, school:, SurveyItemResponse.where(survey_item: survey_items, school:,
academic_year:, income:).group(:survey_item).average(:likert_score) academic_year:, income:, grade: school.grades(academic_year:)).group(:survey_item).having("count(*) >= 10").average(:likert_score)
}
scope :averages_for_race, lambda { |school, academic_year, race|
SurveyItemResponse.joins("JOIN student_races on survey_item_responses.student_id = student_races.student_id JOIN students on students.id = student_races.student_id").where(
school:, academic_year:, grade: school.grades(academic_year:)
).where("student_races.race_id": race.id).group(:survey_item_id).having("count(*) >= 10").average(:likert_score)
} }
end end

@ -5,11 +5,17 @@ module Analyze
module ScoreForGender module ScoreForGender
def score(year_index) def score(year_index)
academic_year = academic_years[year_index] academic_year = academic_years[year_index]
meets_student_threshold = sufficient_student_responses?(academic_year:)
return Score::NIL_SCORE unless meets_student_threshold
averages = SurveyItemResponse.averages_for_gender(measure.student_survey_items, school, academic_year, averages = SurveyItemResponse.averages_for_gender(measure.student_survey_items, school, academic_year,
gender) gender)
average = bubble_up_averages(averages:).round(2) average = bubble_up_averages(averages:).round(2)
scorify(average:, meets_student_threshold: sufficient_student_responses?(academic_year:)) Score.new(average:,
meets_teacher_threshold: false,
meets_student_threshold:,
meets_admin_data_threshold: false)
end end
def bubble_up_averages(averages:) def bubble_up_averages(averages:)
@ -20,16 +26,9 @@ module Analyze
end.remove_blanks.average end.remove_blanks.average
end end
def scorify(average:, meets_student_threshold:)
return Score::NIL_SCORE unless meets_student_threshold
Score.new(average:,
meets_teacher_threshold: false,
meets_student_threshold: true,
meets_admin_data_threshold: false)
end
def sufficient_student_responses?(academic_year:) def sufficient_student_responses?(academic_year:)
return false unless measure.subcategory.response_rate(school:, academic_year:).meets_student_threshold?
yearly_counts = SurveyItemResponse.where(school:, academic_year:, yearly_counts = SurveyItemResponse.where(school:, academic_year:,
gender:, survey_item: measure.student_survey_items).group(:gender).select(:response_id).distinct(:response_id).count gender:, survey_item: measure.student_survey_items).group(:gender).select(:response_id).distinct(:response_id).count
yearly_counts.any? do |count| yearly_counts.any? do |count|

@ -4,13 +4,17 @@ module Analyze
module Grade module Grade
module ScoreForGrade module ScoreForGrade
def score(year_index) def score(year_index)
academic_year = academic_years[year_index]
meets_student_threshold = sufficient_student_responses?(academic_year:)
return Score::NIL_SCORE unless meets_student_threshold
averages = SurveyItemResponse.averages_for_grade(measure.student_survey_items, school, averages = SurveyItemResponse.averages_for_grade(measure.student_survey_items, school,
academic_years[year_index], grade) academic_years[year_index], grade)
average = bubble_up_averages(averages:).round(2) average = bubble_up_averages(averages:).round(2)
Score.new(average:, Score.new(average:,
meets_teacher_threshold: false, meets_teacher_threshold: false,
meets_student_threshold: true, meets_student_threshold:,
meets_admin_data_threshold: false) meets_admin_data_threshold: false)
end end
@ -21,6 +25,16 @@ module Analyze
end.remove_blanks.average end.remove_blanks.average
end.remove_blanks.average end.remove_blanks.average
end end
def sufficient_student_responses?(academic_year:)
return false unless measure.subcategory.response_rate(school:, academic_year:).meets_student_threshold?
yearly_counts = SurveyItemResponse.where(school:, academic_year:,
survey_item: measure.student_survey_items).group(:grade).select(:response_id).distinct(:response_id).count
yearly_counts.any? do |count|
count[1] >= 10
end
end
end end
end end
end end

@ -5,11 +5,17 @@ module Analyze
module ScoreForIncome module ScoreForIncome
def score(year_index) def score(year_index)
academic_year = academic_years[year_index] academic_year = academic_years[year_index]
meets_student_threshold = sufficient_student_responses?(academic_year:)
return Score::NIL_SCORE unless meets_student_threshold
averages = SurveyItemResponse.averages_for_income(measure.student_survey_items, school, academic_year, averages = SurveyItemResponse.averages_for_income(measure.student_survey_items, school, academic_year,
income) income)
average = bubble_up_averages(averages:).round(2) average = bubble_up_averages(averages:).round(2)
scorify(average:, meets_student_threshold: sufficient_student_responses?(academic_year:)) Score.new(average:,
meets_teacher_threshold: false,
meets_student_threshold:,
meets_admin_data_threshold: false)
end end
def bubble_up_averages(averages:) def bubble_up_averages(averages:)
@ -20,16 +26,9 @@ module Analyze
end.remove_blanks.average end.remove_blanks.average
end end
def scorify(average:, meets_student_threshold:)
return Score::NIL_SCORE unless meets_student_threshold
Score.new(average:,
meets_teacher_threshold: false,
meets_student_threshold: true,
meets_admin_data_threshold: false)
end
def sufficient_student_responses?(academic_year:) def sufficient_student_responses?(academic_year:)
return false unless measure.subcategory.response_rate(school:, academic_year:).meets_student_threshold?
yearly_counts = SurveyItemResponse.where(school:, academic_year:, yearly_counts = SurveyItemResponse.where(school:, academic_year:,
income:, survey_item: measure.student_survey_items).group(:income).select(:response_id).distinct(:response_id).count income:, survey_item: measure.student_survey_items).group(:income).select(:response_id).distinct(:response_id).count
yearly_counts.any? do |count| yearly_counts.any? do |count|

@ -3,16 +3,37 @@ module Analyze
module Column module Column
module ScoreForRace module ScoreForRace
def score(year_index) def score(year_index)
s = ::RaceScore.find_by(measure:, school:, academic_year: academic_years[year_index], race:) academic_year = academic_years[year_index]
average = s.average.round(2) unless s.nil? meets_student_threshold = sufficient_student_responses?(academic_year:)
average ||= 0 return Score::NIL_SCORE unless meets_student_threshold
meets_student_threshold = s.meets_student_threshold? unless s.nil?
meets_student_threshold ||= false survey_items = measure.student_survey_items
averages = SurveyItemResponse.averages_for_race(school, academic_year, race)
average = bubble_up_averages(averages:).round(2)
Score.new(average:, Score.new(average:,
meets_teacher_threshold: false, meets_teacher_threshold: false,
meets_student_threshold:, meets_student_threshold:,
meets_admin_data_threshold: false) meets_admin_data_threshold: false)
end end
def bubble_up_averages(averages:)
measure.student_scales.map do |scale|
scale.survey_items.map do |survey_item|
averages[survey_item.id]
end.remove_blanks.average
end.remove_blanks.average
end
def sufficient_student_responses?(academic_year:)
return false unless measure.subcategory.response_rate(school:, academic_year:).meets_student_threshold?
number_of_students_for_a_racial_group = SurveyItemResponse.joins("JOIN student_races on survey_item_responses.student_id = student_races.student_id JOIN students on students.id = student_races.student_id").where(
school:, academic_year:
).where("student_races.race_id": race.id).distinct.pluck(:student_id).count
number_of_students_for_a_racial_group >= 10
end
end end
end end
end end

@ -120,8 +120,6 @@ class SurveyItemValues
return "Unknown" unless disaggregation_data.present? return "Unknown" unless disaggregation_data.present?
byebug
disaggregation = disaggregation_data[[lasid, district.name, academic_year.range]] disaggregation = disaggregation_data[[lasid, district.name, academic_year.range]]
return "Unknown" unless disaggregation.present? return "Unknown" unless disaggregation.present?
@ -248,4 +246,3 @@ class SurveyItemValues
end end
end end
end end

Loading…
Cancel
Save