parent
7f0faf8917
commit
7d7bee6498
@ -0,0 +1,32 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Analyze
|
||||
module Graph
|
||||
module Column
|
||||
module Gender
|
||||
class Female < GroupedBarColumnPresenter
|
||||
include Analyze::Graph::Column::Gender::ScoreForGender
|
||||
def label
|
||||
'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
|
||||
@ -0,0 +1,32 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Analyze
|
||||
module Graph
|
||||
module Column
|
||||
module Gender
|
||||
class Male < GroupedBarColumnPresenter
|
||||
include Analyze::Graph::Column::Gender::ScoreForGender
|
||||
def label
|
||||
'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
|
||||
@ -0,0 +1,32 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Analyze
|
||||
module Graph
|
||||
module Column
|
||||
module Gender
|
||||
class NonBinary < GroupedBarColumnPresenter
|
||||
include Analyze::Graph::Column::Gender::ScoreForGender
|
||||
def label
|
||||
'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
|
||||
@ -0,0 +1,39 @@
|
||||
module Analyze
|
||||
module Graph
|
||||
module Column
|
||||
module Gender
|
||||
module ScoreForGender
|
||||
def score(year_index)
|
||||
academic_year = academic_years[year_index]
|
||||
averages = SurveyItemResponse.averages_for_gender(measure.student_survey_items, school, academic_year, gender)
|
||||
average = bubble_up_averages(averages:)
|
||||
|
||||
scorify(average:, meets_student_threshold: sufficient_student_responses?(academic_year:))
|
||||
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 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:)
|
||||
yearly_counts = SurveyItemResponse.where(school: , academic_year: , gender:).group(:gender).select(:response_id).distinct(:response_id).count
|
||||
yearly_counts.first[1] >= 10
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -0,0 +1,32 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Analyze
|
||||
module Graph
|
||||
module Column
|
||||
module Gender
|
||||
class Unknown < GroupedBarColumnPresenter
|
||||
include Analyze::Graph::Column::Gender::ScoreForGender
|
||||
def label
|
||||
'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,42 @@
|
||||
module Analyze
|
||||
module Graph
|
||||
class StudentsByGender
|
||||
include Analyze::Graph::Column::Gender
|
||||
attr_reader :genders
|
||||
|
||||
def initialize(genders:)
|
||||
@genders = genders
|
||||
end
|
||||
|
||||
def to_s
|
||||
'Students by Gender'
|
||||
end
|
||||
|
||||
def slug
|
||||
'students-by-gender'
|
||||
end
|
||||
|
||||
def columns
|
||||
[].tap do |array|
|
||||
genders.each do |gender|
|
||||
array << column_for_gender_code(code: gender.qualtrics_code)
|
||||
end
|
||||
array << Analyze::Graph::Column::AllStudent
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def column_for_gender_code(code:)
|
||||
CFR[code]
|
||||
end
|
||||
|
||||
CFR = {
|
||||
1 => Analyze::Graph::Column::Gender::Female,
|
||||
2 => Analyze::Graph::Column::Gender::Male,
|
||||
4 => Analyze::Graph::Column::Gender::NonBinary,
|
||||
99 => Analyze::Graph::Column::Gender::Unknown
|
||||
}.freeze
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,45 @@
|
||||
require 'rails_helper'
|
||||
include Analyze::Graph
|
||||
include Analyze::Graph::Column::Gender
|
||||
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
|
||||
Loading…
Reference in new issue