mirror of
https://github.com/edcommonwealth/sqm-dashboards.git
synced 2026-03-10 07:50:33 -07:00
implement suggestions from static code analysis tools
This commit is contained in:
parent
bb5f668497
commit
e89358dacc
21 changed files with 252 additions and 121 deletions
|
|
@ -1,12 +1,11 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class AnalyzeController < SqmApplicationController
|
||||
def index
|
||||
assign_categories
|
||||
assign_subcategories
|
||||
assign_measures
|
||||
assign_academic_years
|
||||
end
|
||||
before_action :assign_categories, :assign_subcategories, :assign_measures, :assign_academic_years,
|
||||
:response_rate_timestamp, only: [:index]
|
||||
def index; end
|
||||
|
||||
private
|
||||
|
||||
def assign_categories
|
||||
@category ||= Category.find_by_category_id(params[:category])
|
||||
|
|
@ -21,16 +20,29 @@ class AnalyzeController < SqmApplicationController
|
|||
end
|
||||
|
||||
def assign_measures
|
||||
@measures = @subcategory.measures.order(:measure_id).includes(%i[subcategory])
|
||||
@measures = @subcategory.measures.order(:measure_id).includes(%i[admin_data_items subcategory])
|
||||
end
|
||||
|
||||
def assign_academic_years
|
||||
@available_academic_years = AcademicYear.order(:range).all
|
||||
@academic_year_params = params[:academic_years].split(',') if params[:academic_years]
|
||||
year_params = params[:academic_years]
|
||||
@academic_year_params = year_params.split(',') if year_params
|
||||
@selected_academic_years = []
|
||||
@academic_year_params ||= []
|
||||
@academic_year_params.each do |year|
|
||||
@selected_academic_years << AcademicYear.find_by_range(year)
|
||||
end
|
||||
end
|
||||
|
||||
def response_rate_timestamp
|
||||
@response_rate_timestamp = begin
|
||||
academic_year = @selected_academic_years.last
|
||||
academic_year ||= @academic_year
|
||||
rate = ResponseRate.where(school: @school,
|
||||
academic_year:).order(updated_at: :DESC).first || Today.new
|
||||
|
||||
rate.updated_at
|
||||
end
|
||||
@response_rate_timestamp
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -1,10 +1,24 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class CategoriesController < SqmApplicationController
|
||||
before_action :response_rate_timestamp, only: [:index]
|
||||
helper GaugeHelper
|
||||
|
||||
def show
|
||||
@categories = Category.sorted.map { |category| CategoryPresenter.new(category:) }
|
||||
|
||||
@category = CategoryPresenter.new(category: Category.find_by_slug(params[:id]))
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def response_rate_timestamp
|
||||
@response_rate_timestamp = begin
|
||||
rate = ResponseRate.where(school: @school,
|
||||
academic_year: @academic_year).order(updated_at: :DESC).first || Today.new
|
||||
|
||||
rate.updated_at
|
||||
end
|
||||
@response_rate_timestamp
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
class OverviewController < SqmApplicationController
|
||||
before_action :check_empty_dataset, only: [:index]
|
||||
before_action :response_rate_timestamp, only: [:index]
|
||||
helper VarianceHelper
|
||||
|
||||
def index
|
||||
|
|
@ -31,4 +32,14 @@ class OverviewController < SqmApplicationController
|
|||
def subcategories
|
||||
@subcategories ||= Subcategory.all
|
||||
end
|
||||
|
||||
def response_rate_timestamp
|
||||
@response_rate_timestamp = begin
|
||||
rate = ResponseRate.where(school: @school,
|
||||
academic_year: @academic_year).order(updated_at: :DESC).first || Today.new
|
||||
|
||||
rate.updated_at
|
||||
end
|
||||
@response_rate_timestamp
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
class SqmApplicationController < ApplicationController
|
||||
protect_from_forgery with: :exception, prepend: true
|
||||
before_action :set_schools_and_districts
|
||||
before_action :response_rate_timestamp
|
||||
helper HeaderHelper
|
||||
|
||||
private
|
||||
|
|
|
|||
|
|
@ -62,7 +62,8 @@ module AnalyzeHelper
|
|||
end
|
||||
|
||||
def analyze_category_link(district:, school:, academic_year:, category:)
|
||||
"/districts/#{district.slug}/schools/#{school.slug}/analyze?year=#{academic_year.range}&academic_years=#{academic_year.range}&category=#{category.category_id}"
|
||||
year = academic_year.range
|
||||
"/districts/#{district.slug}/schools/#{school.slug}/analyze?year=#{year}&academic_years=#{year}&category=#{category.category_id}"
|
||||
end
|
||||
|
||||
def analyze_subcategory_link(district:, school:, academic_year:, category:, subcategory:)
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
Point = Struct.new(:x, :y)
|
||||
Rect = Struct.new(:x, :y, :width, :height)
|
||||
|
||||
|
|
@ -14,15 +16,29 @@ module GaugeHelper
|
|||
1
|
||||
end
|
||||
|
||||
def effective_radius
|
||||
outer_radius + stroke_width
|
||||
end
|
||||
|
||||
def diameter
|
||||
2 * effective_radius
|
||||
end
|
||||
|
||||
def width
|
||||
diameter
|
||||
end
|
||||
|
||||
def height
|
||||
outer_radius + 2 * stroke_width + key_benchmark_indicator_gutter
|
||||
end
|
||||
|
||||
def key_benchmark_indicator_gutter
|
||||
10
|
||||
end
|
||||
|
||||
def viewbox
|
||||
x = arc_center.x - (outer_radius + stroke_width)
|
||||
y = arc_center.y - (outer_radius + stroke_width) - key_benchmark_indicator_gutter
|
||||
width = 2 * (outer_radius + stroke_width)
|
||||
height = outer_radius + 2 * stroke_width + key_benchmark_indicator_gutter
|
||||
x = arc_center.x - effective_radius
|
||||
y = arc_center.y - effective_radius - key_benchmark_indicator_gutter
|
||||
Rect.new(x, y, width, height)
|
||||
end
|
||||
|
||||
|
|
@ -47,8 +63,9 @@ module GaugeHelper
|
|||
end
|
||||
|
||||
def arc_end_line_destination(radius:, percentage:)
|
||||
x = arc_center.x + radius * Math.cos(angle_for(percentage:))
|
||||
y = arc_center.y + radius * Math.sin(angle_for(percentage:))
|
||||
angle = angle_for(percentage:)
|
||||
x = arc_center.x + radius * Math.cos(angle)
|
||||
y = arc_center.y + radius * Math.sin(angle)
|
||||
Point.new(x, y)
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module HeaderHelper
|
||||
def link_to_overview(district:, school:, academic_year:)
|
||||
"/districts/#{district.slug}/schools/#{school.slug}/overview?year=#{academic_year.range}"
|
||||
|
|
@ -8,7 +10,8 @@ module HeaderHelper
|
|||
end
|
||||
|
||||
def link_to_analyze(district:, school:, academic_year:)
|
||||
"/districts/#{district.slug}/schools/#{school.slug}/analyze?year=#{academic_year.range}&category=1&academic_years=#{academic_year.range}"
|
||||
year = academic_year.range
|
||||
"/districts/#{district.slug}/schools/#{school.slug}/analyze?year=#{year}&category=1&academic_years=#{year}"
|
||||
end
|
||||
|
||||
def district_url_for(district:, academic_year:)
|
||||
|
|
@ -42,8 +45,10 @@ module HeaderHelper
|
|||
end
|
||||
|
||||
def latest_year(school)
|
||||
latest_response_rate = ResponseRate.where(school:).where('meets_student_threshold = ? or meets_teacher_threshold = ?', true,
|
||||
true).joins('inner join academic_years a on response_rates.academic_year_id=a.id').order('a.range DESC').first
|
||||
latest_response_rate = ResponseRate.where(school:)
|
||||
.where('meets_student_threshold = ? or meets_teacher_threshold = ?', true, true)
|
||||
.joins('inner join academic_years a on response_rates.academic_year_id=a.id')
|
||||
.order('a.range DESC').first
|
||||
academic_year = latest_response_rate.academic_year if latest_response_rate.present?
|
||||
|
||||
academic_year || AcademicYear.order('range DESC').first
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module SchedulesHelper
|
||||
def options_for_frequency_hours
|
||||
[
|
||||
|
|
|
|||
|
|
@ -51,19 +51,17 @@ class Measure < ActiveRecord::Base
|
|||
@includes_admin_data_items ||= admin_data_items.any?
|
||||
end
|
||||
|
||||
def sources
|
||||
@sources ||= begin
|
||||
sources = []
|
||||
sources << :admin_data if includes_admin_data_items?
|
||||
sources << :student_surveys if includes_student_survey_items?
|
||||
sources << :teacher_surveys if includes_teacher_survey_items?
|
||||
sources
|
||||
end
|
||||
end
|
||||
# def sources
|
||||
# @sources ||= begin
|
||||
# sources = []
|
||||
# sources << Source.new(name: :admin_data, collection: admin_data_items) if includes_admin_data_items?
|
||||
# sources << Source.new(name: :student_surveys, collection: student_survey_items) if includes_student_survey_items?
|
||||
# sources << Source.new(name: :teacher_surveys, collection: teacher_survey_items) if includes_teacher_survey_items?
|
||||
# sources
|
||||
# end
|
||||
# end
|
||||
|
||||
def score(school:, academic_year:)
|
||||
# average = SurveyItemResponse.where(school:, academic_year:).first
|
||||
# Score.new(average, false, false, false)
|
||||
@score ||= Hash.new do |memo, (school, academic_year)|
|
||||
next Score::NIL_SCORE if incalculable_score(school:, academic_year:)
|
||||
|
||||
|
|
@ -149,9 +147,9 @@ class Measure < ActiveRecord::Base
|
|||
def collect_survey_item_average(survey_items:, school:, academic_year:)
|
||||
@collect_survey_item_average ||= Hash.new do |memo, (survey_items, school, academic_year)|
|
||||
averages = survey_items.map do |survey_item|
|
||||
grouped_responses(school:, academic_year:)[survey_item] || 0
|
||||
grouped_responses(school:, academic_year:)[survey_item]
|
||||
end.remove_blanks
|
||||
memo[[survey_items, school, academic_year]] = averages.any? ? averages.average : 0
|
||||
memo[[survey_items, school, academic_year]] = averages.average || 0
|
||||
end
|
||||
@collect_survey_item_average[[survey_items, school, academic_year]]
|
||||
end
|
||||
|
|
@ -210,8 +208,7 @@ class Measure < ActiveRecord::Base
|
|||
def no_teacher_responses_exist?(school:, academic_year:)
|
||||
@no_teacher_responses_exist ||= Hash.new do |memo, (school, academic_year)|
|
||||
memo[[school, academic_year]] = teacher_survey_items.all? do |survey_item|
|
||||
survey_item.survey_item_responses.where(school:,
|
||||
academic_year:).none?
|
||||
survey_item.survey_item_responses.where(school:, academic_year:).none?
|
||||
end
|
||||
end
|
||||
@no_teacher_responses_exist[[school, academic_year]]
|
||||
|
|
@ -219,9 +216,8 @@ class Measure < ActiveRecord::Base
|
|||
|
||||
def incalculable_score(school:, academic_year:)
|
||||
@incalculable_score ||= Hash.new do |memo, (school, academic_year)|
|
||||
meets_student_threshold = sufficient_student_data?(school:, academic_year:)
|
||||
meets_teacher_threshold = sufficient_teacher_data?(school:, academic_year:)
|
||||
lacks_sufficient_survey_data = !meets_student_threshold && !meets_teacher_threshold
|
||||
lacks_sufficient_survey_data = !sufficient_student_data?(school:, academic_year:) &&
|
||||
!sufficient_teacher_data?(school:, academic_year:)
|
||||
memo[[school, academic_year]] = lacks_sufficient_survey_data && !includes_admin_data_items?
|
||||
end
|
||||
|
||||
|
|
@ -247,8 +243,8 @@ class Measure < ActiveRecord::Base
|
|||
|
||||
def student_average(school:, academic_year:)
|
||||
@student_average ||= Hash.new do |memo, (school, academic_year)|
|
||||
memo[[school, academic_year]] = collect_survey_item_average(survey_items: student_survey_items_by_survey_type(school:, academic_year:), school:,
|
||||
academic_year:)
|
||||
survey_items = student_survey_items_by_survey_type(school:, academic_year:)
|
||||
memo[[school, academic_year]] = collect_survey_item_average(survey_items:, school:, academic_year:)
|
||||
end
|
||||
@student_average[[school, academic_year]]
|
||||
end
|
||||
|
|
|
|||
|
|
@ -12,16 +12,13 @@ module ResponseRateCalculator
|
|||
end
|
||||
|
||||
def rate
|
||||
return 100 if Respondent.where(school: @school, academic_year: @academic_year).count.zero?
|
||||
return 100 if population_data_unavailable?
|
||||
|
||||
return 0 unless survey_item_count.positive?
|
||||
|
||||
average_responses_per_survey_item = response_count / survey_item_count.to_f
|
||||
|
||||
return 0 unless total_possible_responses.positive?
|
||||
|
||||
response_rate = (average_responses_per_survey_item / total_possible_responses.to_f * 100).round
|
||||
cap_at_one_hundred(response_rate)
|
||||
cap_at_one_hundred(raw_response_rate)
|
||||
end
|
||||
|
||||
def meets_student_threshold?
|
||||
|
|
@ -37,4 +34,20 @@ module ResponseRateCalculator
|
|||
def cap_at_one_hundred(response_rate)
|
||||
response_rate > 100 ? 100 : response_rate
|
||||
end
|
||||
|
||||
def survey
|
||||
Survey.find_by(school:, academic_year:)
|
||||
end
|
||||
|
||||
def raw_response_rate
|
||||
(average_responses_per_survey_item / total_possible_responses.to_f * 100).round
|
||||
end
|
||||
|
||||
def average_responses_per_survey_item
|
||||
response_count / survey_item_count.to_f
|
||||
end
|
||||
|
||||
def population_data_unavailable?
|
||||
Respondent.where(school: @school, academic_year: @academic_year).count.zero?
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -7,8 +7,6 @@ class StudentResponseRateCalculator
|
|||
|
||||
def survey_item_count
|
||||
@survey_item_count ||= begin
|
||||
survey = Survey.find_by(school:, academic_year:)
|
||||
|
||||
survey_items = SurveyItem.includes(%i[scale
|
||||
measure]).student_survey_items.where("scale.measure": @subcategory.measures)
|
||||
survey_items = survey_items.where(on_short_form: true) if survey.form == 'short'
|
||||
|
|
@ -22,7 +20,6 @@ class StudentResponseRateCalculator
|
|||
def response_count
|
||||
@response_count ||= @subcategory.measures.map do |measure|
|
||||
measure.student_survey_items.map do |survey_item|
|
||||
survey = Survey.find_by(school:, academic_year:)
|
||||
next 0 if survey.form == 'short' && survey_item.on_short_form == false
|
||||
|
||||
survey_item.survey_item_responses.where(school:,
|
||||
|
|
|
|||
|
|
@ -18,11 +18,7 @@ class Subcategory < ActiveRecord::Base
|
|||
memo[[school, academic_year]] = ResponseRate.find_by(subcategory: self, school:, academic_year:)
|
||||
end
|
||||
|
||||
if @response_rate[[school, academic_year]].nil?
|
||||
@response_rate[[school, academic_year]] = create_response_rate(school:, academic_year:)
|
||||
end
|
||||
|
||||
@response_rate[[school, academic_year]]
|
||||
@response_rate[[school, academic_year]] || create_response_rate(school:, academic_year:)
|
||||
end
|
||||
|
||||
private
|
||||
|
|
|
|||
7
app/models/today.rb
Normal file
7
app/models/today.rb
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class Today
|
||||
def updated_at
|
||||
Date.today
|
||||
end
|
||||
end
|
||||
|
|
@ -29,20 +29,7 @@ class AnalyzeBarPresenter
|
|||
end
|
||||
|
||||
def bar_height_percentage
|
||||
bar_height = case zone.type
|
||||
when :ideal
|
||||
(percentage * zone_height_percentage + zone_height_percentage) * 100
|
||||
when :approval
|
||||
(percentage * zone_height_percentage) * 100
|
||||
when :growth
|
||||
((1 - percentage) * zone_height_percentage) * 100
|
||||
when :watch
|
||||
((1 - percentage) * zone_height_percentage + zone_height_percentage) * 100
|
||||
when :warning
|
||||
((1 - percentage) * zone_height_percentage + zone_height_percentage + zone_height_percentage) * 100
|
||||
else
|
||||
0.0
|
||||
end
|
||||
bar_height = send("#{zone.type}_bar_height_percentage") || 0
|
||||
enforce_minimum_height(bar_height:)
|
||||
end
|
||||
|
||||
|
|
@ -73,4 +60,24 @@ class AnalyzeBarPresenter
|
|||
def enforce_minimum_height(bar_height:)
|
||||
bar_height < MINIMUM_BAR_HEIGHT ? MINIMUM_BAR_HEIGHT : bar_height
|
||||
end
|
||||
|
||||
def ideal_bar_height_percentage
|
||||
(percentage * zone_height_percentage + zone_height_percentage) * 100
|
||||
end
|
||||
|
||||
def approval_bar_height_percentage
|
||||
(percentage * zone_height_percentage) * 100
|
||||
end
|
||||
|
||||
def growth_bar_height_percentage
|
||||
((1 - percentage) * zone_height_percentage) * 100
|
||||
end
|
||||
|
||||
def watch_bar_height_percentage
|
||||
((1 - percentage) * zone_height_percentage + zone_height_percentage) * 100
|
||||
end
|
||||
|
||||
def warning_bar_height_percentage
|
||||
((1 - percentage) * zone_height_percentage + zone_height_percentage + zone_height_percentage) * 100
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -72,20 +72,31 @@ class VarianceChartRowPresenter
|
|||
WARNING_ZONE_WIDTH_PERCENTAGE = 0.2
|
||||
|
||||
def bar_width_percentage
|
||||
case zone.type
|
||||
when :ideal
|
||||
percentage * IDEAL_ZONE_WIDTH_PERCENTAGE + APPROVAL_ZONE_WIDTH_PERCENTAGE
|
||||
when :approval
|
||||
percentage * APPROVAL_ZONE_WIDTH_PERCENTAGE
|
||||
when :growth
|
||||
(1 - percentage) * GROWTH_ZONE_WIDTH_PERCENTAGE
|
||||
when :watch
|
||||
(1 - percentage) * WATCH_ZONE_WIDTH_PERCENTAGE + GROWTH_ZONE_WIDTH_PERCENTAGE
|
||||
when :warning
|
||||
(1 - percentage) * WARNING_ZONE_WIDTH_PERCENTAGE + WATCH_ZONE_WIDTH_PERCENTAGE + GROWTH_ZONE_WIDTH_PERCENTAGE
|
||||
else
|
||||
0.0
|
||||
end
|
||||
send("#{zone.type}_bar_width_percentage")
|
||||
end
|
||||
|
||||
def ideal_bar_width_percentage
|
||||
percentage * IDEAL_ZONE_WIDTH_PERCENTAGE + APPROVAL_ZONE_WIDTH_PERCENTAGE
|
||||
end
|
||||
|
||||
def approval_bar_width_percentage
|
||||
percentage * APPROVAL_ZONE_WIDTH_PERCENTAGE
|
||||
end
|
||||
|
||||
def growth_bar_width_percentage
|
||||
(1 - percentage) * GROWTH_ZONE_WIDTH_PERCENTAGE
|
||||
end
|
||||
|
||||
def watch_bar_width_percentage
|
||||
(1 - percentage) * WATCH_ZONE_WIDTH_PERCENTAGE + GROWTH_ZONE_WIDTH_PERCENTAGE
|
||||
end
|
||||
|
||||
def warning_bar_width_percentage
|
||||
(1 - percentage) * WARNING_ZONE_WIDTH_PERCENTAGE + WATCH_ZONE_WIDTH_PERCENTAGE + GROWTH_ZONE_WIDTH_PERCENTAGE
|
||||
end
|
||||
|
||||
def insufficient_data_bar_width_percentage
|
||||
0
|
||||
end
|
||||
|
||||
def percentage
|
||||
|
|
|
|||
|
|
@ -2,28 +2,46 @@
|
|||
|
||||
class ResponseRateLoader
|
||||
def self.reset(schools: School.all, academic_years: AcademicYear.all, subcategories: Subcategory.all)
|
||||
milford = School.find_by_slug 'milford-high-school'
|
||||
test_year = AcademicYear.find_by_range '2020-21'
|
||||
|
||||
subcategories.each do |subcategory|
|
||||
schools.each do |school|
|
||||
next if ENV['RAILS_ENV'] == 'test' && !(school == milford)
|
||||
next if rails_env == 'test' && (school != milford)
|
||||
|
||||
academic_years.each do |academic_year|
|
||||
next if ENV['RAILS_ENV'] == 'test' && !(academic_year == test_year)
|
||||
next if rails_env == 'test' && (academic_year != test_year)
|
||||
|
||||
student = StudentResponseRateCalculator.new(subcategory:, school:, academic_year:)
|
||||
teacher = TeacherResponseRateCalculator.new(subcategory:, school:, academic_year:)
|
||||
|
||||
response_rate = ResponseRate.find_or_create_by!(subcategory:, school:, academic_year:)
|
||||
|
||||
response_rate.student_response_rate = student.rate
|
||||
response_rate.teacher_response_rate = teacher.rate
|
||||
response_rate.meets_student_threshold = student.meets_student_threshold?
|
||||
response_rate.meets_teacher_threshold = teacher.meets_teacher_threshold?
|
||||
response_rate.save
|
||||
process_response_rate(subcategory:, school:, academic_year:)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def self.milford
|
||||
School.find_by_slug 'milford-high-school'
|
||||
end
|
||||
|
||||
def self.test_year
|
||||
AcademicYear.find_by_range '2020-21'
|
||||
end
|
||||
|
||||
def self.rails_env
|
||||
@rails_env ||= ENV['RAILS_ENV']
|
||||
end
|
||||
|
||||
def self.process_response_rate(subcategory:, school:, academic_year:)
|
||||
student = StudentResponseRateCalculator.new(subcategory:, school:, academic_year:)
|
||||
teacher = TeacherResponseRateCalculator.new(subcategory:, school:, academic_year:)
|
||||
|
||||
response_rate = ResponseRate.find_or_create_by!(subcategory:, school:, academic_year:)
|
||||
|
||||
response_rate.update!(student_response_rate: student.rate, teacher_response_rate: teacher.rate,
|
||||
meets_student_threshold: student.meets_student_threshold?,
|
||||
meets_teacher_threshold: teacher.meets_teacher_threshold?)
|
||||
end
|
||||
|
||||
private_class_method :milford
|
||||
private_class_method :test_year
|
||||
private_class_method :rails_env
|
||||
private_class_method :process_response_rate
|
||||
end
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@
|
|||
<% end %>
|
||||
</div>
|
||||
|
||||
<% cache [@subcategory, @school, @selected_academic_years] do %>
|
||||
<% cache [@subcategory, @school, @selected_academic_years, @response_rate_timestamp] do %>
|
||||
<div class="bg-color-white flex-grow-1 col-9">
|
||||
<% @measures.each do |measure|%>
|
||||
<section class="mb-6" >
|
||||
|
|
|
|||
|
|
@ -65,7 +65,7 @@
|
|||
</svg>
|
||||
<% end %>
|
||||
|
||||
<% cache [@school, @academic_year, ResponseRate.where(school: @school, academic_year: @academic_year).order(updated_at: :DESC).first.updated_at] do %>
|
||||
<% cache [@school, @academic_year, @response_rate_timestamp] do %>
|
||||
<div class="card">
|
||||
<div class="d-flex justify-content-between align-items-center">
|
||||
<h2 class="sub-header-2">School Quality Framework Indicators</h2>
|
||||
|
|
|
|||
|
|
@ -1,10 +1,12 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module ArrayMonkeyPatches
|
||||
def average
|
||||
sum.to_f / size
|
||||
end
|
||||
|
||||
def remove_blanks
|
||||
reject { |item| item == 0 || item.to_f.nan? }
|
||||
reject { |item| item.nil? || item.to_f.nan? || item.zero? }
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ RSpec.describe Measure, type: :model do
|
|||
let(:student_scale) { create(:student_scale, measure:) }
|
||||
let(:admin_scale) { create(:admin_scale, measure:) }
|
||||
let(:school) { create(:school) }
|
||||
let(:short_form_school){ create(:school)}
|
||||
let(:short_form_school) { create(:school) }
|
||||
let(:academic_year) { create(:academic_year) }
|
||||
|
||||
let(:admin_watch_low_benchmark) { 2.0 }
|
||||
|
|
@ -29,7 +29,7 @@ RSpec.describe Measure, type: :model do
|
|||
create(:respondent, school:, academic_year:)
|
||||
create(:survey, school:, academic_year:)
|
||||
create(:respondent, school: short_form_school, academic_year:)
|
||||
create(:survey, school: short_form_school, academic_year:, form: "short")
|
||||
create(:survey, school: short_form_school, academic_year:, form: 'short')
|
||||
end
|
||||
|
||||
describe 'benchmarks' do
|
||||
|
|
@ -45,9 +45,9 @@ RSpec.describe Measure, type: :model do
|
|||
expect(measure.watch_low_benchmark).to be 2.0
|
||||
end
|
||||
|
||||
it 'returns the source as an admin_data_item' do
|
||||
expect(measure.sources).to eq [:admin_data]
|
||||
end
|
||||
# it 'returns the source as an admin_data_item' do
|
||||
# expect(measure.sources).to eq [Source.new(name: :admin_data, collection: measure.admin_data_items)]
|
||||
# end
|
||||
end
|
||||
|
||||
context 'when a measure includes only student survey items' do
|
||||
|
|
@ -64,9 +64,9 @@ RSpec.describe Measure, type: :model do
|
|||
it 'returns a warning low benchmark equal to the student survey item warning low benchmark ' do
|
||||
expect(measure.warning_low_benchmark).to eq 1
|
||||
end
|
||||
it 'returns the source as student_surveys' do
|
||||
expect(measure.sources).to eq [:student_surveys]
|
||||
end
|
||||
# it 'returns the source as student_surveys' do
|
||||
# expect(measure.sources).to eq [Source.new(name: :student_surveys, collection: measure.student_survey_items)]
|
||||
# end
|
||||
end
|
||||
|
||||
context 'when a measure includes only teacher survey items' do
|
||||
|
|
@ -83,9 +83,9 @@ RSpec.describe Measure, type: :model do
|
|||
it 'returns a warning low benchmark equal to the teacher survey item warning low benchmark ' do
|
||||
expect(measure.warning_low_benchmark).to eq 1
|
||||
end
|
||||
it 'returns the source as teacher_surveys' do
|
||||
expect(measure.sources).to eq [:teacher_surveys]
|
||||
end
|
||||
# it 'returns the source as teacher_surveys' do
|
||||
# expect(measure.sources).to eq [Source.new(name: :teacher_surveys, collection: measure.teacher_survey_items)]
|
||||
# end
|
||||
end
|
||||
|
||||
context 'when a measure includes admin data and student survey items' do
|
||||
|
|
@ -107,9 +107,10 @@ RSpec.describe Measure, type: :model do
|
|||
# (2*3 + 1.5)/4
|
||||
expect(measure.watch_low_benchmark).to be 1.875
|
||||
end
|
||||
it 'returns the source as admin and student survey items' do
|
||||
expect(measure.sources).to eq %i[admin_data student_surveys]
|
||||
end
|
||||
# it 'returns the source as admin and student survey items' do
|
||||
# expect(measure.sources).to eq [Source.new(name: :admin_data, collection: measure.admin_data_items),
|
||||
# Source.new(name: :student_surveys, collection: measure.student_survey_items)]
|
||||
# end
|
||||
end
|
||||
|
||||
context 'when a measure includes admin data and teacher survey items' do
|
||||
|
|
@ -131,9 +132,10 @@ RSpec.describe Measure, type: :model do
|
|||
# (2*3 + 1.2)/4
|
||||
expect(measure.watch_low_benchmark).to be 1.8
|
||||
end
|
||||
it 'returns the source as admin and teacher survey items' do
|
||||
expect(measure.sources).to eq %i[admin_data teacher_surveys]
|
||||
end
|
||||
# it 'returns the source as admin and teacher survey items' do
|
||||
# expect(measure.sources).to eq [Source.new(name: :admin_data, collection: measure.admin_data_items),
|
||||
# Source.new(name: :teacher_surveys, collection: measure.teacher_survey_items)]
|
||||
# end
|
||||
end
|
||||
|
||||
context 'when a measure includes student and teacher survey items' do
|
||||
|
|
@ -155,9 +157,10 @@ RSpec.describe Measure, type: :model do
|
|||
# (1.2+ 1.5)/2
|
||||
expect(measure.watch_low_benchmark).to be 1.35
|
||||
end
|
||||
it 'returns the source as student and teacher survey items' do
|
||||
expect(measure.sources).to eq %i[student_surveys teacher_surveys]
|
||||
end
|
||||
# it 'returns the source as student and teacher survey items' do
|
||||
# expect(measure.sources).to eq [Source.new(name: :student_surveys, collection: measure.student_survey_items),
|
||||
# Source.new(name: :teacher_surveys, collection: measure.teacher_survey_items)]
|
||||
# end
|
||||
end
|
||||
|
||||
context 'when a measure includes admin data and student and teacher survey items' do
|
||||
|
|
@ -191,9 +194,11 @@ RSpec.describe Measure, type: :model do
|
|||
expect(measure.ideal_low_benchmark).to be_within(0.001).of 4.74
|
||||
end
|
||||
|
||||
it 'returns the source as admin student and teacher survey items' do
|
||||
expect(measure.sources).to eq %i[admin_data student_surveys teacher_surveys]
|
||||
end
|
||||
# it 'returns the source as admin student and teacher survey items' do
|
||||
# expect(measure.sources).to eq [Source.new(name: :admin_data, collection: measure.admin_data_items),
|
||||
# Source.new(name: :student_surveys, collection: measure.student_survey_items),
|
||||
# Source.new(name: :teacher_surveys, collection: measure.teacher_survey_items)]
|
||||
# end
|
||||
end
|
||||
end
|
||||
|
||||
|
|
@ -365,7 +370,7 @@ RSpec.describe Measure, type: :model do
|
|||
end
|
||||
end
|
||||
|
||||
context "and the school is a short form school" do
|
||||
context 'and the school is a short form school' do
|
||||
before :each do
|
||||
create_list(:survey_item_response, SurveyItemResponse::STUDENT_RESPONSE_THRESHOLD,
|
||||
survey_item: student_survey_item_1, academic_year:, school: short_form_school, likert_score: 1)
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ describe 'District Admin', js: true do
|
|||
let(:different_district) { District.find_by_slug 'wareham' }
|
||||
let(:school) { School.find_by_slug 'winchester-high-school' }
|
||||
let(:school_in_same_district) { School.find_by_slug 'muraco-elementary-school' }
|
||||
let(:first_school_in_wareham) { School.find_by_slug 'john-william-decas-elementary-school' }
|
||||
|
||||
let(:category) { Category.find_by_name('Teachers & Leadership') }
|
||||
let(:different_category) { Category.find_by_name('School Culture') }
|
||||
|
|
@ -28,6 +29,16 @@ describe 'District Admin', js: true do
|
|||
|
||||
let(:ay_2021_22) { AcademicYear.find_by_range '2021-22' }
|
||||
let(:ay_2019_20) { AcademicYear.find_by_range '2019-20' }
|
||||
let(:response_rates) do
|
||||
[ay_2021_22, ay_2019_20].each do |academic_year|
|
||||
[school, school_in_same_district, first_school_in_wareham].each do |school|
|
||||
[subcategory, different_subcategory].each do |subcategory|
|
||||
ResponseRate.create!(subcategory:, school:, academic_year:, student_response_rate: 100, teacher_response_rate: 100,
|
||||
meets_student_threshold: true, meets_teacher_threshold: true)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# let(:username) { 'winchester' }
|
||||
# let(:password) { 'winchester!' }
|
||||
|
|
@ -47,6 +58,7 @@ describe 'District Admin', js: true do
|
|||
Rails.application.load_seed
|
||||
|
||||
respondents
|
||||
response_rates
|
||||
survey_item_responses = []
|
||||
|
||||
survey_items_for_measure_1A_i.each do |survey_item|
|
||||
|
|
@ -87,6 +99,10 @@ describe 'District Admin', js: true do
|
|||
SurveyItemResponse.import survey_item_responses
|
||||
end
|
||||
|
||||
after :each do
|
||||
DatabaseCleaner.clean
|
||||
end
|
||||
|
||||
it 'navigates through the site' do
|
||||
# page.driver.basic_authorize(username, password)
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue