Add 2019-20 year teacher surveys and activate the year selector

pull/1/head
rebuilt 4 years ago
parent 93aa8df41a
commit e1f50fef9e

@ -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
- 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`
- 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>

@ -11,7 +11,7 @@
<select id="select-district" class="form-select" name="district">
<% @districts.each do |district| %>
<option class="district-options" value="<%= district_url_for(district: district, academic_year: @academic_year) %>" <%= @district.slug == district.slug ? "selected" : nil %>>
<%= district.name %>
<%= district.name %>
</option>
<% end %>
</select>
@ -19,7 +19,7 @@
<select id="select-school" class="ms-3 form-select" name="school">
<% @schools.each do |school| %>
<option class="school-options" value="<%= school_url_for(school: school, academic_year: @academic_year) %>" <%= @school.slug == school.slug ? "selected" : nil %> >
<%= school.name %>
<%= school.name %>
</option>
<% end %>
</select>
@ -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">

File diff suppressed because it is too large Load Diff

@ -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…
Cancel
Save