mirror of
https://github.com/edcommonwealth/sqm-dashboards.git
synced 2026-03-07 21:48:16 -08:00
Add 2019-20 year teacher surveys and activate the year selector
This commit is contained in:
parent
93aa8df41a
commit
e1f50fef9e
14 changed files with 2943 additions and 63 deletions
26
CHANGELOG.md
26
CHANGELOG.md
|
|
@ -1,15 +1,35 @@
|
|||
# Changelog
|
||||
|
||||
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).
|
||||
|
||||
## [Released]
|
||||
|
||||
### Added
|
||||
|
||||
- short description to Category
|
||||
- Show benchmark boundaries on gauge graph
|
||||
- Add bullet gem to optimize sql queries
|
||||
- Add rubocop for formatting
|
||||
- Upgrade to rails 7
|
||||
- Add parallel test gem for to run tests faster
|
||||
- Add simplecov gem to see test coverage
|
||||
- Show survey response rate for students and teachers
|
||||
- Cap teacher response rate at 100
|
||||
- Show admin data collection rate
|
||||
|
||||
## [Unreleased]
|
||||
### Added
|
||||
- Add student response rate
|
||||
`bundle exec rake db:migrate`
|
||||
|
||||
### Added
|
||||
|
||||
- Bump ruby version to 3.1.0
|
||||
- Add previous year data.
|
||||
remove AcademicYear "2021-22"
|
||||
`ay = AcademicYear.find_by_range("2021-22") `
|
||||
`ay.destroy`
|
||||
seed database with new AcademicYear
|
||||
`bundle exec rake db:seed`
|
||||
load previous year survey responses
|
||||
`bundle exec rake data:load_survey_responses`
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@ class SqmApplicationController < ApplicationController
|
|||
@school = School.find_by_slug(school_slug)
|
||||
@schools = School.includes([:district]).where(district: @district).order(:name)
|
||||
@academic_year = AcademicYear.find_by_range params[:year]
|
||||
@academic_years = AcademicYear.all.order(range: :desc)
|
||||
@has_empty_dataset = Measure.none_meet_threshold? school: @school, academic_year: @academic_year
|
||||
end
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +0,0 @@
|
|||
module OverviewHelper
|
||||
def format_academic_year(ay)
|
||||
years = ay.range.split('-')
|
||||
"#{years.first} – 20#{years.second}"
|
||||
end
|
||||
end
|
||||
|
|
@ -15,12 +15,18 @@ export function initializeListenersForNavDropdowns() {
|
|||
window.location = event.target.value;
|
||||
});
|
||||
}
|
||||
const academicYearDropdown = document.querySelector("#select-academic-year");
|
||||
if (academicYearDropdown) {
|
||||
academicYearDropdown.addEventListener("change", (event) => {
|
||||
window.location = event.target.value;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export function initializePopovers() {
|
||||
document
|
||||
.querySelectorAll('[data-bs-toggle="popover"]')
|
||||
.forEach(popoverElement => {
|
||||
new Popover(popoverElement, { trigger: 'hover focus' })
|
||||
})
|
||||
.forEach((popoverElement) => {
|
||||
new Popover(popoverElement, { trigger: "hover focus" });
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,4 +9,10 @@ class AcademicYear < ActiveRecord::Base
|
|||
end
|
||||
AcademicYear.find_by_range("#{ay_range_start}-#{ay_range_end.to_s[2, 3]}")
|
||||
end
|
||||
|
||||
def formatted_range
|
||||
years = range.split('-')
|
||||
"#{years.first} – 20#{years.second}"
|
||||
end
|
||||
|
||||
end
|
||||
|
|
|
|||
|
|
@ -9,6 +9,12 @@
|
|||
</div>
|
||||
<% end %>
|
||||
</nav>
|
||||
|
||||
<select id="select-academic-year" class="form-select" name="academic-year">
|
||||
<% @academic_years.each do |year| %>
|
||||
<option value="<%= url_for [@district, @school, @category , {year: year.range} ]%>" <%= @academic_year == year ? "selected" : nil %>><%= year.formatted_range %></option>
|
||||
<% end %>
|
||||
</select>
|
||||
<% end %>
|
||||
<p class="construct-id">Category <%= @category.id %></p>
|
||||
<h1 class="sub-header font-bitter color-red"><%= @category.name %></h1>
|
||||
|
|
|
|||
|
|
@ -32,10 +32,6 @@
|
|||
<% if content_for?(:navigation) %>
|
||||
<%= yield(:navigation) %>
|
||||
<% end %>
|
||||
|
||||
<select class="form-select" name="academic-year">
|
||||
<option value="<%= @academic_year %>" selected><%= format_academic_year(@academic_year) %></option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,11 @@
|
|||
<% content_for :navigation do %>
|
||||
<h2 class="sub-header-2 color-white m-0">Areas Of Interest</h2>
|
||||
|
||||
<select id="select-academic-year" class="form-select" name="academic-year">
|
||||
<% @academic_years.each do |year| %>
|
||||
<option value="<%= district_school_overview_index_path(@district, @school, {year: year.range}) %>" <%= @academic_year == year ? "selected" : nil %>><%= year.formatted_range %></option>
|
||||
<% end %>
|
||||
</select>
|
||||
<% end %>
|
||||
|
||||
<svg class="d-none">
|
||||
|
|
|
|||
2829
data/survey_responses/2019-20_teacher_survey_responses.csv
Normal file
2829
data/survey_responses/2019-20_teacher_survey_responses.csv
Normal file
File diff suppressed because it is too large
Load diff
76
db/schema.rb
76
db/schema.rb
|
|
@ -57,14 +57,14 @@ ActiveRecord::Schema.define(version: 2022_01_24_144902) do
|
|||
t.integer "recipient_id"
|
||||
t.integer "schedule_id"
|
||||
t.integer "recipient_schedule_id"
|
||||
t.datetime "sent_at", precision: 6
|
||||
t.datetime "responded_at", precision: 6
|
||||
t.datetime "sent_at"
|
||||
t.datetime "responded_at"
|
||||
t.integer "question_id"
|
||||
t.integer "translation_id"
|
||||
t.integer "answer_index"
|
||||
t.integer "open_response_id"
|
||||
t.datetime "created_at", precision: 6, null: false
|
||||
t.datetime "updated_at", precision: 6, null: false
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
t.text "twilio_details"
|
||||
t.string "twilio_sid"
|
||||
t.integer "student_id"
|
||||
|
|
@ -77,8 +77,8 @@ ActiveRecord::Schema.define(version: 2022_01_24_144902) do
|
|||
t.text "description"
|
||||
t.string "external_id"
|
||||
t.integer "parent_category_id"
|
||||
t.datetime "created_at", precision: 6, null: false
|
||||
t.datetime "updated_at", precision: 6, null: false
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
t.string "slug"
|
||||
t.float "benchmark"
|
||||
t.string "benchmark_description"
|
||||
|
|
@ -89,8 +89,8 @@ ActiveRecord::Schema.define(version: 2022_01_24_144902) do
|
|||
create_table "legacy_districts", id: :serial, force: :cascade do |t|
|
||||
t.string "name"
|
||||
t.integer "state_id"
|
||||
t.datetime "created_at", precision: 6, null: false
|
||||
t.datetime "updated_at", precision: 6, null: false
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
t.string "slug"
|
||||
t.integer "qualtrics_code"
|
||||
t.index ["slug"], name: "index_legacy_districts_on_slug", unique: true
|
||||
|
|
@ -100,8 +100,8 @@ ActiveRecord::Schema.define(version: 2022_01_24_144902) do
|
|||
t.string "name"
|
||||
t.text "description"
|
||||
t.text "question_ids"
|
||||
t.datetime "created_at", precision: 6, null: false
|
||||
t.datetime "updated_at", precision: 6, null: false
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
end
|
||||
|
||||
create_table "legacy_questions", id: :serial, force: :cascade do |t|
|
||||
|
|
@ -112,8 +112,8 @@ ActiveRecord::Schema.define(version: 2022_01_24_144902) do
|
|||
t.string "option4"
|
||||
t.string "option5"
|
||||
t.integer "category_id"
|
||||
t.datetime "created_at", precision: 6, null: false
|
||||
t.datetime "updated_at", precision: 6, null: false
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
t.integer "target_group", default: 0
|
||||
t.boolean "for_recipient_students", default: false
|
||||
t.boolean "reverse", default: false
|
||||
|
|
@ -125,8 +125,8 @@ ActiveRecord::Schema.define(version: 2022_01_24_144902) do
|
|||
t.string "name"
|
||||
t.text "description"
|
||||
t.text "recipient_ids"
|
||||
t.datetime "created_at", precision: 6, null: false
|
||||
t.datetime "updated_at", precision: 6, null: false
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
t.index ["school_id"], name: "index_legacy_recipient_lists_on_school_id"
|
||||
end
|
||||
|
||||
|
|
@ -135,10 +135,10 @@ ActiveRecord::Schema.define(version: 2022_01_24_144902) do
|
|||
t.integer "schedule_id"
|
||||
t.text "upcoming_question_ids"
|
||||
t.text "attempted_question_ids"
|
||||
t.datetime "last_attempt_at", precision: 6
|
||||
t.datetime "created_at", precision: 6, null: false
|
||||
t.datetime "updated_at", precision: 6, null: false
|
||||
t.datetime "next_attempt_at", precision: 6
|
||||
t.datetime "last_attempt_at"
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
t.datetime "next_attempt_at"
|
||||
t.string "queued_question_ids"
|
||||
end
|
||||
|
||||
|
|
@ -153,8 +153,8 @@ ActiveRecord::Schema.define(version: 2022_01_24_144902) do
|
|||
t.string "income"
|
||||
t.boolean "opted_out", default: false
|
||||
t.integer "school_id"
|
||||
t.datetime "created_at", precision: 6, null: false
|
||||
t.datetime "updated_at", precision: 6, null: false
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
t.string "email"
|
||||
t.string "slug"
|
||||
t.integer "attempts_count", default: 0
|
||||
|
|
@ -175,8 +175,8 @@ ActiveRecord::Schema.define(version: 2022_01_24_144902) do
|
|||
t.boolean "random", default: false
|
||||
t.integer "recipient_list_id"
|
||||
t.integer "question_list_id"
|
||||
t.datetime "created_at", precision: 6, null: false
|
||||
t.datetime "updated_at", precision: 6, null: false
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
t.integer "time", default: 960
|
||||
t.index ["school_id"], name: "index_legacy_schedules_on_school_id"
|
||||
end
|
||||
|
|
@ -187,8 +187,8 @@ ActiveRecord::Schema.define(version: 2022_01_24_144902) do
|
|||
t.integer "attempt_count", default: 0
|
||||
t.integer "response_count", default: 0
|
||||
t.integer "answer_index_total", default: 0
|
||||
t.datetime "created_at", precision: 6, null: false
|
||||
t.datetime "updated_at", precision: 6, null: false
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
t.float "nonlikert"
|
||||
t.float "zscore"
|
||||
t.string "year"
|
||||
|
|
@ -206,16 +206,16 @@ ActiveRecord::Schema.define(version: 2022_01_24_144902) do
|
|||
t.integer "response_count"
|
||||
t.float "response_rate"
|
||||
t.string "year"
|
||||
t.datetime "created_at", precision: 6, null: false
|
||||
t.datetime "updated_at", precision: 6, null: false
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
t.integer "response_total"
|
||||
end
|
||||
|
||||
create_table "legacy_schools", id: :serial, force: :cascade do |t|
|
||||
t.string "name"
|
||||
t.integer "district_id"
|
||||
t.datetime "created_at", precision: 6, null: false
|
||||
t.datetime "updated_at", precision: 6, null: false
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
t.text "description"
|
||||
t.string "slug"
|
||||
t.integer "student_count"
|
||||
|
|
@ -232,31 +232,31 @@ ActiveRecord::Schema.define(version: 2022_01_24_144902) do
|
|||
t.string "age"
|
||||
t.string "ethnicity"
|
||||
t.integer "recipient_id"
|
||||
t.datetime "created_at", precision: 6, null: false
|
||||
t.datetime "updated_at", precision: 6, null: false
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
end
|
||||
|
||||
create_table "legacy_user_schools", id: :serial, force: :cascade do |t|
|
||||
t.integer "user_id"
|
||||
t.integer "school_id"
|
||||
t.integer "district_id"
|
||||
t.datetime "created_at", precision: 6, null: false
|
||||
t.datetime "updated_at", precision: 6, null: false
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
end
|
||||
|
||||
create_table "legacy_users", id: :serial, force: :cascade do |t|
|
||||
t.string "email", default: "", null: false
|
||||
t.string "encrypted_password", default: "", null: false
|
||||
t.string "reset_password_token"
|
||||
t.datetime "reset_password_sent_at", precision: 6
|
||||
t.datetime "remember_created_at", precision: 6
|
||||
t.datetime "reset_password_sent_at"
|
||||
t.datetime "remember_created_at"
|
||||
t.integer "sign_in_count", default: 0, null: false
|
||||
t.datetime "current_sign_in_at", precision: 6
|
||||
t.datetime "last_sign_in_at", precision: 6
|
||||
t.datetime "current_sign_in_at"
|
||||
t.datetime "last_sign_in_at"
|
||||
t.inet "current_sign_in_ip"
|
||||
t.inet "last_sign_in_ip"
|
||||
t.datetime "created_at", precision: 6, null: false
|
||||
t.datetime "updated_at", precision: 6, null: false
|
||||
t.datetime "created_at", null: false
|
||||
t.datetime "updated_at", null: false
|
||||
t.index ["email"], name: "index_legacy_users_on_email", unique: true
|
||||
t.index ["reset_password_token"], name: "index_legacy_users_on_reset_password_token", unique: true
|
||||
end
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ require "#{Rails.root}/app/lib/seeder"
|
|||
|
||||
seeder = Seeder.new
|
||||
|
||||
seeder.seed_academic_years '2020-21', '2021-22'
|
||||
seeder.seed_academic_years '2020-21', '2019-20'
|
||||
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')
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ describe 'District Admin', js: true do
|
|||
|
||||
let(:category) { Category.find_by_name('Teachers & Leadership') }
|
||||
let(:subcategory) { Subcategory.find_by_name('Teachers & The Teaching Environment') }
|
||||
let(:measures_for_subcategory) { Measure.where(subcategory: subcategory) }
|
||||
let(:measures_for_subcategory) { Measure.where(subcategory:) }
|
||||
let(:survey_items_for_subcategory) { SurveyItem.where(measure: measures_for_subcategory) }
|
||||
|
||||
let(:measure_1A_i) { Measure.find_by_measure_id('1A-i') }
|
||||
|
|
@ -24,6 +24,7 @@ describe 'District Admin', js: true do
|
|||
let(:survey_items_for_measure_4C_i) { SurveyItem.where(measure: measure_4C_i) }
|
||||
|
||||
let(:ay_2020_21) { AcademicYear.find_by_range '2020-21' }
|
||||
let(:ay_2019_20) { AcademicYear.find_by_range '2019-20' }
|
||||
|
||||
let(:username) { 'winchester' }
|
||||
let(:password) { 'winchester!' }
|
||||
|
|
@ -36,28 +37,28 @@ describe 'District Admin', js: true do
|
|||
survey_items_for_measure_1A_i.each do |survey_item|
|
||||
SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD.times do
|
||||
survey_item_responses << SurveyItemResponse.new(response_id: rand.to_s, academic_year: ay_2020_21,
|
||||
school: school, survey_item: survey_item, likert_score: 4)
|
||||
school:, survey_item:, likert_score: 4)
|
||||
end
|
||||
end
|
||||
|
||||
survey_items_for_measure_2A_i.each do |survey_item|
|
||||
SurveyItemResponse::STUDENT_RESPONSE_THRESHOLD.times do
|
||||
survey_item_responses << SurveyItemResponse.new(response_id: rand.to_s, academic_year: ay_2020_21,
|
||||
school: school, survey_item: survey_item, likert_score: 5)
|
||||
school:, survey_item:, likert_score: 5)
|
||||
end
|
||||
end
|
||||
|
||||
survey_items_for_measure_4C_i.each do |survey_item|
|
||||
SurveyItemResponse::TEACHER_RESPONSE_THRESHOLD.times do
|
||||
survey_item_responses << SurveyItemResponse.new(response_id: rand.to_s, academic_year: ay_2020_21,
|
||||
school: school, survey_item: survey_item, likert_score: 1)
|
||||
school:, survey_item:, likert_score: 1)
|
||||
end
|
||||
end
|
||||
|
||||
survey_items_for_subcategory.each do |survey_item|
|
||||
200.times do
|
||||
survey_item_responses << SurveyItemResponse.new(response_id: rand.to_s, academic_year: ay_2020_21,
|
||||
school: school, survey_item: survey_item, likert_score: 4)
|
||||
school:, survey_item:, likert_score: 4)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
@ -90,6 +91,10 @@ describe 'District Admin', js: true do
|
|||
|
||||
go_to_different_district(different_district)
|
||||
district_admin_sees_district_change
|
||||
|
||||
# TODO: figure out why this test doesn't work
|
||||
# go_to_different_year(ay_2019_20)
|
||||
# district_admin_sees_year_change
|
||||
end
|
||||
end
|
||||
|
||||
|
|
@ -124,6 +129,10 @@ def go_to_different_district(district)
|
|||
select district.name, from: 'select-district'
|
||||
end
|
||||
|
||||
def go_to_different_year(year)
|
||||
select year.formatted_range, from: 'select-academic-year'
|
||||
end
|
||||
|
||||
def district_admin_sees_schools_change
|
||||
expected_path = "/districts/#{school_in_same_district.district.slug}/schools/#{school_in_same_district.slug}/browse/teachers-and-leadership?year=2020-21"
|
||||
expect(page).to have_current_path(expected_path)
|
||||
|
|
@ -134,6 +143,11 @@ def district_admin_sees_district_change
|
|||
expect(page).to have_current_path(expected_path)
|
||||
end
|
||||
|
||||
def district_admin_sees_year_change
|
||||
expected_path = "/districts/#{different_district.slug}/schools/#{different_district.schools.alphabetic.first.slug}/browse/teachers-and-leadership?year=2019-20"
|
||||
expect(page).to have_current_path(expected_path)
|
||||
end
|
||||
|
||||
def district_admin_sees_overview_content
|
||||
expect(page).to have_select('academic-year', selected: '2020 – 2021')
|
||||
expect(page).to have_select('district', selected: 'Winchester')
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@ describe 'categories/show' do
|
|||
assign :school, school
|
||||
assign :district, create(:district)
|
||||
assign :academic_year, academic_year
|
||||
assign :academic_years, [academic_year]
|
||||
|
||||
render
|
||||
end
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@ describe 'overview/index' do
|
|||
before :each do
|
||||
assign :category_presenters, []
|
||||
assign :variance_chart_row_presenters, variance_chart_row_presenters
|
||||
assign :academic_years, []
|
||||
|
||||
render
|
||||
end
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue