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