diff --git a/app/controllers/dashboard_controller.rb b/app/controllers/dashboard_controller.rb
index f85a93a8..97758223 100644
--- a/app/controllers/dashboard_controller.rb
+++ b/app/controllers/dashboard_controller.rb
@@ -23,6 +23,15 @@ class DashboardController < SqmApplicationController
end
def presenter_for_measure(measure)
+ sufficient_data = SurveyItemResponse.sufficient_data?(measure: measure, academic_year: academic_year, school: school)
+
+ unless sufficient_data
+ return MeasureGraphRowPresenter.new(
+ measure: measure,
+ sufficient_data: false
+ )
+ end
+
score = SurveyItemResponse.for_measure(measure)
.where(academic_year: academic_year, school: school)
.average(:likert_score)
diff --git a/app/helpers/variance_helper.rb b/app/helpers/variance_helper.rb
index e66fbcb3..75684a4c 100644
--- a/app/helpers/variance_helper.rb
+++ b/app/helpers/variance_helper.rb
@@ -42,4 +42,8 @@ module VarianceHelper
def zone_width_percentage
100.0/zones.size
end
+
+ def measures_with_insufficient_data(presenters:)
+ presenters.filter { |presenter| !presenter.sufficient_data? }
+ end
end
diff --git a/app/models/measure.rb b/app/models/measure.rb
index 50c724f5..b91d22a3 100644
--- a/app/models/measure.rb
+++ b/app/models/measure.rb
@@ -3,4 +3,12 @@ class Measure < ActiveRecord::Base
has_many :survey_items
has_many :survey_item_responses, through: :survey_items
+
+ def includes_teacher_survey_items?
+ survey_items.where("survey_item_id LIKE 't-%'").any?
+ end
+
+ def includes_student_survey_items?
+ survey_items.where("survey_item_id LIKE 's-%'").any?
+ end
end
diff --git a/app/models/survey_item_response.rb b/app/models/survey_item_response.rb
index 92a4428f..a3f85216 100644
--- a/app/models/survey_item_response.rb
+++ b/app/models/survey_item_response.rb
@@ -1,8 +1,26 @@
class SurveyItemResponse < ActiveRecord::Base
+ TEACHER_RESPONSE_THRESHOLD = 17
+ STUDENT_RESPONSE_THRESHOLD = 196
+
belongs_to :academic_year
belongs_to :school
belongs_to :survey_item
scope :for_measures, ->(measures) { joins(:survey_item).where('survey_items.measure_id': measures.map(&:id)) }
scope :for_measure, ->(measure) { joins(:survey_item).where('survey_items.measure_id': measure.id) }
+
+ def self.sufficient_data?(measure:, academic_year:, school:)
+ meets_teacher_threshold = true
+ meets_student_threshold = true
+
+ if measure.includes_teacher_survey_items?
+ meets_teacher_threshold = SurveyItemResponse.for_measure(measure).where("survey_items.survey_item_id LIKE 't-%'").where(academic_year: academic_year, school: school).count >= TEACHER_RESPONSE_THRESHOLD
+ end
+
+ if measure.includes_student_survey_items?
+ meets_student_threshold = SurveyItemResponse.for_measure(measure).where("survey_items.survey_item_id LIKE 's-%'").where(academic_year: academic_year, school: school).count >= STUDENT_RESPONSE_THRESHOLD
+ end
+
+ meets_teacher_threshold and meets_student_threshold
+ end
end
diff --git a/app/presenters/measure_graph_row_presenter.rb b/app/presenters/measure_graph_row_presenter.rb
index 04ac8717..9a57cf6f 100644
--- a/app/presenters/measure_graph_row_presenter.rb
+++ b/app/presenters/measure_graph_row_presenter.rb
@@ -1,8 +1,13 @@
class MeasureGraphRowPresenter
include Comparable
- def initialize(measure:, score:)
+ def initialize(measure:, score: 0, sufficient_data: true)
@measure = measure
@score = score
+ @sufficient_data = sufficient_data
+ end
+
+ def sufficient_data?
+ @sufficient_data
end
def measure_name
diff --git a/app/views/dashboard/_variance_graph.erb b/app/views/dashboard/_variance_graph.erb
index 65821877..dafbea83 100644
--- a/app/views/dashboard/_variance_graph.erb
+++ b/app/views/dashboard/_variance_graph.erb
@@ -1,3 +1,8 @@
+
+<% unless measures_with_insufficient_data(presenters: presenters).empty? %>
+
Note: The following measures are not displayed due to limited availability of school admin data and/or low survey response rates: <%= measures_with_insufficient_data(presenters: presenters).map(&:measure_name).join('; ') %>.