From 59865cd874cee81795e66725844a6dacd6b94e0c Mon Sep 17 00:00:00 2001 From: rebuilt Date: Tue, 25 Jan 2022 16:15:58 +0100 Subject: [PATCH] Show response rate for students --- CHANGELOG.md | 7 +- Rakefile | 2 +- app/assets/stylesheets/sqm.sass.scss | 13 + app/lib/seeder.rb | 24 ++ app/models/respondent.rb | 4 + app/models/survey_item_response.rb | 26 +- app/presenters/subcategory_presenter.rb | 19 + .../categories/_subcategory_section.html.erb | 18 +- data/master_list_of_schools_and_districts.csv | 396 +++++++++--------- .../20220124144902_create_respondents.rb | 12 + db/schema.rb | 15 +- db/seeds.rb | 1 + spec/factories.rb | 5 + .../fixtures/sample_districts_and_schools.csv | 6 +- spec/lib/seeder_spec.rb | 27 +- spec/models/survey_item_response_spec.rb | 70 +++- spec/presenters/subcategory_presenter_spec.rb | 30 +- 17 files changed, 461 insertions(+), 214 deletions(-) create mode 100644 app/models/respondent.rb create mode 100644 db/migrate/20220124144902_create_respondents.rb diff --git a/CHANGELOG.md b/CHANGELOG.md index 6fb6d35e..c23a378f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased] +## [Released] ### Added - short description to Category +## [Unreleased] +### Added + - Add student response rate + `bundle exec rake db:migrate` + diff --git a/Rakefile b/Rakefile index 3f1ba47b..0df4c58b 100644 --- a/Rakefile +++ b/Rakefile @@ -8,7 +8,7 @@ begin require 'rspec/core/rake_task' RSpec::Core::RakeTask.new(:spec) - # task(:default).clear + task(:default).clear task default: :spec rescue LoadError => e raise e unless ENV['RAILS_ENV'] == 'production' diff --git a/app/assets/stylesheets/sqm.sass.scss b/app/assets/stylesheets/sqm.sass.scss index 1a9576ed..8e169b24 100644 --- a/app/assets/stylesheets/sqm.sass.scss +++ b/app/assets/stylesheets/sqm.sass.scss @@ -117,3 +117,16 @@ background-color: $gray-3; } +.response-rate { + background-color: $gray-3; + border: 1px solid; + border-color: $gray-2; + width: 150px; + border-radius: 8px; + padding: 8px; +} + +.response-rate-percentage { + font-size: 20px; + @extend .sub-header-4; +} diff --git a/app/lib/seeder.rb b/app/lib/seeder.rb index 40aaacc7..1115dc7a 100644 --- a/app/lib/seeder.rb +++ b/app/lib/seeder.rb @@ -29,6 +29,30 @@ class Seeder School.where.not(dese_id: dese_ids).destroy_all end + def seed_respondents(csv_file) + schools = [] + year = '2020-21' + academic_year = AcademicYear.find_by_range year + CSV.parse(File.read(csv_file), headers: true) do |row| + dese_id = row['DESE School ID'].strip.to_i + total_students = row["Total Students for Response Rate (#{year})"] + total_teachers = row["Total Teachers for Response Rate (#{year})"] + + district_name = row['District'].strip + district = District.find_or_create_by! name: district_name + + school = School.find_by dese_id: dese_id, district: district + schools << school + respondent = Respondent.find_or_initialize_by school: school + respondent.total_students = total_students + respondent.total_teachers = total_teachers + respondent.academic_year = academic_year + respondent.save + end + + Respondent.where.not(school: schools).destroy_all + end + def seed_sqm_framework(csv_file) CSV.parse(File.read(csv_file), headers: true) do |row| category_id = row['Category ID'].strip diff --git a/app/models/respondent.rb b/app/models/respondent.rb new file mode 100644 index 00000000..fcd86dcb --- /dev/null +++ b/app/models/respondent.rb @@ -0,0 +1,4 @@ +class Respondent < ApplicationRecord + belongs_to :school + belongs_to :academic_year +end diff --git a/app/models/survey_item_response.rb b/app/models/survey_item_response.rb index 323e4ba2..76f663b7 100644 --- a/app/models/survey_item_response.rb +++ b/app/models/survey_item_response.rb @@ -7,9 +7,7 @@ class SurveyItemResponse < ActiveRecord::Base belongs_to :survey_item def self.score_for_subcategory(subcategory:, school:, academic_year:) - measures = subcategory.measures.select do |measure| - sufficient_data?(measure: measure, school: school, academic_year: academic_year) - end + measures = measures_with_sufficient_data(subcategory: subcategory, school: school, academic_year: academic_year) return nil unless measures.size.positive? @@ -18,6 +16,27 @@ class SurveyItemResponse < ActiveRecord::Base end.average end + def self.average_number_of_student_respondents(subcategory:, school:, academic_year:) + response_count = subcategory.measures.map do |measure| + next 0 unless measure.includes_student_survey_items? + + SurveyItemResponse.student_responses_for_measure(measure, school, academic_year).count + end.sum + + survey_item_count = subcategory.measures.map do |measure| + measure.student_survey_items.count + end.sum + return 0 unless survey_item_count.positive? + + response_count / survey_item_count + end + + def self.measures_with_sufficient_data(subcategory:, school:, academic_year:) + subcategory.measures.select do |measure| + sufficient_data?(measure: measure, school: school, academic_year: academic_year) + end + end + def self.responses_for_measure(measure:, school:, academic_year:) meets_teacher_threshold = teacher_sufficient_data? measure: measure, school: school, academic_year: academic_year meets_student_threshold = student_sufficient_data? measure: measure, school: school, academic_year: academic_year @@ -88,4 +107,5 @@ class SurveyItemResponse < ActiveRecord::Base end !!meets_teacher_threshold end + private_class_method :measures_with_sufficient_data end diff --git a/app/presenters/subcategory_presenter.rb b/app/presenters/subcategory_presenter.rb index 0eefb1ce..721bee0b 100644 --- a/app/presenters/subcategory_presenter.rb +++ b/app/presenters/subcategory_presenter.rb @@ -30,6 +30,13 @@ class SubcategoryPresenter academic_year: @academic_year) end + def student_response_rate + @student_response_rate ||= response_rate(type: :total_students) do + SurveyItemResponse.average_number_of_student_respondents(subcategory: @subcategory, school: @school, + academic_year: @academic_year) + end + end + def measure_presenters @subcategory.measures.includes([:admin_data_items]).sort_by(&:measure_id).map do |measure| MeasurePresenter.new(measure: measure, academic_year: @academic_year, school: @school) @@ -50,4 +57,16 @@ class SubcategoryPresenter def measures @measures ||= @subcategory.measures.includes([:admin_data_items]).order(:measure_id) end + + def response_rate(type:) + number_of_responses = yield + total_responses = Respondent.where(school: @school, academic_year: @academic_year).first + return 0 unless total_responses.present? + + total_possible_responses = total_responses.send(type) + + return 0 if number_of_responses.nil? || total_possible_responses == 0 + + (number_of_responses / total_possible_responses * 100).round + end end diff --git a/app/views/categories/_subcategory_section.html.erb b/app/views/categories/_subcategory_section.html.erb index 3aa0dd02..797af55e 100644 --- a/app/views/categories/_subcategory_section.html.erb +++ b/app/views/categories/_subcategory_section.html.erb @@ -7,7 +7,23 @@
<%= render partial: "gauge_graph", locals: { gauge: subcategory.gauge_presenter, gauge_class: 'gauge-graph-lg', font_class: 'sub-header-3' } %>
-

<%= subcategory.description %>

+
+

<%= subcategory.description %>

+ +
+
+

<%= subcategory.student_response_rate %>%

+

of students responded

+
+ <%#
%> + <%#

<%= subcategory.teacher_response_rate %1>%

%> + <%#

of teachers responded

%> + <%#

%> + <%# <%= subcategory.total_teachers %1> %> + <%#

%> + +
+
diff --git a/data/master_list_of_schools_and_districts.csv b/data/master_list_of_schools_and_districts.csv index 01a85511..4442c269 100644 --- a/data/master_list_of_schools_and_districts.csv +++ b/data/master_list_of_schools_and_districts.csv @@ -1,198 +1,198 @@ -District,School Name,District Code,School Code,DESE School ID,School Closed In ,Total Students for Response Rate,Total Teachers for Response Rate -Attleboro,A. Irvin Studley Elementary School,1,7,00160001,,75,26.90 -Attleboro,Thomas Willett Elementary School,1,9,00160035,,70,26.40 -Attleboro,Hyman Fine Elementary School,1,6,00160040,,86,31.50 -Attleboro,Hill-Roberts Elementary School,1,5,00160045,,97,28.10 -Attleboro,Peter Thacher Elementary School,1,8,00160050,,94,34.60 -Attleboro,Robert J. Coelho Middle School,1,3,00160305,,633,38.80 -Attleboro,Cyril K. Brennan Middle School,1,2,00160315,,620,41.30 -Attleboro,Wamsutta Middle School,1,4,00160320,,578,37.00 -Attleboro,Attleboro High School,1,1,00160505,,1792,114.70 -Boston,Lee Academy,2,,00350001,,0,19.20 -Boston,Baldwin Early Learning Pilot Academy ,2,117,00350003,,0,15.00 -Boston,Mary Lyon K-8 School,2,66,00350004,,76,17.40 -Boston,West Zone Early Learning Center ,2,123,00350006,,0,12.00 -Boston,Ellison/Parks Early Education School,2,120,00350008,,0,21.00 -Boston,East Boston Early Education Center ,2,119,00350009,,0,19.30 -Boston,Haynes Early Education Center ,2,121,00350010,,0,16.50 -Boston,Boston Teachers Union K-8 School,2,14,00350012,,157,20.20 -Boston,Jackson/Mann K-8 School,2,57,00350013,,235,53.30 -Boston,Pauline A. Shaw Elementary School,2,98,00350014,,0,15.50 -Boston,Curley K-8 School,2,26,00350020,,474,100.30 -Boston,Ludwig van Beethoven Elementary School,2,5,00350021,,0,24.50 -Boston,William E. Carter School,2,124,00350036,,27,2.00 -Boston,Charles Sumner Elementary School,2,100,00350052,,145,42.30 -Boston,Charles H. Taylor Elementary School,2,101,00350054,,111,37.00 -Boston,Curtis Guild Elementary School,2,45,00350062,,101,29.30 -Boston,Dante Alghieri Montessori School,2,2,00350066,,28,10.30 -Boston,David A. Ellis Elementary School,2,35,00350072,,113,37.60 -Boston,Henry Dearborn STEM Academy,2,27,00350074,,578,52.50 -Boston,Dennis Haley K-8 School,2,47,00350077,,199,45.70 -Boston,Donald McKay K-8 School,2,73,00350080,,452,70.10 -Boston,Edward Everett Elementary School,2,37,00350088,,123,23.00 -Boston,John Eliot K-8 School,2,34,00350096,,386,57.40 -Boston,Ellis Mendell School,2,79,00350100,,82,26.50 -Boston,Franklin D. Roosevelt K-8 School,2,96,00350116,,222,36.80 -Boston,George H. Conley Elementary School,2,25,00350122,,96,22.80 -Boston,Edward M. Kennedy Academy for Health Careers,2,58,04520505,,385,36.30 -Boston,Henry Grew Elementary School,2,44,00350135,,67,17.80 -Boston,Oliver Wendell Holmes Elementary School,2,53,00350138,,81,31.90 -Boston,Hugh R. O'Donnell Elementary School,2,87,00350141,,99,24.50 -Boston,James F. Condon K-8 School,2,24,00350146,,419,64.20 -Boston,James W. Hennigan K-8 School,2,50,00350153,,366,49.80 -Boston,James J. Chittick Elementary School,2,20,00350154,,71,34.20 -Boston,James Otis Elementary School,2,90,00350156,,136,36.60 -Boston,John F. Kennedy Elementary School,2,59,00350166,,115,27.10 -Somerville,John F. Kennedy Elementary School,5,6,02740083,,251,36.60 -Boston,UP Academy Holland,2,110,00350167,,216,48.50 -Boston,John D. Philbrick Elementary School,2,93,00350172,,33,14.90 -Boston,John W. McCormack Middle School,2,72,00350179,,250,26.50 -Boston,John Winthrop Elementary School,2,115,00350180,,56,27.00 -Boston,Joseph P. Tynan Elementary School,2,106,00350181,,77,28.10 -Boston,Joseph Hurley K-8 School,2,55,00350182,,152,22.50 -Boston,Joseph Lee K-8 School,2,64,00350183,,320,65.90 -Boston,Joseph P. Manning Elementary School,2,69,00350184,,69,16.20 -Boston,Joyce Kilmer K-8 School,2,62,00350190,,210,43.00 -Boston,Harvard/Kent Elementary School,2,48,00350200,,156,45.20 -Boston,Manassah E. Bradley Elementary School,2,15,00350215,,105,21.70 -Boston,Mattahunt,2,122,00350226,,#N/A,#N/A -Boston,Mather Elementary School,2,71,00350227,,152,45.40 -Boston,Maurice Tobin K-8 School,2,104,00350229,,229,35.80 -Boston,Michael J. Perkins Elementary School,2,91,00350231,,78,18.40 -Boston,Wolfgang A. Mozart Elementary School,2,82,00350237,,46,18.30 -Boston,Richard J. Murphy K-8 School,2,84,00350240,,556,70.10 -Boston,Nathan Hale Elementary School,2,46,00350243,,68,19.00 -Boston,Oliver Hazard Perry K-8 School,2,92,00350255,,81,23.70 -Boston,Orchard Gardens K-8 School,2,89,00350257,,452,74.10 -Boston,William Ohrenberger School,2,88,00350258,,452,44.80 -Boston,Patrick Lyndon K-8 School,2,65,00350262,,304,52.50 -Boston,Patrick Kennedy Elementary School,2,60,00350264,,108,26.20 -Boston,Dr. William W. Henderson K-12 Inclusion School,2,49,00350266,,0,21.80 -Boston,Paul A. Dever Elementary School,2,28,00350268,,121,39.40 -Boston,Phineas Bates Elementary School,2,4,00350278,,69,23.40 -Boston,Josiah Quincy Elementary School,2,94,00350286,,245,65.70 -Boston,Josiah Quincy Upper School,2,95,00350565,,535,48.70 -Boston,Clap Elementary School,2,21,00350298,,47,13.40 -Boston,Samuel Adams Elementary School,2,1,00350302,,79,28.40 -Boston,Samuel Mason Elementary School,2,70,00350304,,64,28.30 -Boston,Sarah Greenwood K-8 School,2,43,00350308,,183,35.60 -Boston,Gardner Pilot Academy,2,41,00350326,,199,31.60 -Boston,Thomas J. Kenny Elementary School,2,61,00350328,,153,33.40 -Boston,Warren/Prescott K-8 School,2,112,00350346,,236,48.10 -Boston,William E. Channing Elementary School,2,18,00350360,,69,23.70 -Boston,William McKinley School,2,78,00350363,,252,58.50 -Boston,William E. Russell Elementary School,2,97,00350366,,87,34.40 -Boston,William Monroe Trotter K-8 School,2,105,00350370,,165,31.80 -Boston,F. Lyman Winship Elementary School,2,114,00350374,,32,23.00 -Boston,Thomas Edison K-8 School,2,32,00350375,,278,57.30 -Boston,"Martin Luther King, Jr. K-8 School",2,63,00350376,,231,55.70 -Boston,Higginson-Lewis School,2,52,00350377,,190,27.40 -Boston,Mildred Avenue K-8 School,2,80,00350378,,464,55.90 -Boston,Young Achievers Science and Math K-8 School,2,116,00350380,,314,54.50 -Boston,Mission Hill K-8 School,2,81,00350382,,107,24.50 -Boston,Lilla G. Frederick Middle School,2,40,00350383,,381,40.30 -Boston,Blackstone Innovation School,2,6,00350390,,156,55.70 -Boston,Clarence R. Edwards Middle School,2,33,00350430,,206,25.80 -Boston,Washington Irving Middle School,2,56,00350445,,184,27.80 -Boston,James P. Timilty Middle School,2,103,00350485,,233,31.70 -Boston,Brighton High School,2,16,00350505,,402,49.80 -Boston,Boston International Newcomers Academy,2,11,00350507,,398,54.10 -Boston,Charlestown High School,2,19,00350515,,785,95.10 -Boston,Community Academy,2,22,00350518,,51,12.70 -Boston,Excel High School,2,38,00350522,,471,49.90 -Boston,Jeremiah E. Burke High School,2,17,00350525,,390,34.90 -Boston,East Boston High School,2,31,00350530,,1055,89.60 -Boston,English High School,2,36,00350535,,518,58.10 -Boston,Madison Park Technical Vocational High School,2,68,00350537,,1043,128.10 -Boston,Fenway High School,2,39,00350540,,388,37.30 -Boston,Another Course to College,2,3,00350541,,236,25.00 -Boston,New Mission High School,2,85,00350542,,481,44.90 -Boston,Greater Egleston High School,2,42,00350543,,114,10.70 -Boston,Boston Latin Academy,2,12,00350545,,1787,94.00 -Boston,Boston Arts Academy,2,7,00350546,,482,53.00 -Boston,Margarita Muniz Academy,2,83,00350549,,315,27.70 -Boston,Boston Community Leadership Academy,2,8,00350558,,478,44.60 -Boston,Boston Latin School,2,13,00350560,,2483,126.00 -Boston,John D. O'Bryant School of Mathematics and Science,2,86,00350575,,1624,110.20 -Boston,Urban Science Academy,2,111,00350579,,#N/A,#N/A -Boston,Community Academy of Science and Health,2,23,00350581,,334,41.20 -Boston,Mary Lyon High School,2,67,00350655,,137,16.60 -Boston,Mario Umana Academy,2,107,00350656,,500,64.00 -Boston,TechBoston Academy,2,102,00350657,,901,95.00 -Boston,West Roxbury Academy,2,113,00350658,,#N/A,#N/A -Boston,Snowden International School at Copley,2,99,00350690,,483,44.00 -Boston,Rafael Hernandez K-8 School,2,51,00350691,,177,28.30 -Boston,Horace Mann School for the Deaf and Hard of Hearing,2,54,00350750,,50,35.50 -Boston,Boston Collaborative High School,2,29,00350755,,160,15.30 -Boston,Boston Adult Technical Academy ,2,118,00351002,,#N/A,#N/A -Boston,Boston Day and Evening Academy,2,9,00441006,,#N/A,#N/A -Lowell,Cardinal O'Connell Alternative School,3,3,01600001,,0,9.00 -Lowell,Bailey Elementary School,3,1,01600002,,90,35.00 -Lowell,STEM Academy at the Rogers School,3,20,01600005,,510,59.00 -Lowell,McAvinnue Elementary School,3,10,01600010,,86,39.00 -Lowell,Greenhalge Elementary School,3,5,01600015,,88,37.00 -Lowell,Pyne Arts School,3,15,01600018,,264,38.20 -Lowell,Abraham Lincoln Elementary School,3,52,01600020,,90,39.00 -Revere,Lincoln Elementary School,4,5,02480025,,175,39.10 -Winchester,Lincoln Elementary School,6,2,03440005,,157,30.20 -Lowell,Moody Elementary School,3,11,01600027,,43,17.80 -Lowell,Morey Elementary School,3,12,01600030,,88,37.00 -Lowell,Pawtucketville Memorial Elementary School,3,14,01600036,,91,34.00 -Lowell,Reilly Elementary School,3,16,01600040,,89,32.20 -Lowell,Shaughnessy Elementary School,3,19,01600050,,92,38.00 -Lowell,Washington Elementary School,3,25,01600055,,46,23.00 -Lowell,McAuliffe Elementary School,3,9,01600075,,91,37.00 -Lowell,Murkland Elementary School,3,13,01600080,,87,35.00 -Lowell,Laura Lee Therapeutic Day School,3,6,01600085,,23,6.80 -Lowell,Bartlett Community Partnership School,3,26,01600090,,256,40.80 -Lowell,Butler Middle School,3,2,01600310,,550,42.40 -Lowell,Daley Middle School,3,4,01600315,,691,50.20 -Lowell,LeBlanc Therapeutic Day School,3,7,01600320,,36,7.30 -Lowell,Robinson Middle School,3,18,01600330,,658,45.40 -Lowell,Sullivan Middle School,3,22,01600340,,641,47.00 -Lowell,Wang Middle School,3,24,01600345,,668,46.00 -Lowell,Stoklosa Middle School,3,21,01600360,,656,53.60 -Lowell,Lowell High School,3,8,01600505,,3048,212.90 -Lowell,The Career Academy,3,23,01600515,,94,9.90 -Lowell,Adie Day School,3,51,01600605,,32,11.00 -Lowell,Riverside School,3,17,01600920,,#N/A,#N/A -Milford,Memorial Elementary School,7,4,01850010,,0,38.40 -Milford,Brookside Elementary School,7,3,01850065,,0,39.40 -Milford,Shining Star Early Childhood Center,7,5,01850075,,0,7.60 -Milford,Woodland Elementary School,7,1,01850090,,656,81.20 -Milford,Stacy Middle School,7,26,01850305,,1032,76.40 -Milford,Milford High School,7,2,01850505,,1257,95.20 -Revere,Whelan Elementary School,4,7,02480003,,256,53.50 -Revere,Beachmont Elementary School,4,1,02480013,,97,29.00 -Revere,Rumney Marsh Academy,4,9,02480014,,600,50.50 -Revere,Hill Elementary School,4,4,02480035,,237,47.50 -Revere,Paul Revere Elementary School,4,6,02480050,,159,41.50 -Revere,Garfield Elementary School,4,2,02480056,,201,57.80 -Revere,Garfield Middle School,4,3,02480057,,568,44.90 -Revere,Susan B. Anthony Middle School,4,8,02480305,,575,49.00 -Revere,Revere High School,4,10,02480505,,1978,135.60 -Revere,Seacoast High School,4,11,02480520,,81,12.80 -Somerville,Michael E. Capuano Early Childhood Center,5,12,02740005,,0,23.30 -Somerville,Benjamin G. Brown School,5,2,02740015,,78,15.80 -Somerville,Arthur D. Healey School,5,1,02740075,,235,42.80 -Somerville,Dr. Albert F. Argenziano School at Lincoln Park,5,3,02740087,,290,45.70 -Somerville,East Somerville Community School,5,4,02740111,,392,54.20 -Somerville,West Somerville Neighborhood School,5,9,02740115,,193,29.30 -Somerville,Winter Hill Community Innovation School,5,10,02740120,,230,46.70 -Somerville,Somerville High School,5,8,02740505,,1215,113.20 -Somerville,Next Wave/Full Circle,5,5,02740510,,56,10.70 -Wareham,John William Decas Elementary School,8,1,03100003,,0,48.50 -Wareham,Minot Forest Elementary School,8,2,03100017,,134,25.70 -Wareham,Wareham Middle School,8,3,03100305,,533,36.00 -Wareham,Wareham Cooperative Alternative School,8,8,03100315,,33,2.60 -Wareham,Wareham High School,8,4,03100505,,585,59.20 -Winchester,Lynch Elementary School,6,3,03440020,,158,43.20 -Winchester,Vinson-Owen Elementary School,6,5,03440025,,136,36.30 -Winchester,Muraco Elementary School,6,4,03440040,,136,25.30 -Winchester,Ambrose Elementary School,6,1,03440045,,130,30.20 -Winchester,McCall Middle School,6,6,03440305,,1084,85.30 -Winchester,Winchester High School,6,7,03440505,,1403,98.20 -Boston,Dudley Street Neighborhood Charter School,2,30,04070405,,77,10.30 -Boston,Boston Green Academy,2,10,04110305,,509,57.50 -Boston,UP Academy Boston,2,108,04800405,,349,35.30 -Boston,UP Academy Dorchester,2,109,35050405,,354,45.70 +District,School Name,District Code,School Code,DESE School ID,School Closed In ,Total Students for Response Rate (2020-21),Total Teachers for Response Rate (2020-21) +Attleboro,A. Irvin Studley Elementary School,1,7,00160001,,75,26.90 +Attleboro,Thomas Willett Elementary School,1,9,00160035,,70,26.40 +Attleboro,Hyman Fine Elementary School,1,6,00160040,,86,31.50 +Attleboro,Hill-Roberts Elementary School,1,5,00160045,,97,28.10 +Attleboro,Peter Thacher Elementary School,1,8,00160050,,94,34.60 +Attleboro,Robert J. Coelho Middle School,1,3,00160305,,633,38.80 +Attleboro,Cyril K. Brennan Middle School,1,2,00160315,,620,41.30 +Attleboro,Wamsutta Middle School,1,4,00160320,,578,37.00 +Attleboro,Attleboro High School,1,1,00160505,,1792,114.70 +Boston,Lee Academy,2,,00350001,,0,19.20 +Boston,Baldwin Early Learning Pilot Academy ,2,117,00350003,,0,15.00 +Boston,Mary Lyon K-8 School,2,66,00350004,,76,17.40 +Boston,West Zone Early Learning Center ,2,123,00350006,,0,12.00 +Boston,Ellison/Parks Early Education School,2,120,00350008,,0,21.00 +Boston,East Boston Early Education Center ,2,119,00350009,,0,19.30 +Boston,Haynes Early Education Center ,2,121,00350010,,0,16.50 +Boston,Boston Teachers Union K-8 School,2,14,00350012,,157,20.20 +Boston,Jackson/Mann K-8 School,2,57,00350013,,235,53.30 +Boston,Pauline A. Shaw Elementary School,2,98,00350014,,0,15.50 +Boston,Curley K-8 School,2,26,00350020,,474,100.30 +Boston,Ludwig van Beethoven Elementary School,2,5,00350021,,0,24.50 +Boston,William E. Carter School,2,124,00350036,,27,2.00 +Boston,Charles Sumner Elementary School,2,100,00350052,,145,42.30 +Boston,Charles H. Taylor Elementary School,2,101,00350054,,111,37.00 +Boston,Curtis Guild Elementary School,2,45,00350062,,101,29.30 +Boston,Dante Alghieri Montessori School,2,2,00350066,,28,10.30 +Boston,David A. Ellis Elementary School,2,35,00350072,,113,37.60 +Boston,Henry Dearborn STEM Academy,2,27,00350074,,578,52.50 +Boston,Dennis Haley K-8 School,2,47,00350077,,199,45.70 +Boston,Donald McKay K-8 School,2,73,00350080,,452,70.10 +Boston,Edward Everett Elementary School,2,37,00350088,,123,23.00 +Boston,John Eliot K-8 School,2,34,00350096,,386,57.40 +Boston,Ellis Mendell School,2,79,00350100,,82,26.50 +Boston,Franklin D. Roosevelt K-8 School,2,96,00350116,,222,36.80 +Boston,George H. Conley Elementary School,2,25,00350122,,96,22.80 +Boston,Edward M. Kennedy Academy for Health Careers,2,58,04520505,,385,36.30 +Boston,Henry Grew Elementary School,2,44,00350135,,67,17.80 +Boston,Oliver Wendell Holmes Elementary School,2,53,00350138,,81,31.90 +Boston,Hugh R. O'Donnell Elementary School,2,87,00350141,,99,24.50 +Boston,James F. Condon K-8 School,2,24,00350146,,419,64.20 +Boston,James W. Hennigan K-8 School,2,50,00350153,,366,49.80 +Boston,James J. Chittick Elementary School,2,20,00350154,,71,34.20 +Boston,James Otis Elementary School,2,90,00350156,,136,36.60 +Boston,John F. Kennedy Elementary School,2,59,00350166,,115,27.10 +Somerville,John F. Kennedy Elementary School,5,6,02740083,,251,36.60 +Boston,UP Academy Holland,2,110,00350167,,216,48.50 +Boston,John D. Philbrick Elementary School,2,93,00350172,,33,14.90 +Boston,John W. McCormack Middle School,2,72,00350179,,250,26.50 +Boston,John Winthrop Elementary School,2,115,00350180,,56,27.00 +Boston,Joseph P. Tynan Elementary School,2,106,00350181,,77,28.10 +Boston,Joseph Hurley K-8 School,2,55,00350182,,152,22.50 +Boston,Joseph Lee K-8 School,2,64,00350183,,320,65.90 +Boston,Joseph P. Manning Elementary School,2,69,00350184,,69,16.20 +Boston,Joyce Kilmer K-8 School,2,62,00350190,,210,43.00 +Boston,Harvard/Kent Elementary School,2,48,00350200,,156,45.20 +Boston,Manassah E. Bradley Elementary School,2,15,00350215,,105,21.70 +Boston,Mattahunt,2,122,00350226,,#N/A,#N/A +Boston,Mather Elementary School,2,71,00350227,,152,45.40 +Boston,Maurice Tobin K-8 School,2,104,00350229,,229,35.80 +Boston,Michael J. Perkins Elementary School,2,91,00350231,,78,18.40 +Boston,Wolfgang A. Mozart Elementary School,2,82,00350237,,46,18.30 +Boston,Richard J. Murphy K-8 School,2,84,00350240,,556,70.10 +Boston,Nathan Hale Elementary School,2,46,00350243,,68,19.00 +Boston,Oliver Hazard Perry K-8 School,2,92,00350255,,81,23.70 +Boston,Orchard Gardens K-8 School,2,89,00350257,,452,74.10 +Boston,William Ohrenberger School,2,88,00350258,,452,44.80 +Boston,Patrick Lyndon K-8 School,2,65,00350262,,304,52.50 +Boston,Patrick Kennedy Elementary School,2,60,00350264,,108,26.20 +Boston,Dr. William W. Henderson K-12 Inclusion School,2,49,00350266,,0,21.80 +Boston,Paul A. Dever Elementary School,2,28,00350268,,121,39.40 +Boston,Phineas Bates Elementary School,2,4,00350278,,69,23.40 +Boston,Josiah Quincy Elementary School,2,94,00350286,,245,65.70 +Boston,Josiah Quincy Upper School,2,95,00350565,,535,48.70 +Boston,Clap Elementary School,2,21,00350298,,47,13.40 +Boston,Samuel Adams Elementary School,2,1,00350302,,79,28.40 +Boston,Samuel Mason Elementary School,2,70,00350304,,64,28.30 +Boston,Sarah Greenwood K-8 School,2,43,00350308,,183,35.60 +Boston,Gardner Pilot Academy,2,41,00350326,,199,31.60 +Boston,Thomas J. Kenny Elementary School,2,61,00350328,,153,33.40 +Boston,Warren/Prescott K-8 School,2,112,00350346,,236,48.10 +Boston,William E. Channing Elementary School,2,18,00350360,,69,23.70 +Boston,William McKinley School,2,78,00350363,,252,58.50 +Boston,William E. Russell Elementary School,2,97,00350366,,87,34.40 +Boston,William Monroe Trotter K-8 School,2,105,00350370,,165,31.80 +Boston,F. Lyman Winship Elementary School,2,114,00350374,,32,23.00 +Boston,Thomas Edison K-8 School,2,32,00350375,,278,57.30 +Boston,"Martin Luther King, Jr. K-8 School",2,63,00350376,,231,55.70 +Boston,Higginson-Lewis School,2,52,00350377,,190,27.40 +Boston,Mildred Avenue K-8 School,2,80,00350378,,464,55.90 +Boston,Young Achievers Science and Math K-8 School,2,116,00350380,,314,54.50 +Boston,Mission Hill K-8 School,2,81,00350382,,107,24.50 +Boston,Lilla G. Frederick Middle School,2,40,00350383,,381,40.30 +Boston,Blackstone Innovation School,2,6,00350390,,156,55.70 +Boston,Clarence R. Edwards Middle School,2,33,00350430,,206,25.80 +Boston,Washington Irving Middle School,2,56,00350445,,184,27.80 +Boston,James P. Timilty Middle School,2,103,00350485,,233,31.70 +Boston,Brighton High School,2,16,00350505,,402,49.80 +Boston,Boston International Newcomers Academy,2,11,00350507,,398,54.10 +Boston,Charlestown High School,2,19,00350515,,785,95.10 +Boston,Community Academy,2,22,00350518,,51,12.70 +Boston,Excel High School,2,38,00350522,,471,49.90 +Boston,Jeremiah E. Burke High School,2,17,00350525,,390,34.90 +Boston,East Boston High School,2,31,00350530,,1055,89.60 +Boston,English High School,2,36,00350535,,518,58.10 +Boston,Madison Park Technical Vocational High School,2,68,00350537,,1043,128.10 +Boston,Fenway High School,2,39,00350540,,388,37.30 +Boston,Another Course to College,2,3,00350541,,236,25.00 +Boston,New Mission High School,2,85,00350542,,481,44.90 +Boston,Greater Egleston High School,2,42,00350543,,114,10.70 +Boston,Boston Latin Academy,2,12,00350545,,1787,94.00 +Boston,Boston Arts Academy,2,7,00350546,,482,53.00 +Boston,Margarita Muniz Academy,2,83,00350549,,315,27.70 +Boston,Boston Community Leadership Academy,2,8,00350558,,478,44.60 +Boston,Boston Latin School,2,13,00350560,,2483,126.00 +Boston,John D. O'Bryant School of Mathematics and Science,2,86,00350575,,1624,110.20 +Boston,Urban Science Academy,2,111,00350579,,#N/A,#N/A +Boston,Community Academy of Science and Health,2,23,00350581,,334,41.20 +Boston,Mary Lyon High School,2,67,00350655,,137,16.60 +Boston,Mario Umana Academy,2,107,00350656,,500,64.00 +Boston,TechBoston Academy,2,102,00350657,,901,95.00 +Boston,West Roxbury Academy,2,113,00350658,,#N/A,#N/A +Boston,Snowden International School at Copley,2,99,00350690,,483,44.00 +Boston,Rafael Hernandez K-8 School,2,51,00350691,,177,28.30 +Boston,Horace Mann School for the Deaf and Hard of Hearing,2,54,00350750,,50,35.50 +Boston,Boston Collaborative High School,2,29,00350755,,160,15.30 +Boston,Boston Adult Technical Academy ,2,118,00351002,,#N/A,#N/A +Boston,Boston Day and Evening Academy,2,9,00441006,,#N/A,#N/A +Lowell,Cardinal O'Connell Alternative School,3,3,01600001,,0,9.00 +Lowell,Bailey Elementary School,3,1,01600002,,90,35.00 +Lowell,STEM Academy at the Rogers School,3,20,01600005,,510,59.00 +Lowell,McAvinnue Elementary School,3,10,01600010,,86,39.00 +Lowell,Greenhalge Elementary School,3,5,01600015,,88,37.00 +Lowell,Pyne Arts School,3,15,01600018,,264,38.20 +Lowell,Abraham Lincoln Elementary School,3,52,01600020,,90,39.00 +Revere,Lincoln Elementary School,4,5,02480025,,175,39.10 +Winchester,Lincoln Elementary School,6,2,03440005,,157,30.20 +Lowell,Moody Elementary School,3,11,01600027,,43,17.80 +Lowell,Morey Elementary School,3,12,01600030,,88,37.00 +Lowell,Pawtucketville Memorial Elementary School,3,14,01600036,,91,34.00 +Lowell,Reilly Elementary School,3,16,01600040,,89,32.20 +Lowell,Shaughnessy Elementary School,3,19,01600050,,92,38.00 +Lowell,Washington Elementary School,3,25,01600055,,46,23.00 +Lowell,McAuliffe Elementary School,3,9,01600075,,91,37.00 +Lowell,Murkland Elementary School,3,13,01600080,,87,35.00 +Lowell,Laura Lee Therapeutic Day School,3,6,01600085,,23,6.80 +Lowell,Bartlett Community Partnership School,3,26,01600090,,256,40.80 +Lowell,Butler Middle School,3,2,01600310,,550,42.40 +Lowell,Daley Middle School,3,4,01600315,,691,50.20 +Lowell,LeBlanc Therapeutic Day School,3,7,01600320,,36,7.30 +Lowell,Robinson Middle School,3,18,01600330,,658,45.40 +Lowell,Sullivan Middle School,3,22,01600340,,641,47.00 +Lowell,Wang Middle School,3,24,01600345,,668,46.00 +Lowell,Stoklosa Middle School,3,21,01600360,,656,53.60 +Lowell,Lowell High School,3,8,01600505,,3048,212.90 +Lowell,The Career Academy,3,23,01600515,,94,9.90 +Lowell,Adie Day School,3,51,01600605,,32,11.00 +Lowell,Riverside School,3,17,01600920,,#N/A,#N/A +Milford,Memorial Elementary School,7,4,01850010,,0,38.40 +Milford,Brookside Elementary School,7,3,01850065,,0,39.40 +Milford,Shining Star Early Childhood Center,7,5,01850075,,0,7.60 +Milford,Woodland Elementary School,7,1,01850090,,656,81.20 +Milford,Stacy Middle School,7,26,01850305,,1032,76.40 +Milford,Milford High School,7,2,01850505,,1257,95.20 +Revere,Whelan Elementary School,4,7,02480003,,256,53.50 +Revere,Beachmont Elementary School,4,1,02480013,,97,29.00 +Revere,Rumney Marsh Academy,4,9,02480014,,600,50.50 +Revere,Hill Elementary School,4,4,02480035,,237,47.50 +Revere,Paul Revere Elementary School,4,6,02480050,,159,41.50 +Revere,Garfield Elementary School,4,2,02480056,,201,57.80 +Revere,Garfield Middle School,4,3,02480057,,568,44.90 +Revere,Susan B. Anthony Middle School,4,8,02480305,,575,49.00 +Revere,Revere High School,4,10,02480505,,1978,135.60 +Revere,Seacoast High School,4,11,02480520,,81,12.80 +Somerville,Michael E. Capuano Early Childhood Center,5,12,02740005,,0,23.30 +Somerville,Benjamin G. Brown School,5,2,02740015,,78,15.80 +Somerville,Arthur D. Healey School,5,1,02740075,,235,42.80 +Somerville,Dr. Albert F. Argenziano School at Lincoln Park,5,3,02740087,,290,45.70 +Somerville,East Somerville Community School,5,4,02740111,,392,54.20 +Somerville,West Somerville Neighborhood School,5,9,02740115,,193,29.30 +Somerville,Winter Hill Community Innovation School,5,10,02740120,,230,46.70 +Somerville,Somerville High School,5,8,02740505,,1215,113.20 +Somerville,Next Wave/Full Circle,5,5,02740510,,56,10.70 +Wareham,John William Decas Elementary School,8,1,03100003,,0,48.50 +Wareham,Minot Forest Elementary School,8,2,03100017,,134,25.70 +Wareham,Wareham Middle School,8,3,03100305,,533,36.00 +Wareham,Wareham Cooperative Alternative School,8,8,03100315,,33,2.60 +Wareham,Wareham High School,8,4,03100505,,585,59.20 +Winchester,Lynch Elementary School,6,3,03440020,,158,43.20 +Winchester,Vinson-Owen Elementary School,6,5,03440025,,136,36.30 +Winchester,Muraco Elementary School,6,4,03440040,,136,25.30 +Winchester,Ambrose Elementary School,6,1,03440045,,130,30.20 +Winchester,McCall Middle School,6,6,03440305,,1084,85.30 +Winchester,Winchester High School,6,7,03440505,,1403,98.20 +Boston,Dudley Street Neighborhood Charter School,2,30,04070405,,77,10.30 +Boston,Boston Green Academy,2,10,04110305,,509,57.50 +Boston,UP Academy Boston,2,108,04800405,,349,35.30 +Boston,UP Academy Dorchester,2,109,35050405,,354,45.70 \ No newline at end of file diff --git a/db/migrate/20220124144902_create_respondents.rb b/db/migrate/20220124144902_create_respondents.rb new file mode 100644 index 00000000..050221c0 --- /dev/null +++ b/db/migrate/20220124144902_create_respondents.rb @@ -0,0 +1,12 @@ +class CreateRespondents < ActiveRecord::Migration[7.0] + def change + create_table :respondents do |t| + t.references :school, null: false, foreign_key: true + t.references :academic_year, null: false, foreign_key: true + t.float :total_students + t.float :total_teachers + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 885e503a..9f5639bb 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2021_12_17_164449) do +ActiveRecord::Schema.define(version: 2022_01_24_144902) do # These are extensions that must be enabled in order to support this database enable_extension "pg_stat_statements" @@ -272,6 +272,17 @@ ActiveRecord::Schema.define(version: 2021_12_17_164449) do t.index ["subcategory_id"], name: "index_measures_on_subcategory_id" end + create_table "respondents", force: :cascade do |t| + t.bigint "school_id", null: false + t.bigint "academic_year_id", null: false + t.float "total_students" + t.float "total_teachers" + t.datetime "created_at", precision: 6, null: false + t.datetime "updated_at", precision: 6, null: false + t.index ["academic_year_id"], name: "index_respondents_on_academic_year_id" + t.index ["school_id"], name: "index_respondents_on_school_id" + end + create_table "schools", force: :cascade do |t| t.string "name" t.integer "district_id" @@ -327,6 +338,8 @@ ActiveRecord::Schema.define(version: 2021_12_17_164449) do add_foreign_key "legacy_school_categories", "legacy_categories", column: "category_id" add_foreign_key "legacy_school_categories", "legacy_schools", column: "school_id" add_foreign_key "measures", "subcategories" + add_foreign_key "respondents", "academic_years" + add_foreign_key "respondents", "schools" add_foreign_key "subcategories", "categories" add_foreign_key "survey_item_responses", "academic_years" add_foreign_key "survey_item_responses", "schools" diff --git a/db/seeds.rb b/db/seeds.rb index e185346b..35652a4b 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -4,4 +4,5 @@ seeder = Seeder.new seeder.seed_academic_years '2020-21', '2021-22' seeder.seed_districts_and_schools Rails.root.join('data', 'master_list_of_schools_and_districts.csv') +seeder.seed_respondents Rails.root.join('data', 'master_list_of_schools_and_districts.csv') seeder.seed_sqm_framework Rails.root.join('data', 'sqm_framework.csv') diff --git a/spec/factories.rb b/spec/factories.rb index 7afc1ef1..8e3c0042 100644 --- a/spec/factories.rb +++ b/spec/factories.rb @@ -86,4 +86,9 @@ FactoryBot.define do description { rand.to_s } measure end + + factory :respondent do + school + academic_year + end end diff --git a/spec/fixtures/sample_districts_and_schools.csv b/spec/fixtures/sample_districts_and_schools.csv index 5caecd2c..2368a5f3 100644 --- a/spec/fixtures/sample_districts_and_schools.csv +++ b/spec/fixtures/sample_districts_and_schools.csv @@ -1,3 +1,3 @@ -District,School Name,District Code,School Code,DESE School ID -Attleboro,Attleboro High School,1,1,00160505 -Boston,Samuel Adams Elementary School,2,1,00350302 +District,School Name,District Code,School Code,DESE School ID,School Closed In ,Total Students for Response Rate (2020-21),Total Teachers for Response Rate (2020-21) +Attleboro,Attleboro High School,1,1,00160505,,1792,114.70 +Boston,Samuel Adams Elementary School,2,1,00350302,,79,28.40 diff --git a/spec/lib/seeder_spec.rb b/spec/lib/seeder_spec.rb index 250633c0..ac775fcd 100644 --- a/spec/lib/seeder_spec.rb +++ b/spec/lib/seeder_spec.rb @@ -41,7 +41,7 @@ describe Seeder do context 'when partial data already exists' do let!(:existing_district) { create(:district, name: 'Boston') } let!(:removed_school) do - create(:school, name: 'John Oldes Academy', dese_id: 12_345, district: existing_district) + create(:school, name: 'John Oldest Academy', dese_id: 12_345, district: existing_district) end let!(:removed_survey_item_response) { create(:survey_item_response, school: removed_school) } let!(:existing_school) do @@ -87,6 +87,31 @@ describe Seeder do end end + context 'respondents' do + before :each do + create(:academic_year, range: '2020-21') + seeder.seed_districts_and_schools sample_districts_and_schools_csv + end + + it 'seeds the total number of respondents for a school' do + expect do + seeder.seed_respondents sample_districts_and_schools_csv + end.to change { Respondent.count }.by(2) + end + + it 'seeds idempotently' do + expect do + seeder.seed_respondents sample_districts_and_schools_csv + end.to change { Respondent.count }.by(2) + + expect(Respondent.all.count).to eq 2 + + expect do + seeder.seed_respondents sample_districts_and_schools_csv + end.to change { Respondent.count }.by(0) + end + end + context 'the sqm framework' do before do school_culture_category = create(:category, category_id: '2', sort_index: -1) diff --git a/spec/models/survey_item_response_spec.rb b/spec/models/survey_item_response_spec.rb index 3952c473..d956f1ff 100644 --- a/spec/models/survey_item_response_spec.rb +++ b/spec/models/survey_item_response_spec.rb @@ -27,10 +27,15 @@ describe SurveyItemResponse, type: :model do academic_year: ay).average).to eq 4 end - it 'affirms that the result meets the threshold' do + it 'affirms that the result meets the teacher threshold' do expect(SurveyItemResponse.score_for_measure(measure: measure, school: school, academic_year: ay).meets_teacher_threshold?).to be true end + + it 'reports the result does not meeet student threshold' do + expect(SurveyItemResponse.score_for_measure(measure: measure, school: school, + academic_year: ay).meets_student_threshold?).to be false + end end context "and the average number of responses across the measure's survey items meets the teacher threshold of 17" do @@ -113,10 +118,14 @@ describe SurveyItemResponse, type: :model do academic_year: ay).average).to eq 4 end - it 'affirms that the result meets the threshold' do + it 'affirms that the result meets the student threshold' do expect(SurveyItemResponse.score_for_measure(measure: measure, school: school, academic_year: ay).meets_student_threshold?).to be true end + it 'notes that the result does not meet the teacher threshold' do + expect(SurveyItemResponse.score_for_measure(measure: measure, school: school, + academic_year: ay).meets_teacher_threshold?).to be false + end end context "and the average number of responses across the measure's survey items meets the student threshold of 196" do @@ -297,4 +306,61 @@ describe SurveyItemResponse, type: :model do academic_year: ay)).to eq 2.5 end end + + describe '.responses_for_measure' do + let(:subcategory) { create(:subcategory) } + let(:sufficient_measure_1) { create(:measure, subcategory: subcategory) } + let(:sufficient_measure_2) { create(:measure, subcategory: subcategory) } + let(:insufficient_measure) { create(:measure, subcategory: subcategory) } + let(:sufficient_teacher_survey_item) { create(:teacher_survey_item, measure: sufficient_measure_1) } + let(:insufficient_teacher_survey_item) { create(:teacher_survey_item, measure: insufficient_measure) } + let(:sufficient_student_survey_item) { create(:student_survey_item, measure: sufficient_measure_2) } + let(:insufficient_student_survey_item) { create(:student_survey_item, measure: insufficient_measure) } + + before :each do + create_list(:survey_item_response, SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD, survey_item: sufficient_teacher_survey_item, + academic_year: ay, school: school, likert_score: 1) + create_list(:survey_item_response, SurveyItemResponse::STUDENT_RESPONSE_THRESHOLD, survey_item: sufficient_student_survey_item, + academic_year: ay, school: school, likert_score: 4) + create_list(:survey_item_response, SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD - 1, + survey_item: insufficient_teacher_survey_item, academic_year: ay, school: school, likert_score: 1) + create_list(:survey_item_response, SurveyItemResponse::STUDENT_RESPONSE_THRESHOLD - 1, + survey_item: insufficient_student_survey_item, academic_year: ay, school: school, likert_score: 1) + end + + it 'returns only responses in a measure that meets the low threshold' do + expect(SurveyItemResponse.responses_for_measure(measure: sufficient_measure_1, school: school, academic_year: ay).count).to eq SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD + expect(SurveyItemResponse.responses_for_measure(measure: sufficient_measure_2, school: school, academic_year: ay).count).to eq SurveyItemResponse::STUDENT_RESPONSE_THRESHOLD + expect(SurveyItemResponse.responses_for_measure(measure: insufficient_measure, school: school, academic_year: ay)).to be nil + end + end + + describe '.average_number_of_student_respondents' do + let(:subcategory) { create(:subcategory) } + let(:sufficient_measure_1) { create(:measure, subcategory: subcategory) } + let(:sufficient_measure_2) { create(:measure, subcategory: subcategory) } + let(:insufficient_measure) { create(:measure, subcategory: subcategory) } + let(:sufficient_teacher_survey_item) { create(:teacher_survey_item, measure: sufficient_measure_1) } + let(:sufficient_student_survey_item_1) { create(:student_survey_item, measure: sufficient_measure_1) } + let(:insufficient_teacher_survey_item) { create(:teacher_survey_item, measure: insufficient_measure) } + let(:sufficient_student_survey_item_2) { create(:student_survey_item, measure: sufficient_measure_2) } + let(:insufficient_student_survey_item) { create(:student_survey_item, measure: insufficient_measure) } + + before :each do + create_list(:survey_item_response, SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD, survey_item: sufficient_teacher_survey_item, + academic_year: ay, school: school, likert_score: 1) + create_list(:survey_item_response, SurveyItemResponse::STUDENT_RESPONSE_THRESHOLD, survey_item: sufficient_student_survey_item_1, + academic_year: ay, school: school, likert_score: 4) + create_list(:survey_item_response, SurveyItemResponse::STUDENT_RESPONSE_THRESHOLD + 1, survey_item: sufficient_student_survey_item_2, + academic_year: ay, school: school, likert_score: 4) + create_list(:survey_item_response, SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD - 1, + survey_item: insufficient_teacher_survey_item, academic_year: ay, school: school, likert_score: 1) + create_list(:survey_item_response, SurveyItemResponse::STUDENT_RESPONSE_THRESHOLD - 1, + survey_item: insufficient_student_survey_item, academic_year: ay, school: school, likert_score: 1) + end + + it 'returns only responses in a measure that meets the low threshold' do + expect(SurveyItemResponse.average_number_of_student_respondents(subcategory: subcategory, school: school, academic_year: ay)).to eq SurveyItemResponse::STUDENT_RESPONSE_THRESHOLD + end + end end diff --git a/spec/presenters/subcategory_presenter_spec.rb b/spec/presenters/subcategory_presenter_spec.rb index d5205995..0d29e23f 100644 --- a/spec/presenters/subcategory_presenter_spec.rb +++ b/spec/presenters/subcategory_presenter_spec.rb @@ -6,22 +6,38 @@ describe SubcategoryPresenter do let(:subcategory) do create(:subcategory, name: 'A great subcategory', subcategory_id: 'A', description: 'A great description') end + let(:survey_respondents) do + create(:respondent, school: school, total_students: SurveyItemResponse::STUDENT_RESPONSE_THRESHOLD, total_teachers: 10.0, academic_year: academic_year) + end let(:subcategory_presenter) do + survey_respondents measure1 = create(:measure, subcategory: subcategory) survey_item1 = create(:teacher_survey_item, measure: measure1, watch_low_benchmark: 4, growth_low_benchmark: 4.25, approval_low_benchmark: 4.5, ideal_low_benchmark: 4.75) + survey_item2 = create(:student_survey_item, measure: measure1, watch_low_benchmark: 4, growth_low_benchmark: 4.25, + approval_low_benchmark: 4.5, ideal_low_benchmark: 4.75) create_list(:survey_item_response, SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD, survey_item: survey_item1, academic_year: academic_year, school: school, likert_score: 1) create_list(:survey_item_response, SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD, survey_item: survey_item1, academic_year: academic_year, school: school, likert_score: 5) + create_list(:survey_item_response, SurveyItemResponse::STUDENT_RESPONSE_THRESHOLD / 2, survey_item: survey_item2, + academic_year: academic_year, school: school, likert_score: 3) + create_list(:survey_item_response, SurveyItemResponse::STUDENT_RESPONSE_THRESHOLD / 2, survey_item: survey_item2, + academic_year: academic_year, school: school, likert_score: 3) measure2 = create(:measure, subcategory: subcategory) - survey_item2 = create(:teacher_survey_item, measure: measure2, watch_low_benchmark: 1.25, + survey_item3 = create(:teacher_survey_item, measure: measure2, watch_low_benchmark: 1.25, + growth_low_benchmark: 1.5, approval_low_benchmark: 1.75, ideal_low_benchmark: 2.0) + survey_item4 = create(:student_survey_item, measure: measure2, watch_low_benchmark: 1.25, growth_low_benchmark: 1.5, approval_low_benchmark: 1.75, ideal_low_benchmark: 2.0) - create_list(:survey_item_response, SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD, survey_item: survey_item2, + create_list(:survey_item_response, SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD, survey_item: survey_item3, academic_year: academic_year, school: school, likert_score: 1) - create_list(:survey_item_response, SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD, survey_item: survey_item2, + create_list(:survey_item_response, SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD, survey_item: survey_item3, academic_year: academic_year, school: school, likert_score: 5) + create_list(:survey_item_response, SurveyItemResponse::STUDENT_RESPONSE_THRESHOLD / 2, survey_item: survey_item4, + academic_year: academic_year, school: school, likert_score: 3) + create_list(:survey_item_response, SurveyItemResponse::STUDENT_RESPONSE_THRESHOLD / 2, survey_item: survey_item4, + academic_year: academic_year, school: school, likert_score: 3) measure_of_only_admin_data = create(:measure, subcategory: subcategory) create(:admin_data_item, measure: measure_of_only_admin_data, watch_low_benchmark: 2, growth_low_benchmark: 3, @@ -49,6 +65,14 @@ describe SubcategoryPresenter do expect(subcategory_presenter.gauge_presenter.title).to eq 'Growth' end + it 'returns the student response rate' do + expect(subcategory_presenter.student_response_rate).to eq 100.0 + end + + # it 'returns the teacher response rate' do + # expect(subcategory_presenter.teacher_response_rate).to eq 20.0 + # end + it 'creates a measure presenter for each measure in a subcategory' do expect(subcategory_presenter.measure_presenters.count).to eq subcategory.measures.count end