column can by given on the fly (dependency injection). Show Parent graphs on analyze page.rpp-main
parent
d76982e892
commit
e38bdfb761
@ -0,0 +1,27 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Analyze
|
||||||
|
module Graph
|
||||||
|
class AllParent
|
||||||
|
def initialize(scales:)
|
||||||
|
@scales = scales
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_s
|
||||||
|
"All Data"
|
||||||
|
end
|
||||||
|
|
||||||
|
def slug
|
||||||
|
"all-data"
|
||||||
|
end
|
||||||
|
|
||||||
|
def source
|
||||||
|
Analyze::Source::AllData.new(slices: [slice])
|
||||||
|
end
|
||||||
|
|
||||||
|
def slice
|
||||||
|
Analyze::Slice::AllData.new
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@ -0,0 +1,53 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Analyze
|
||||||
|
module Graph
|
||||||
|
module Column
|
||||||
|
class ColumnBase
|
||||||
|
def label
|
||||||
|
raise NotImplementedError
|
||||||
|
end
|
||||||
|
|
||||||
|
def basis
|
||||||
|
raise NotImplementedError
|
||||||
|
end
|
||||||
|
|
||||||
|
def show_irrelevancy_message?(measure:)
|
||||||
|
raise NotImplementedError
|
||||||
|
end
|
||||||
|
|
||||||
|
def show_insufficient_data_message?(measure:, school:, academic_years:)
|
||||||
|
raise NotImplementedError
|
||||||
|
end
|
||||||
|
|
||||||
|
def insufficiency_message
|
||||||
|
raise NotImplementedError
|
||||||
|
end
|
||||||
|
|
||||||
|
def score(measure:, school:, academic_year:)
|
||||||
|
raise NotImplementedError
|
||||||
|
end
|
||||||
|
|
||||||
|
def type
|
||||||
|
raise NotImplementedError
|
||||||
|
end
|
||||||
|
|
||||||
|
def n_size(measure:, school:, academic_year:)
|
||||||
|
raise NotImplementedError
|
||||||
|
end
|
||||||
|
|
||||||
|
def bubble_up_averages(measure:, averages:)
|
||||||
|
measure.student_scales.map do |scale|
|
||||||
|
scale.survey_items.map do |survey_item|
|
||||||
|
averages[survey_item]
|
||||||
|
end.remove_blanks.average
|
||||||
|
end.remove_blanks.average
|
||||||
|
end
|
||||||
|
|
||||||
|
def grades(school:, academic_year:)
|
||||||
|
Respondent.by_school_and_year(school:, academic_year:)&.enrollment_by_grade&.keys
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@ -0,0 +1,64 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Analyze
|
||||||
|
module Graph
|
||||||
|
module Column
|
||||||
|
class Ell < ColumnBase
|
||||||
|
attr_reader :ell
|
||||||
|
|
||||||
|
def initialize(ell:)
|
||||||
|
@ell = ell
|
||||||
|
end
|
||||||
|
|
||||||
|
def label
|
||||||
|
["#{ell.designation}"]
|
||||||
|
end
|
||||||
|
|
||||||
|
def basis
|
||||||
|
"student"
|
||||||
|
end
|
||||||
|
|
||||||
|
def show_irrelevancy_message?(measure:)
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
def show_insufficient_data_message?(measure:, school:, academic_years:)
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
def type
|
||||||
|
:student
|
||||||
|
end
|
||||||
|
|
||||||
|
def n_size(measure:, school:, academic_year:)
|
||||||
|
SurveyItemResponse.where(ell:, survey_item: measure.student_survey_items, school:, grade: grades(school:, academic_year:),
|
||||||
|
academic_year:).select(:response_id).distinct.count
|
||||||
|
end
|
||||||
|
|
||||||
|
def score(measure:, school:, academic_year:)
|
||||||
|
meets_student_threshold = sufficient_student_responses?(measure:, school:, academic_year:)
|
||||||
|
return Score::NIL_SCORE unless meets_student_threshold
|
||||||
|
|
||||||
|
averages = SurveyItemResponse.averages_for_ell(measure.student_survey_items, school, academic_year,
|
||||||
|
ell)
|
||||||
|
average = bubble_up_averages(measure:, averages:).round(2)
|
||||||
|
|
||||||
|
Score.new(average:,
|
||||||
|
meets_teacher_threshold: false,
|
||||||
|
meets_student_threshold:,
|
||||||
|
meets_admin_data_threshold: false)
|
||||||
|
end
|
||||||
|
|
||||||
|
def sufficient_student_responses?(measure:, school:, academic_year:)
|
||||||
|
return false unless measure.subcategory.response_rate(school:, academic_year:).meets_student_threshold?
|
||||||
|
|
||||||
|
yearly_counts = SurveyItemResponse.where(school:, academic_year:,
|
||||||
|
ell:, survey_item: measure.student_survey_items).group(:ell).select(:response_id).distinct(:response_id).count
|
||||||
|
yearly_counts.any? do |count|
|
||||||
|
count[1] >= 10
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@ -1,33 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module EllColumn
|
|
||||||
class Ell < GroupedBarColumnPresenter
|
|
||||||
include Analyze::Graph::Column::EllColumn::ScoreForEll
|
|
||||||
include Analyze::Graph::Column::EllColumn::EllCount
|
|
||||||
def label
|
|
||||||
%w[ELL]
|
|
||||||
end
|
|
||||||
|
|
||||||
def basis
|
|
||||||
"student"
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_irrelevancy_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_insufficient_data_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def ell
|
|
||||||
::Ell.find_by_slug "ell"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,18 +0,0 @@
|
|||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module EllColumn
|
|
||||||
module EllCount
|
|
||||||
def type
|
|
||||||
:student
|
|
||||||
end
|
|
||||||
|
|
||||||
def n_size(academic_year)
|
|
||||||
SurveyItemResponse.where(ell:, survey_item: measure.student_survey_items, school:, grade: grades,
|
|
||||||
academic_year:).select(:response_id).distinct.count
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module EllColumn
|
|
||||||
class NotEll < GroupedBarColumnPresenter
|
|
||||||
include Analyze::Graph::Column::EllColumn::ScoreForEll
|
|
||||||
include Analyze::Graph::Column::EllColumn::EllCount
|
|
||||||
def label
|
|
||||||
["Not ELL"]
|
|
||||||
end
|
|
||||||
|
|
||||||
def basis
|
|
||||||
"student"
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_irrelevancy_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_insufficient_data_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def ell
|
|
||||||
::Ell.find_by_slug "not-ell"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,41 +0,0 @@
|
|||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module EllColumn
|
|
||||||
module ScoreForEll
|
|
||||||
def score(academic_year)
|
|
||||||
meets_student_threshold = sufficient_student_responses?(academic_year:)
|
|
||||||
return Score::NIL_SCORE unless meets_student_threshold
|
|
||||||
|
|
||||||
averages = SurveyItemResponse.averages_for_ell(measure.student_survey_items, school, academic_year,
|
|
||||||
ell)
|
|
||||||
average = bubble_up_averages(averages:).round(2)
|
|
||||||
|
|
||||||
Score.new(average:,
|
|
||||||
meets_teacher_threshold: false,
|
|
||||||
meets_student_threshold:,
|
|
||||||
meets_admin_data_threshold: false)
|
|
||||||
end
|
|
||||||
|
|
||||||
def bubble_up_averages(averages:)
|
|
||||||
measure.student_scales.map do |scale|
|
|
||||||
scale.survey_items.map do |survey_item|
|
|
||||||
averages[survey_item]
|
|
||||||
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?
|
|
||||||
|
|
||||||
yearly_counts = SurveyItemResponse.where(school:, academic_year:,
|
|
||||||
ell:, survey_item: measure.student_survey_items).group(:ell).select(:response_id).distinct(:response_id).count
|
|
||||||
yearly_counts.any? do |count|
|
|
||||||
count[1] >= 10
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module EllColumn
|
|
||||||
class Unknown < GroupedBarColumnPresenter
|
|
||||||
include Analyze::Graph::Column::EllColumn::ScoreForEll
|
|
||||||
include Analyze::Graph::Column::EllColumn::EllCount
|
|
||||||
def label
|
|
||||||
%w[Unknown]
|
|
||||||
end
|
|
||||||
|
|
||||||
def basis
|
|
||||||
"student"
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_irrelevancy_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_insufficient_data_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def ell
|
|
||||||
::Ell.find_by_slug "unknown"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -0,0 +1,64 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Analyze
|
||||||
|
module Graph
|
||||||
|
module Column
|
||||||
|
class Gender < ColumnBase
|
||||||
|
attr_reader :gender
|
||||||
|
|
||||||
|
def initialize(gender:)
|
||||||
|
@gender = gender
|
||||||
|
end
|
||||||
|
|
||||||
|
def label
|
||||||
|
["#{gender.designation}"]
|
||||||
|
end
|
||||||
|
|
||||||
|
def basis
|
||||||
|
"student surveys"
|
||||||
|
end
|
||||||
|
|
||||||
|
def show_irrelevancy_message?(measure:)
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
def show_insufficient_data_message?(measure:, school:, academic_years:)
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
def type
|
||||||
|
:student
|
||||||
|
end
|
||||||
|
|
||||||
|
def n_size(measure:, school:, academic_year:)
|
||||||
|
SurveyItemResponse.where(gender:, survey_item: measure.student_survey_items, school:, grade: grades(school:, academic_year:),
|
||||||
|
academic_year:).select(:response_id).distinct.count
|
||||||
|
end
|
||||||
|
|
||||||
|
def score(measure:, school:, academic_year:)
|
||||||
|
meets_student_threshold = sufficient_student_responses?(measure:, school:, academic_year:)
|
||||||
|
return Score::NIL_SCORE unless meets_student_threshold
|
||||||
|
|
||||||
|
averages = SurveyItemResponse.averages_for_gender(measure.student_survey_items, school, academic_year,
|
||||||
|
gender)
|
||||||
|
average = bubble_up_averages(measure:, averages:).round(2)
|
||||||
|
|
||||||
|
Score.new(average:,
|
||||||
|
meets_teacher_threshold: false,
|
||||||
|
meets_student_threshold:,
|
||||||
|
meets_admin_data_threshold: false)
|
||||||
|
end
|
||||||
|
|
||||||
|
def sufficient_student_responses?(measure:, school:, academic_year:)
|
||||||
|
return false unless measure.subcategory.response_rate(school:, academic_year:).meets_student_threshold?
|
||||||
|
|
||||||
|
yearly_counts = SurveyItemResponse.where(school:, academic_year:,
|
||||||
|
gender:, survey_item: measure.student_survey_items).group(:gender).select(:response_id).distinct(:response_id).count
|
||||||
|
yearly_counts.any? do |count|
|
||||||
|
count[1] >= 10
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@ -1,33 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module GenderColumn
|
|
||||||
class Female < GroupedBarColumnPresenter
|
|
||||||
include Analyze::Graph::Column::GenderColumn::ScoreForGender
|
|
||||||
include Analyze::Graph::Column::GenderColumn::GenderCount
|
|
||||||
def label
|
|
||||||
%w[Female]
|
|
||||||
end
|
|
||||||
|
|
||||||
def basis
|
|
||||||
"student"
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_irrelevancy_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_insufficient_data_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def gender
|
|
||||||
::Gender.find_by_qualtrics_code 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,18 +0,0 @@
|
|||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module GenderColumn
|
|
||||||
module GenderCount
|
|
||||||
def type
|
|
||||||
:student
|
|
||||||
end
|
|
||||||
|
|
||||||
def n_size(academic_year)
|
|
||||||
SurveyItemResponse.where(gender:, survey_item: measure.student_survey_items, school:, grade: grades,
|
|
||||||
academic_year:).select(:response_id).distinct.count
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module GenderColumn
|
|
||||||
class Male < GroupedBarColumnPresenter
|
|
||||||
include Analyze::Graph::Column::GenderColumn::ScoreForGender
|
|
||||||
include Analyze::Graph::Column::GenderColumn::GenderCount
|
|
||||||
def label
|
|
||||||
%w[Male]
|
|
||||||
end
|
|
||||||
|
|
||||||
def basis
|
|
||||||
"student"
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_irrelevancy_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_insufficient_data_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def gender
|
|
||||||
::Gender.find_by_qualtrics_code 2
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module GenderColumn
|
|
||||||
class NonBinary < GroupedBarColumnPresenter
|
|
||||||
include Analyze::Graph::Column::GenderColumn::ScoreForGender
|
|
||||||
include Analyze::Graph::Column::GenderColumn::GenderCount
|
|
||||||
def label
|
|
||||||
%w[Non-Binary]
|
|
||||||
end
|
|
||||||
|
|
||||||
def basis
|
|
||||||
"student"
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_irrelevancy_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_insufficient_data_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def gender
|
|
||||||
::Gender.find_by_qualtrics_code 4
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,41 +0,0 @@
|
|||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module GenderColumn
|
|
||||||
module ScoreForGender
|
|
||||||
def score(academic_year)
|
|
||||||
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,
|
|
||||||
gender)
|
|
||||||
average = bubble_up_averages(averages:).round(2)
|
|
||||||
|
|
||||||
Score.new(average:,
|
|
||||||
meets_teacher_threshold: false,
|
|
||||||
meets_student_threshold:,
|
|
||||||
meets_admin_data_threshold: false)
|
|
||||||
end
|
|
||||||
|
|
||||||
def bubble_up_averages(averages:)
|
|
||||||
measure.student_scales.map do |scale|
|
|
||||||
scale.survey_items.map do |survey_item|
|
|
||||||
averages[survey_item]
|
|
||||||
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?
|
|
||||||
|
|
||||||
yearly_counts = SurveyItemResponse.where(school:, academic_year:,
|
|
||||||
gender:, survey_item: measure.student_survey_items).group(:gender).select(:response_id).distinct(:response_id).count
|
|
||||||
yearly_counts.any? do |count|
|
|
||||||
count[1] >= 10
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module GenderColumn
|
|
||||||
class Unknown < GroupedBarColumnPresenter
|
|
||||||
include Analyze::Graph::Column::GenderColumn::ScoreForGender
|
|
||||||
include Analyze::Graph::Column::GenderColumn::GenderCount
|
|
||||||
def label
|
|
||||||
%w[Unknown]
|
|
||||||
end
|
|
||||||
|
|
||||||
def basis
|
|
||||||
"student"
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_irrelevancy_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_insufficient_data_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def gender
|
|
||||||
::Gender.find_by_qualtrics_code 99
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -0,0 +1,64 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Analyze
|
||||||
|
module Graph
|
||||||
|
module Column
|
||||||
|
class Grade < ColumnBase
|
||||||
|
attr_reader :grade
|
||||||
|
|
||||||
|
def initialize(grade:)
|
||||||
|
@grade = grade
|
||||||
|
end
|
||||||
|
|
||||||
|
def label
|
||||||
|
["#{grade}"]
|
||||||
|
end
|
||||||
|
|
||||||
|
def basis
|
||||||
|
"student surveys"
|
||||||
|
end
|
||||||
|
|
||||||
|
def show_irrelevancy_message?(measure:)
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
def show_insufficient_data_message?(measure:, school:, academic_years:)
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
def type
|
||||||
|
:student
|
||||||
|
end
|
||||||
|
|
||||||
|
def n_size(measure:, school:, academic_year:)
|
||||||
|
SurveyItemResponse.where(grade:, survey_item: measure.student_survey_items, school:,
|
||||||
|
academic_year:).select(:response_id).distinct.count
|
||||||
|
end
|
||||||
|
|
||||||
|
def score(measure:, school:, academic_year:)
|
||||||
|
meets_student_threshold = sufficient_student_responses?(measure:, school:, academic_year:)
|
||||||
|
return Score::NIL_SCORE unless meets_student_threshold
|
||||||
|
|
||||||
|
averages = SurveyItemResponse.averages_for_grade(measure.student_survey_items, school,
|
||||||
|
academic_year, grade)
|
||||||
|
average = bubble_up_averages(measure:, averages:).round(2)
|
||||||
|
|
||||||
|
Score.new(average:,
|
||||||
|
meets_teacher_threshold: false,
|
||||||
|
meets_student_threshold:,
|
||||||
|
meets_admin_data_threshold: false)
|
||||||
|
end
|
||||||
|
|
||||||
|
def sufficient_student_responses?(measure:, school:, 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
|
||||||
@ -1,33 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module Grade
|
|
||||||
class Eight < GroupedBarColumnPresenter
|
|
||||||
include Analyze::Graph::Column::Grade::ScoreForGrade
|
|
||||||
include Analyze::Graph::Column::Grade::GradeCount
|
|
||||||
def label
|
|
||||||
%w[Grade 8]
|
|
||||||
end
|
|
||||||
|
|
||||||
def basis
|
|
||||||
"student"
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_irrelevancy_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_insufficient_data_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def grade
|
|
||||||
8
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module Grade
|
|
||||||
class Eleven < GroupedBarColumnPresenter
|
|
||||||
include Analyze::Graph::Column::Grade::ScoreForGrade
|
|
||||||
include Analyze::Graph::Column::Grade::GradeCount
|
|
||||||
def label
|
|
||||||
%w[Grade 11]
|
|
||||||
end
|
|
||||||
|
|
||||||
def basis
|
|
||||||
"student"
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_irrelevancy_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_insufficient_data_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def grade
|
|
||||||
11
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module Grade
|
|
||||||
class Five < GroupedBarColumnPresenter
|
|
||||||
include Analyze::Graph::Column::Grade::ScoreForGrade
|
|
||||||
include Analyze::Graph::Column::Grade::GradeCount
|
|
||||||
def label
|
|
||||||
%w[Grade 5]
|
|
||||||
end
|
|
||||||
|
|
||||||
def basis
|
|
||||||
"student"
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_irrelevancy_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_insufficient_data_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def grade
|
|
||||||
5
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module Grade
|
|
||||||
class Four < GroupedBarColumnPresenter
|
|
||||||
include Analyze::Graph::Column::Grade::ScoreForGrade
|
|
||||||
include Analyze::Graph::Column::Grade::GradeCount
|
|
||||||
def label
|
|
||||||
%w[Grade 4]
|
|
||||||
end
|
|
||||||
|
|
||||||
def basis
|
|
||||||
"student"
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_irrelevancy_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_insufficient_data_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def grade
|
|
||||||
4
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,18 +0,0 @@
|
|||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module Grade
|
|
||||||
module GradeCount
|
|
||||||
def type
|
|
||||||
:student
|
|
||||||
end
|
|
||||||
|
|
||||||
def n_size(academic_year)
|
|
||||||
SurveyItemResponse.where(grade:, survey_item: measure.student_survey_items, school:,
|
|
||||||
academic_year:).select(:response_id).distinct.count
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module Grade
|
|
||||||
class Nine < GroupedBarColumnPresenter
|
|
||||||
include Analyze::Graph::Column::Grade::ScoreForGrade
|
|
||||||
include Analyze::Graph::Column::Grade::GradeCount
|
|
||||||
def label
|
|
||||||
%w[Grade 9]
|
|
||||||
end
|
|
||||||
|
|
||||||
def basis
|
|
||||||
"student"
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_irrelevancy_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_insufficient_data_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def grade
|
|
||||||
9
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module Grade
|
|
||||||
class One < GroupedBarColumnPresenter
|
|
||||||
include Analyze::Graph::Column::Grade::ScoreForGrade
|
|
||||||
include Analyze::Graph::Column::Grade::GradeCount
|
|
||||||
def label
|
|
||||||
%w[Grade 1]
|
|
||||||
end
|
|
||||||
|
|
||||||
def basis
|
|
||||||
"student"
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_irrelevancy_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_insufficient_data_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def grade
|
|
||||||
1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module Grade
|
|
||||||
class PK < GroupedBarColumnPresenter
|
|
||||||
include Analyze::Graph::Column::Grade::ScoreForGrade
|
|
||||||
include Analyze::Graph::Column::Grade::GradeCount
|
|
||||||
def label
|
|
||||||
%w[Pre-K]
|
|
||||||
end
|
|
||||||
|
|
||||||
def basis
|
|
||||||
"student"
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_irrelevancy_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_insufficient_data_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def grade
|
|
||||||
-1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,41 +0,0 @@
|
|||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module Grade
|
|
||||||
module ScoreForGrade
|
|
||||||
def score(academic_year)
|
|
||||||
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,
|
|
||||||
academic_year, grade)
|
|
||||||
average = bubble_up_averages(averages:).round(2)
|
|
||||||
|
|
||||||
Score.new(average:,
|
|
||||||
meets_teacher_threshold: false,
|
|
||||||
meets_student_threshold:,
|
|
||||||
meets_admin_data_threshold: false)
|
|
||||||
end
|
|
||||||
|
|
||||||
def bubble_up_averages(averages:)
|
|
||||||
measure.student_scales.map do |scale|
|
|
||||||
scale.survey_items.map do |survey_item|
|
|
||||||
averages[survey_item]
|
|
||||||
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?
|
|
||||||
|
|
||||||
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
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module Grade
|
|
||||||
class Seven < GroupedBarColumnPresenter
|
|
||||||
include Analyze::Graph::Column::Grade::ScoreForGrade
|
|
||||||
include Analyze::Graph::Column::Grade::GradeCount
|
|
||||||
def label
|
|
||||||
%w[Grade 7]
|
|
||||||
end
|
|
||||||
|
|
||||||
def basis
|
|
||||||
"student"
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_irrelevancy_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_insufficient_data_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def grade
|
|
||||||
7
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module Grade
|
|
||||||
class Six < GroupedBarColumnPresenter
|
|
||||||
include Analyze::Graph::Column::Grade::ScoreForGrade
|
|
||||||
include Analyze::Graph::Column::Grade::GradeCount
|
|
||||||
def label
|
|
||||||
%w[Grade 6]
|
|
||||||
end
|
|
||||||
|
|
||||||
def basis
|
|
||||||
"student"
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_irrelevancy_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_insufficient_data_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def grade
|
|
||||||
6
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module Grade
|
|
||||||
class Ten < GroupedBarColumnPresenter
|
|
||||||
include Analyze::Graph::Column::Grade::ScoreForGrade
|
|
||||||
include Analyze::Graph::Column::Grade::GradeCount
|
|
||||||
def label
|
|
||||||
%w[Grade 10]
|
|
||||||
end
|
|
||||||
|
|
||||||
def basis
|
|
||||||
"student"
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_irrelevancy_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_insufficient_data_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def grade
|
|
||||||
10
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module Grade
|
|
||||||
class Three < GroupedBarColumnPresenter
|
|
||||||
include Analyze::Graph::Column::Grade::ScoreForGrade
|
|
||||||
include Analyze::Graph::Column::Grade::GradeCount
|
|
||||||
def label
|
|
||||||
%w[Grade 3]
|
|
||||||
end
|
|
||||||
|
|
||||||
def basis
|
|
||||||
"student"
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_irrelevancy_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_insufficient_data_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def grade
|
|
||||||
3
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module Grade
|
|
||||||
class Twelve < GroupedBarColumnPresenter
|
|
||||||
include Analyze::Graph::Column::Grade::ScoreForGrade
|
|
||||||
include Analyze::Graph::Column::Grade::GradeCount
|
|
||||||
def label
|
|
||||||
%w[Grade 12]
|
|
||||||
end
|
|
||||||
|
|
||||||
def basis
|
|
||||||
"student"
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_irrelevancy_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_insufficient_data_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def grade
|
|
||||||
12
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module Grade
|
|
||||||
class Two < GroupedBarColumnPresenter
|
|
||||||
include Analyze::Graph::Column::Grade::ScoreForGrade
|
|
||||||
include Analyze::Graph::Column::Grade::GradeCount
|
|
||||||
def label
|
|
||||||
%w[Grade 2]
|
|
||||||
end
|
|
||||||
|
|
||||||
def basis
|
|
||||||
"student"
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_irrelevancy_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_insufficient_data_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def grade
|
|
||||||
2
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module Grade
|
|
||||||
class Zero < GroupedBarColumnPresenter
|
|
||||||
include Analyze::Graph::Column::Grade::ScoreForGrade
|
|
||||||
include Analyze::Graph::Column::Grade::GradeCount
|
|
||||||
def label
|
|
||||||
%w[Kindergarten]
|
|
||||||
end
|
|
||||||
|
|
||||||
def basis
|
|
||||||
"student"
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_irrelevancy_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_insufficient_data_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def grade
|
|
||||||
0
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -0,0 +1,64 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Analyze
|
||||||
|
module Graph
|
||||||
|
module Column
|
||||||
|
class Income < ColumnBase
|
||||||
|
attr_reader :income
|
||||||
|
|
||||||
|
def initialize(income:)
|
||||||
|
@income = income
|
||||||
|
end
|
||||||
|
|
||||||
|
def label
|
||||||
|
income.designation.split(' ', 2)
|
||||||
|
end
|
||||||
|
|
||||||
|
def basis
|
||||||
|
"student surveys"
|
||||||
|
end
|
||||||
|
|
||||||
|
def show_irrelevancy_message?(measure:)
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
def show_insufficient_data_message?(measure:, school:, academic_years:)
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
def type
|
||||||
|
:student
|
||||||
|
end
|
||||||
|
|
||||||
|
def n_size(measure:, school:, academic_year:)
|
||||||
|
SurveyItemResponse.where(income:, survey_item: measure.student_survey_items, school:, grade: grades(school:, academic_year:),
|
||||||
|
academic_year:).select(:response_id).distinct.count
|
||||||
|
end
|
||||||
|
|
||||||
|
def score(measure:, school:, academic_year:)
|
||||||
|
meets_student_threshold = sufficient_student_responses?(measure:, school:, academic_year:)
|
||||||
|
return Score::NIL_SCORE unless meets_student_threshold
|
||||||
|
|
||||||
|
averages = SurveyItemResponse.averages_for_income(measure.student_survey_items, school, academic_year,
|
||||||
|
income)
|
||||||
|
average = bubble_up_averages(measure:, averages:).round(2)
|
||||||
|
|
||||||
|
Score.new(average:,
|
||||||
|
meets_teacher_threshold: false,
|
||||||
|
meets_student_threshold:,
|
||||||
|
meets_admin_data_threshold: false)
|
||||||
|
end
|
||||||
|
|
||||||
|
def sufficient_student_responses?(measure:, school:, academic_year:)
|
||||||
|
return false unless measure.subcategory.response_rate(school:, academic_year:).meets_student_threshold?
|
||||||
|
|
||||||
|
yearly_counts = SurveyItemResponse.where(school:, academic_year:,
|
||||||
|
income:, survey_item: measure.student_survey_items).group(:income).select(:response_id).distinct(:response_id).count
|
||||||
|
yearly_counts.any? do |count|
|
||||||
|
count[1] >= 10
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@ -1,29 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module IncomeColumn
|
|
||||||
class Disadvantaged < GroupedBarColumnPresenter
|
|
||||||
include Analyze::Graph::Column::IncomeColumn::ScoreForIncome
|
|
||||||
include Analyze::Graph::Column::IncomeColumn::IncomeCount
|
|
||||||
def label
|
|
||||||
%w[Economically Disadvantaged]
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_irrelevancy_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_insufficient_data_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def income
|
|
||||||
Income.find_by_designation "Economically Disadvantaged - Y"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,18 +0,0 @@
|
|||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module IncomeColumn
|
|
||||||
module IncomeCount
|
|
||||||
def type
|
|
||||||
:student
|
|
||||||
end
|
|
||||||
|
|
||||||
def n_size(academic_year)
|
|
||||||
SurveyItemResponse.where(income:, survey_item: measure.student_survey_items, school:, grade: grades,
|
|
||||||
academic_year:).select(:response_id).distinct.count
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,29 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module IncomeColumn
|
|
||||||
class NotDisadvantaged < GroupedBarColumnPresenter
|
|
||||||
include Analyze::Graph::Column::IncomeColumn::ScoreForIncome
|
|
||||||
include Analyze::Graph::Column::IncomeColumn::IncomeCount
|
|
||||||
def label
|
|
||||||
["Not Economically", "Disadvantaged"]
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_irrelevancy_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_insufficient_data_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def income
|
|
||||||
Income.find_by_designation "Economically Disadvantaged - N"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,41 +0,0 @@
|
|||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module IncomeColumn
|
|
||||||
module ScoreForIncome
|
|
||||||
def score(academic_year)
|
|
||||||
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,
|
|
||||||
income)
|
|
||||||
average = bubble_up_averages(averages:).round(2)
|
|
||||||
|
|
||||||
Score.new(average:,
|
|
||||||
meets_teacher_threshold: false,
|
|
||||||
meets_student_threshold:,
|
|
||||||
meets_admin_data_threshold: false)
|
|
||||||
end
|
|
||||||
|
|
||||||
def bubble_up_averages(averages:)
|
|
||||||
measure.student_scales.map do |scale|
|
|
||||||
scale.survey_items.map do |survey_item|
|
|
||||||
averages[survey_item]
|
|
||||||
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?
|
|
||||||
|
|
||||||
yearly_counts = SurveyItemResponse.where(school:, academic_year:,
|
|
||||||
income:, survey_item: measure.student_survey_items).group(:income).select(:response_id).distinct(:response_id).count
|
|
||||||
yearly_counts.any? do |count|
|
|
||||||
count[1] >= 10
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,29 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module IncomeColumn
|
|
||||||
class Unknown < GroupedBarColumnPresenter
|
|
||||||
include Analyze::Graph::Column::IncomeColumn::ScoreForIncome
|
|
||||||
include Analyze::Graph::Column::IncomeColumn::IncomeCount
|
|
||||||
def label
|
|
||||||
["Unknown"]
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_irrelevancy_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_insufficient_data_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def income
|
|
||||||
Income.find_by_designation "Unknown"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -0,0 +1,44 @@
|
|||||||
|
module Analyze
|
||||||
|
module Graph
|
||||||
|
module Column
|
||||||
|
module Parent
|
||||||
|
class Scale
|
||||||
|
attr_reader :scale
|
||||||
|
|
||||||
|
def initialize(scale:)
|
||||||
|
@scale = scale
|
||||||
|
end
|
||||||
|
|
||||||
|
def label
|
||||||
|
scale.name.split("-")
|
||||||
|
end
|
||||||
|
|
||||||
|
def basis
|
||||||
|
"parent data"
|
||||||
|
end
|
||||||
|
|
||||||
|
def show_irrelevancy_message?(measure:)
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
def show_insufficient_data_message?(measure:, school:, academic_years:)
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
def insufficiency_message
|
||||||
|
["data not", "available"]
|
||||||
|
end
|
||||||
|
|
||||||
|
def score(measure:, school:, academic_year:)
|
||||||
|
average = scale.parent_score(school:, academic_year:)
|
||||||
|
Score.new(average:, meets_teacher_threshold: true, meets_student_threshold: true, meets_admin_data_threshold: true)
|
||||||
|
end
|
||||||
|
|
||||||
|
def type
|
||||||
|
:parent
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@ -0,0 +1,67 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Analyze
|
||||||
|
module Graph
|
||||||
|
module Column
|
||||||
|
class Race < ColumnBase
|
||||||
|
attr_reader :race
|
||||||
|
|
||||||
|
def initialize(race:)
|
||||||
|
@race = race
|
||||||
|
end
|
||||||
|
|
||||||
|
def label
|
||||||
|
tmp = race.designation.split("or").first
|
||||||
|
tmp.split(" ", 2)
|
||||||
|
end
|
||||||
|
|
||||||
|
def basis
|
||||||
|
"student surveys"
|
||||||
|
end
|
||||||
|
|
||||||
|
def show_irrelevancy_message?(measure:)
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
def show_insufficient_data_message?(measure:, school:, academic_years:)
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
def type
|
||||||
|
:student
|
||||||
|
end
|
||||||
|
|
||||||
|
def n_size(measure:, school:, academic_year:)
|
||||||
|
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:,
|
||||||
|
survey_item: measure.student_survey_items
|
||||||
|
).where("student_races.race_id": race.id).select(:response_id).distinct.count
|
||||||
|
end
|
||||||
|
|
||||||
|
def score(measure:, school:, academic_year:)
|
||||||
|
meets_student_threshold = sufficient_student_responses?(measure:, school:, academic_year:)
|
||||||
|
return Score::NIL_SCORE unless meets_student_threshold
|
||||||
|
|
||||||
|
measure.student_survey_items
|
||||||
|
|
||||||
|
averages = SurveyItemResponse.averages_for_race(school, academic_year, race)
|
||||||
|
average = bubble_up_averages(measure:, averages:).round(2)
|
||||||
|
|
||||||
|
Score.new(average:,
|
||||||
|
meets_teacher_threshold: false,
|
||||||
|
meets_student_threshold:,
|
||||||
|
meets_admin_data_threshold: false)
|
||||||
|
end
|
||||||
|
|
||||||
|
def sufficient_student_responses?(measure:, school:, 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
|
||||||
@ -1,29 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module RaceColumn
|
|
||||||
class AmericanIndian < GroupedBarColumnPresenter
|
|
||||||
include Analyze::Graph::Column::ScoreForRace
|
|
||||||
include Analyze::Graph::Column::RaceColumn::RaceCount
|
|
||||||
def label
|
|
||||||
%w[American Indian]
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_irrelevancy_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_insufficient_data_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def race
|
|
||||||
Race.find_by_qualtrics_code 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,29 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module RaceColumn
|
|
||||||
class Asian < GroupedBarColumnPresenter
|
|
||||||
include Analyze::Graph::Column::ScoreForRace
|
|
||||||
include Analyze::Graph::Column::RaceColumn::RaceCount
|
|
||||||
def label
|
|
||||||
%w[Asian]
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_irrelevancy_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_insufficient_data_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def race
|
|
||||||
Race.find_by_qualtrics_code 2
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,29 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module RaceColumn
|
|
||||||
class Black < GroupedBarColumnPresenter
|
|
||||||
include Analyze::Graph::Column::ScoreForRace
|
|
||||||
include Analyze::Graph::Column::RaceColumn::RaceCount
|
|
||||||
def label
|
|
||||||
%w[Black]
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_irrelevancy_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_insufficient_data_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def race
|
|
||||||
Race.find_by_qualtrics_code 3
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,29 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module RaceColumn
|
|
||||||
class Hispanic < GroupedBarColumnPresenter
|
|
||||||
include Analyze::Graph::Column::ScoreForRace
|
|
||||||
include Analyze::Graph::Column::RaceColumn::RaceCount
|
|
||||||
def label
|
|
||||||
%w[Hispanic]
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_irrelevancy_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_insufficient_data_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def race
|
|
||||||
Race.find_by_qualtrics_code 4
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,30 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module RaceColumn
|
|
||||||
class MiddleEastern < GroupedBarColumnPresenter
|
|
||||||
include Analyze::Graph::Column::ScoreForRace
|
|
||||||
include Analyze::Graph::Column::RaceColumn::RaceCount
|
|
||||||
|
|
||||||
def label
|
|
||||||
%w[Middle Eastern]
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_irrelevancy_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_insufficient_data_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def race
|
|
||||||
Race.find_by_qualtrics_code 8
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,29 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module RaceColumn
|
|
||||||
class Multiracial < GroupedBarColumnPresenter
|
|
||||||
include Analyze::Graph::Column::ScoreForRace
|
|
||||||
include Analyze::Graph::Column::RaceColumn::RaceCount
|
|
||||||
def label
|
|
||||||
%w[Multiracial]
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_irrelevancy_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_insufficient_data_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def race
|
|
||||||
Race.find_by_qualtrics_code 100
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,20 +0,0 @@
|
|||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module RaceColumn
|
|
||||||
module RaceCount
|
|
||||||
def type
|
|
||||||
:student
|
|
||||||
end
|
|
||||||
|
|
||||||
def n_size(academic_year)
|
|
||||||
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:,
|
|
||||||
survey_item: measure.student_survey_items
|
|
||||||
).where("student_races.race_id": race.id).select(:response_id).distinct.count
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,29 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module RaceColumn
|
|
||||||
class Unknown < GroupedBarColumnPresenter
|
|
||||||
include Analyze::Graph::Column::ScoreForRace
|
|
||||||
include Analyze::Graph::Column::RaceColumn::RaceCount
|
|
||||||
def label
|
|
||||||
%w[Not Listed]
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_irrelevancy_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_insufficient_data_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def race
|
|
||||||
Race.find_by_qualtrics_code 99
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,29 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module RaceColumn
|
|
||||||
class White < GroupedBarColumnPresenter
|
|
||||||
include Analyze::Graph::Column::ScoreForRace
|
|
||||||
include Analyze::Graph::Column::RaceColumn::RaceCount
|
|
||||||
def label
|
|
||||||
%w[White]
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_irrelevancy_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_insufficient_data_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def race
|
|
||||||
Race.find_by_qualtrics_code 5
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,39 +0,0 @@
|
|||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module ScoreForRace
|
|
||||||
def score(academic_year)
|
|
||||||
meets_student_threshold = sufficient_student_responses?(academic_year:)
|
|
||||||
return Score::NIL_SCORE unless meets_student_threshold
|
|
||||||
|
|
||||||
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:,
|
|
||||||
meets_teacher_threshold: false,
|
|
||||||
meets_student_threshold:,
|
|
||||||
meets_admin_data_threshold: false)
|
|
||||||
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
|
|
||||||
@ -0,0 +1,64 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Analyze
|
||||||
|
module Graph
|
||||||
|
module Column
|
||||||
|
class Sped < ColumnBase
|
||||||
|
attr_reader :sped
|
||||||
|
|
||||||
|
def initialize(sped:)
|
||||||
|
@sped = sped
|
||||||
|
end
|
||||||
|
|
||||||
|
def label
|
||||||
|
["#{sped.designation}"]
|
||||||
|
end
|
||||||
|
|
||||||
|
def basis
|
||||||
|
"student surveys"
|
||||||
|
end
|
||||||
|
|
||||||
|
def show_irrelevancy_message?(measure:)
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
def show_insufficient_data_message?(measure:, school:, academic_years:)
|
||||||
|
false
|
||||||
|
end
|
||||||
|
|
||||||
|
def type
|
||||||
|
:student
|
||||||
|
end
|
||||||
|
|
||||||
|
def n_size(measure:, school:, academic_year:)
|
||||||
|
SurveyItemResponse.where(sped:, survey_item: measure.student_survey_items, school:, grade: grades(school:, academic_year:),
|
||||||
|
academic_year:).select(:response_id).distinct.count
|
||||||
|
end
|
||||||
|
|
||||||
|
def score(measure:, school:, academic_year:)
|
||||||
|
meets_student_threshold = sufficient_student_responses?(measure:, school:, academic_year:)
|
||||||
|
return Score::NIL_SCORE unless meets_student_threshold
|
||||||
|
|
||||||
|
averages = SurveyItemResponse.averages_for_sped(measure.student_survey_items, school, academic_year,
|
||||||
|
sped)
|
||||||
|
average = bubble_up_averages(measure:, averages:).round(2)
|
||||||
|
|
||||||
|
Score.new(average:,
|
||||||
|
meets_teacher_threshold: false,
|
||||||
|
meets_student_threshold:,
|
||||||
|
meets_admin_data_threshold: false)
|
||||||
|
end
|
||||||
|
|
||||||
|
def sufficient_student_responses?(measure:, school:, academic_year:)
|
||||||
|
return false unless measure.subcategory.response_rate(school:, academic_year:).meets_student_threshold?
|
||||||
|
|
||||||
|
yearly_counts = SurveyItemResponse.where(school:, academic_year:,
|
||||||
|
sped:, survey_item: measure.student_survey_items).group(:sped).select(:response_id).distinct(:response_id).count
|
||||||
|
yearly_counts.any? do |count|
|
||||||
|
count[1] >= 10
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@ -1,34 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module SpedColumn
|
|
||||||
class NotSped < GroupedBarColumnPresenter
|
|
||||||
include Analyze::Graph::Column::SpedColumn::ScoreForSped
|
|
||||||
include Analyze::Graph::Column::SpedColumn::SpedCount
|
|
||||||
|
|
||||||
def label
|
|
||||||
["Not Special", "Education"]
|
|
||||||
end
|
|
||||||
|
|
||||||
def basis
|
|
||||||
"student"
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_irrelevancy_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_insufficient_data_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def sped
|
|
||||||
::Sped.find_by_slug "not-special-education"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,41 +0,0 @@
|
|||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module SpedColumn
|
|
||||||
module ScoreForSped
|
|
||||||
def score(academic_year)
|
|
||||||
meets_student_threshold = sufficient_student_responses?(academic_year:)
|
|
||||||
return Score::NIL_SCORE unless meets_student_threshold
|
|
||||||
|
|
||||||
averages = SurveyItemResponse.averages_for_sped(measure.student_survey_items, school, academic_year,
|
|
||||||
sped)
|
|
||||||
average = bubble_up_averages(averages:).round(2)
|
|
||||||
|
|
||||||
Score.new(average:,
|
|
||||||
meets_teacher_threshold: false,
|
|
||||||
meets_student_threshold:,
|
|
||||||
meets_admin_data_threshold: false)
|
|
||||||
end
|
|
||||||
|
|
||||||
def bubble_up_averages(averages:)
|
|
||||||
measure.student_scales.map do |scale|
|
|
||||||
scale.survey_items.map do |survey_item|
|
|
||||||
averages[survey_item]
|
|
||||||
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?
|
|
||||||
|
|
||||||
yearly_counts = SurveyItemResponse.where(school:, academic_year:,
|
|
||||||
sped:, survey_item: measure.student_survey_items).group(:sped).select(:response_id).distinct(:response_id).count
|
|
||||||
yearly_counts.any? do |count|
|
|
||||||
count[1] >= 10
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,34 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module SpedColumn
|
|
||||||
class Sped < GroupedBarColumnPresenter
|
|
||||||
include Analyze::Graph::Column::SpedColumn::ScoreForSped
|
|
||||||
include Analyze::Graph::Column::SpedColumn::SpedCount
|
|
||||||
|
|
||||||
def label
|
|
||||||
%w[Special Education]
|
|
||||||
end
|
|
||||||
|
|
||||||
def basis
|
|
||||||
"student"
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_irrelevancy_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_insufficient_data_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def sped
|
|
||||||
::Sped.find_by_slug "special-education"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,18 +0,0 @@
|
|||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module SpedColumn
|
|
||||||
module SpedCount
|
|
||||||
def type
|
|
||||||
:student
|
|
||||||
end
|
|
||||||
|
|
||||||
def n_size(academic_year)
|
|
||||||
SurveyItemResponse.where(sped:, survey_item: measure.student_survey_items, school:, grade: grades,
|
|
||||||
academic_year:).select(:response_id).distinct.count
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,34 +0,0 @@
|
|||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
module Analyze
|
|
||||||
module Graph
|
|
||||||
module Column
|
|
||||||
module SpedColumn
|
|
||||||
class Unknown < GroupedBarColumnPresenter
|
|
||||||
include Analyze::Graph::Column::SpedColumn::ScoreForSped
|
|
||||||
include Analyze::Graph::Column::SpedColumn::SpedCount
|
|
||||||
|
|
||||||
def label
|
|
||||||
%w[Unknown]
|
|
||||||
end
|
|
||||||
|
|
||||||
def basis
|
|
||||||
"student"
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_irrelevancy_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_insufficient_data_message?
|
|
||||||
false
|
|
||||||
end
|
|
||||||
|
|
||||||
def sped
|
|
||||||
::Sped.find_by_slug "unknown"
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
Before Width: | Height: | Size: 492 B After Width: | Height: | Size: 517 B |
@ -1,77 +0,0 @@
|
|||||||
require "rails_helper"
|
|
||||||
|
|
||||||
RSpec.describe Analyze::Graph::Column::GenderColumn::Unknown, type: :model do
|
|
||||||
let(:school) { create(:school) }
|
|
||||||
let(:academic_year) { create(:academic_year) }
|
|
||||||
let(:measure) { create(:measure) }
|
|
||||||
let(:academic_years) { [academic_year] }
|
|
||||||
let(:position) { 0 }
|
|
||||||
let(:number_of_columns) { 1 }
|
|
||||||
let(:gender) { create(:gender, qualtrics_code: 99) }
|
|
||||||
|
|
||||||
let(:subcategory) { create(:subcategory, subcategory_id: "1A") }
|
|
||||||
let(:measure) { create(:measure, measure_id: "1A-iii", subcategory:) }
|
|
||||||
let(:scale) { create(:student_scale, measure:) }
|
|
||||||
let(:survey_item) { create(:student_survey_item, scale:) }
|
|
||||||
let(:teacher_scale) { create(:teacher_scale, measure:) }
|
|
||||||
let(:teacher_survey_item) { create(:teacher_survey_item, scale:) }
|
|
||||||
|
|
||||||
context "when no teacher responses exist" do
|
|
||||||
context "when there are insufficient unknown students" do
|
|
||||||
it "reports a score of 3 when the average is 3" do
|
|
||||||
expect(Analyze::Graph::Column::GenderColumn::Unknown.new(school:, academic_years:, position:, measure:,
|
|
||||||
number_of_columns:).score(academic_year).average).to eq(nil)
|
|
||||||
end
|
|
||||||
it "reports insufficient data" do
|
|
||||||
expect(Analyze::Graph::Column::GenderColumn::Unknown.new(school:, academic_years:, position:, measure:,
|
|
||||||
number_of_columns:).sufficient_student_responses?(academic_year:)).to eq(false)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
context "when there are sufficient unknown students" do
|
|
||||||
before :each do
|
|
||||||
create_list(:survey_item_response, 10, school:, academic_year:, gender:, survey_item:)
|
|
||||||
end
|
|
||||||
it "reports a score of 3 when the average is 3" do
|
|
||||||
expect(Analyze::Graph::Column::GenderColumn::Unknown.new(school:, academic_years:, position:, measure:,
|
|
||||||
number_of_columns:).score(academic_year).average).to eq(3)
|
|
||||||
end
|
|
||||||
|
|
||||||
it "reports sufficient data" do
|
|
||||||
expect(Analyze::Graph::Column::GenderColumn::Unknown.new(school:, academic_years:, position:, measure:,
|
|
||||||
number_of_columns:).sufficient_student_responses?(academic_year:)).to eq(true)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context "when teacher responses exist" do
|
|
||||||
before :each do
|
|
||||||
create_list(:survey_item_response, 10, school:, academic_year:, survey_item: teacher_survey_item, likert_score: 5)
|
|
||||||
end
|
|
||||||
|
|
||||||
context "when there are insufficient unknown students" do
|
|
||||||
it "reports a score of 3 when the average is 3" do
|
|
||||||
expect(Analyze::Graph::Column::GenderColumn::Unknown.new(school:, academic_years:, position:, measure:,
|
|
||||||
number_of_columns:).score(academic_year).average).to eq(nil)
|
|
||||||
end
|
|
||||||
it "reports insufficient data" do
|
|
||||||
expect(Analyze::Graph::Column::GenderColumn::Unknown.new(school:, academic_years:, position:, measure:,
|
|
||||||
number_of_columns:).sufficient_student_responses?(academic_year:)).to eq(false)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
context "when there are sufficient unknown students" do
|
|
||||||
before :each do
|
|
||||||
create_list(:survey_item_response, 10, school:, academic_year:, gender:, survey_item:)
|
|
||||||
end
|
|
||||||
it "reports a score of 3 when the average is 3" do
|
|
||||||
expect(Analyze::Graph::Column::GenderColumn::Unknown.new(school:, academic_years:, position:, measure:,
|
|
||||||
number_of_columns:).score(academic_year).average).to eq(3)
|
|
||||||
end
|
|
||||||
|
|
||||||
it "reports sufficient data" do
|
|
||||||
expect(Analyze::Graph::Column::GenderColumn::Unknown.new(school:, academic_years:, position:, measure:,
|
|
||||||
number_of_columns:).sufficient_student_responses?(academic_year:)).to eq(true)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
@ -0,0 +1,74 @@
|
|||||||
|
require "rails_helper"
|
||||||
|
include Analyze::Graph::Column
|
||||||
|
|
||||||
|
RSpec.describe Gender, type: :model do
|
||||||
|
let(:school) { create(:school) }
|
||||||
|
let(:academic_year) { create(:academic_year) }
|
||||||
|
let(:measure) { create(:measure) }
|
||||||
|
let(:academic_years) { [academic_year] }
|
||||||
|
let(:position) { 0 }
|
||||||
|
let(:number_of_columns) { 1 }
|
||||||
|
let(:gender) { create(:gender, qualtrics_code: 99) }
|
||||||
|
|
||||||
|
let(:subcategory) { create(:subcategory, subcategory_id: "1A") }
|
||||||
|
let(:measure) { create(:measure, measure_id: "1A-iii", subcategory:) }
|
||||||
|
let(:scale) { create(:student_scale, measure:) }
|
||||||
|
let(:survey_item) { create(:student_survey_item, scale:) }
|
||||||
|
let(:teacher_scale) { create(:teacher_scale, measure:) }
|
||||||
|
let(:teacher_survey_item) { create(:teacher_survey_item, scale:) }
|
||||||
|
let(:config) { Analyze::Graph::Column::Gender.new(gender: ::Gender.find_by_qualtrics_code(99)) }
|
||||||
|
|
||||||
|
context "when no teacher responses exist" do
|
||||||
|
context "when there are insufficient unknown students" do
|
||||||
|
it "reports a score of 3 when the average is 3" do
|
||||||
|
expect(GroupedBarColumnPresenter.new(school:, academic_years:, position:, measure:,
|
||||||
|
number_of_columns:, config:).score(academic_year:).average).to eq(nil)
|
||||||
|
end
|
||||||
|
it "reports insufficient data" do
|
||||||
|
expect(config.sufficient_student_responses?(measure:, school:, academic_year:)).to eq(false)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
context "when there are sufficient unknown students" do
|
||||||
|
before :each do
|
||||||
|
create_list(:survey_item_response, 10, school:, academic_year:, gender:, survey_item:)
|
||||||
|
end
|
||||||
|
it "reports a score of 3 when the average is 3" do
|
||||||
|
expect(GroupedBarColumnPresenter.new(school:, academic_years:, position:, measure:,
|
||||||
|
number_of_columns:, config:).score(academic_year:).average).to eq(3)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "reports sufficient data" do
|
||||||
|
expect(config.sufficient_student_responses?(measure:, school:, academic_year:)).to eq(true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when teacher responses exist" do
|
||||||
|
before :each do
|
||||||
|
create_list(:survey_item_response, 10, school:, academic_year:, survey_item: teacher_survey_item, likert_score: 5)
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when there are insufficient unknown students" do
|
||||||
|
it "reports a score of 3 when the average is 3" do
|
||||||
|
expect(GroupedBarColumnPresenter.new(school:, academic_years:, position:, measure:,
|
||||||
|
number_of_columns:, config:).score(academic_year:).average).to eq(nil)
|
||||||
|
end
|
||||||
|
it "reports insufficient data" do
|
||||||
|
expect(config.sufficient_student_responses?(measure:, school:, academic_year:)).to eq(false)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
context "when there are sufficient unknown students" do
|
||||||
|
before :each do
|
||||||
|
create_list(:survey_item_response, 10, school:, academic_year:, gender:, survey_item:)
|
||||||
|
end
|
||||||
|
it "reports a score of 3 when the average is 3" do
|
||||||
|
expect(GroupedBarColumnPresenter.new(school:, academic_years:, position:, measure:,
|
||||||
|
number_of_columns:, config:).score(academic_year:).average).to eq(3)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "reports sufficient data" do
|
||||||
|
expect(config.sufficient_student_responses?(measure:, school:, academic_year:)).to eq(true)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
@ -1,76 +0,0 @@
|
|||||||
require "rails_helper"
|
|
||||||
|
|
||||||
RSpec.describe Analyze::Graph::Column::GenderColumn::Unknown, type: :model do
|
|
||||||
let(:school) { create(:school) }
|
|
||||||
let(:academic_year) { create(:academic_year) }
|
|
||||||
let(:measure) { create(:measure) }
|
|
||||||
let(:academic_years) { [academic_year] }
|
|
||||||
let(:position) { 0 }
|
|
||||||
let(:number_of_columns) { 1 }
|
|
||||||
let(:gender) { create(:gender, qualtrics_code: 99) }
|
|
||||||
|
|
||||||
let(:subcategory) { create(:subcategory, subcategory_id: "1A") }
|
|
||||||
let(:measure) { create(:measure, measure_id: "1A-iii", subcategory:) }
|
|
||||||
let(:scale) { create(:student_scale, measure:) }
|
|
||||||
let(:survey_item) { create(:student_survey_item, scale:) }
|
|
||||||
let(:teacher_scale) { create(:teacher_scale, measure:) }
|
|
||||||
let(:teacher_survey_item) { create(:teacher_survey_item, scale:) }
|
|
||||||
|
|
||||||
context "when no teacher responses exist" do
|
|
||||||
context "when there are insufficient unknown students" do
|
|
||||||
it "reports a score of 3 when the average is 3" do
|
|
||||||
expect(Analyze::Graph::Column::GenderColumn::Unknown.new(school:, academic_years:, position:, measure:,
|
|
||||||
number_of_columns:).score(academic_year).average).to eq(nil)
|
|
||||||
end
|
|
||||||
it "reports insufficient data" do
|
|
||||||
expect(Analyze::Graph::Column::GenderColumn::Unknown.new(school:, academic_years:, position:, measure:,
|
|
||||||
number_of_columns:).sufficient_student_responses?(academic_year:)).to eq(false)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
context "when there are sufficient unknown students" do
|
|
||||||
before :each do
|
|
||||||
create_list(:survey_item_response, 10, school:, academic_year:, gender:, survey_item:)
|
|
||||||
end
|
|
||||||
it "reports a score of 3 when the average is 3" do
|
|
||||||
expect(Analyze::Graph::Column::GenderColumn::Unknown.new(school:, academic_years:, position:, measure:,
|
|
||||||
number_of_columns:).score(academic_year).average).to eq(3)
|
|
||||||
end
|
|
||||||
|
|
||||||
it "reports sufficient data" do
|
|
||||||
expect(Analyze::Graph::Column::GenderColumn::Unknown.new(school:, academic_years:, position:, measure:,
|
|
||||||
number_of_columns:).sufficient_student_responses?(academic_year:)).to eq(true)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context "when teacher responses exist" do
|
|
||||||
before :each do
|
|
||||||
create_list(:survey_item_response, 10, school:, academic_year:, survey_item: teacher_survey_item, likert_score: 5)
|
|
||||||
end
|
|
||||||
|
|
||||||
context "when there are insufficient unknown students" do
|
|
||||||
it "reports a score of 3 when the average is 3" do
|
|
||||||
expect(Analyze::Graph::Column::GenderColumn::Unknown.new(school:, academic_years:, position:, measure:,
|
|
||||||
number_of_columns:).score(academic_year).average).to eq(nil)
|
|
||||||
end
|
|
||||||
it "reports insufficient data" do
|
|
||||||
expect(Analyze::Graph::Column::GenderColumn::Unknown.new(school:, academic_years:, position:, measure:,
|
|
||||||
number_of_columns:).sufficient_student_responses?(academic_year:)).to eq(false)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
context "when there are sufficient unknown students" do
|
|
||||||
before :each do
|
|
||||||
create_list(:survey_item_response, 10, school:, academic_year:, gender:, survey_item:)
|
|
||||||
end
|
|
||||||
it "reports a score of 3 when the average is 3" do
|
|
||||||
expect(Analyze::Graph::Column::GenderColumn::Unknown.new(school:, academic_years:, position:, measure:,
|
|
||||||
number_of_columns:).score(academic_year).average).to eq(3)
|
|
||||||
end
|
|
||||||
|
|
||||||
it "reports sufficient data" do
|
|
||||||
expect(Analyze::Graph::Column::GenderColumn::Unknown.new(school:, academic_years:, position:, measure:,
|
|
||||||
number_of_columns:).sufficient_student_responses?(academic_year:)).to eq(true)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,47 +0,0 @@
|
|||||||
require 'rails_helper'
|
|
||||||
include Analyze::Graph::Column
|
|
||||||
|
|
||||||
describe AllAdmin do
|
|
||||||
let(:measure_without_admin) { create(:measure) }
|
|
||||||
let(:measure_with_admin) { create(:measure, :with_admin_data_items) }
|
|
||||||
let(:school) { create(:school) }
|
|
||||||
let(:academic_years) { [create(:academic_year)] }
|
|
||||||
let(:position) { 1 }
|
|
||||||
let(:number_of_columns) { 1 }
|
|
||||||
|
|
||||||
context '.show_irrelevancy_message?' do
|
|
||||||
it 'returns true when the measure does NOT include admin data items' do
|
|
||||||
expect(AllAdmin.new(measure: measure_without_admin, school:, academic_years:, position:,
|
|
||||||
number_of_columns:).show_irrelevancy_message?).to eq true
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'returns false when the measure includes admin data items' do
|
|
||||||
expect(AllAdmin.new(measure: measure_with_admin, school:, academic_years:, position:,
|
|
||||||
number_of_columns:).show_irrelevancy_message?).to eq false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context '.show_insufficient_data_message?' do
|
|
||||||
context 'when the measure DOES NOT include admin data items' do
|
|
||||||
it 'returns true ' do
|
|
||||||
expect(AllAdmin.new(measure: measure_without_admin, school:, academic_years:, position:,
|
|
||||||
number_of_columns:).show_insufficient_data_message?).to eq true
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'returns true when the measure does include admin data items but there are not values assigned to the admin' do
|
|
||||||
expect(AllAdmin.new(measure: measure_with_admin, school:, academic_years:, position:,
|
|
||||||
number_of_columns:).show_insufficient_data_message?).to eq true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'when the measure Does include admin data items' do
|
|
||||||
it 'and has at least one value to show, it will return false' do
|
|
||||||
admin_data_item = measure_with_admin.scales.first.admin_data_items.first
|
|
||||||
create(:admin_data_value, admin_data_item:, school:, academic_year: academic_years.first)
|
|
||||||
|
|
||||||
expect(AllAdmin.new(measure: measure_with_admin, school:, academic_years:, position:,
|
|
||||||
number_of_columns:).show_insufficient_data_message?).to eq false
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,45 +0,0 @@
|
|||||||
require 'rails_helper'
|
|
||||||
include Analyze::Graph
|
|
||||||
include Analyze::Graph::Column::GenderColumn
|
|
||||||
describe StudentsByRace do
|
|
||||||
let(:female) { create(:gender, qualtrics_code: 1, designation: 'Female') }
|
|
||||||
let(:school) { create(:school) }
|
|
||||||
let(:academic_year) { create(:academic_year, range: '1900-01') }
|
|
||||||
let(:academic_years) { [academic_year] }
|
|
||||||
let(:year_index) { academic_years.find_index(academic_year) }
|
|
||||||
|
|
||||||
let(:measure_with_student_survey_items) { create(:measure, name: 'Student measure') }
|
|
||||||
let(:scale_with_student_survey_item) { create(:student_scale, measure: measure_with_student_survey_items) }
|
|
||||||
let(:student_survey_item) do
|
|
||||||
create(:student_survey_item, scale: scale_with_student_survey_item)
|
|
||||||
end
|
|
||||||
|
|
||||||
before do
|
|
||||||
create_list(:survey_item_response, 1, survey_item: student_survey_item, school:, academic_year:, gender: female)
|
|
||||||
end
|
|
||||||
|
|
||||||
context '.gender' do
|
|
||||||
it 'returns female gender' do
|
|
||||||
expect(Female.new(measure: measure_with_student_survey_items, school:, academic_years:, position: year_index,
|
|
||||||
number_of_columns: 1).gender).to eq female
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'returns the count of survey items for females for that school and academic_year ' do
|
|
||||||
female_column = Female.new(measure: measure_with_student_survey_items, school:, academic_years:, position: year_index,
|
|
||||||
number_of_columns: 1)
|
|
||||||
expect(female_column.sufficient_student_responses?(academic_year:)).to eq false
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'when there are more than 10 students who responded' do
|
|
||||||
before do
|
|
||||||
create_list(:survey_item_response, 10, survey_item: student_survey_item, school:, academic_year:,
|
|
||||||
gender: female)
|
|
||||||
end
|
|
||||||
it 'returns the count of survey items for females for that school and academic_year ' do
|
|
||||||
female_column = Female.new(measure: measure_with_student_survey_items, school:, academic_years:, position: year_index,
|
|
||||||
number_of_columns: 1)
|
|
||||||
expect(female_column.sufficient_student_responses?(academic_year:)).to eq true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@ -1,23 +1,23 @@
|
|||||||
require 'rails_helper'
|
require 'rails_helper'
|
||||||
include Analyze::Graph
|
include Analyze::Graph
|
||||||
include Analyze::Graph::Column
|
include Analyze::Graph::Column
|
||||||
include Analyze::Graph::Column::RaceColumn
|
|
||||||
describe StudentsByRace do
|
describe StudentsByRace do
|
||||||
let(:american_indian) { create(:race, qualtrics_code: 1) }
|
let(:american_indian) { create(:race, designation: "american indian", qualtrics_code: 1) }
|
||||||
let(:asian) { create(:race, qualtrics_code: 2) }
|
let(:asian) { create(:race, designation: "asian", qualtrics_code: 2) }
|
||||||
let(:black) { create(:race, qualtrics_code: 3) }
|
let(:black) { create(:race, designation: "black", qualtrics_code: 3) }
|
||||||
let(:hispanic) { create(:race, qualtrics_code: 4) }
|
let(:hispanic) { create(:race, designation: "hispanic", qualtrics_code: 4) }
|
||||||
let(:white) { create(:race, qualtrics_code: 5) }
|
let(:white) { create(:race, designation: "white", qualtrics_code: 5) }
|
||||||
let(:unknown) { create(:race, qualtrics_code: 99) }
|
let(:unknown) { create(:race, designation: "unknown", qualtrics_code: 99) }
|
||||||
let(:multiracial) { create(:race, qualtrics_code: 100) }
|
let(:multiracial) { create(:race, designation: "multiracial", qualtrics_code: 100) }
|
||||||
context 'when initialized with a list of races' do
|
context 'when initialized with a list of races' do
|
||||||
it 'generates corresponding race columns' do
|
it 'generates corresponding race columns' do
|
||||||
races = [american_indian]
|
races = [american_indian]
|
||||||
expect(StudentsByRace.new(races:).columns).to eq [AmericanIndian, AllStudent]
|
expect(StudentsByRace.new(races:).columns.map(&:label).map { |words| words.join(" ") }).to eq ["american indian", "All Students"]
|
||||||
races = [american_indian, asian]
|
races = [american_indian, asian]
|
||||||
expect(StudentsByRace.new(races:).columns).to eq [AmericanIndian, Asian, AllStudent]
|
expect(StudentsByRace.new(races:).columns.map(&:label).map { |words| words.join(" ") }).to eq ["american indian", "asian", "All Students"]
|
||||||
races = [black, hispanic, multiracial]
|
races = [black, hispanic, multiracial]
|
||||||
expect(StudentsByRace.new(races:).columns).to eq [Black, Hispanic, Multiracial, AllStudent]
|
expect(StudentsByRace.new(races:).columns.map(&:label).map { |words| words.join(" ") }).to eq ["black", "hispanic", "multiracial", "All Students"]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Loading…
Reference in new issue