parent
c0332955f3
commit
8128af200b
@ -0,0 +1,8 @@
|
||||
class GpsController < ActionController::Base
|
||||
def index
|
||||
respond_to do |format|
|
||||
format.html
|
||||
format.csv { send_data Report::Gps.to_csv }
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -0,0 +1,3 @@
|
||||
class ReportsController < ApplicationController
|
||||
def index; end
|
||||
end
|
||||
@ -0,0 +1,32 @@
|
||||
module Report
|
||||
class Gps
|
||||
def self.to_csv
|
||||
headers = ['School', 'Pillar', 'Indicator', 'Period', 'HALS Category', 'Measures', 'Score', 'Zone']
|
||||
attributes = %w[school_name pillar indicator period category measure_ids score zone]
|
||||
pillars = generate_pillars
|
||||
CSV.generate(headers: true) do |csv|
|
||||
csv << headers
|
||||
pillars.each do |gps|
|
||||
csv << attributes.map { |attr| gps.send(attr) }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def self.generate_pillars
|
||||
schools = School.all
|
||||
academic_years = AcademicYear.order(range: :desc).first(2)
|
||||
periods = %w[Current Previous]
|
||||
indicator_1 = 'Teaching'
|
||||
measures_1 = [Measure.find_by_measure_id('1A-iii'), Measure.find_by_measure_id('1B-ii')]
|
||||
|
||||
[].tap do |pillars|
|
||||
schools.each do |school|
|
||||
academic_years.zip(periods).each do |academic_year, period|
|
||||
pillars << Pillar.new(school:, measures: measures_1, indicator: indicator_1, period:,
|
||||
academic_year:)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -0,0 +1,84 @@
|
||||
module Report
|
||||
class Pillar
|
||||
attr_reader :period, :measures, :indicator, :school, :academic_year
|
||||
|
||||
def initialize(school:, period:, measures:, indicator:, academic_year:)
|
||||
@school = school
|
||||
@measures = measures
|
||||
@indicator = indicator
|
||||
@period = period
|
||||
@academic_year = academic_year
|
||||
end
|
||||
|
||||
def school_name
|
||||
school.name
|
||||
end
|
||||
|
||||
def pillar
|
||||
pillars[indicator.to_sym]
|
||||
end
|
||||
|
||||
def score
|
||||
measures.map do |measure|
|
||||
measure.score(school:, academic_year:).average
|
||||
end.flatten.compact.average
|
||||
end
|
||||
|
||||
def category
|
||||
measures.first.category.name
|
||||
end
|
||||
|
||||
def measure_ids
|
||||
measures.map(&:measure_id).join(' & ')
|
||||
end
|
||||
|
||||
def zone
|
||||
zones = Zones.new(watch_low_benchmark:,
|
||||
growth_low_benchmark:,
|
||||
approval_low_benchmark:,
|
||||
ideal_low_benchmark:)
|
||||
|
||||
zones.zone_for_score(score).type.to_s
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def pillars
|
||||
{ "Teaching Environment": 'Operational Efficiency',
|
||||
"Safety": 'Safe and Welcoming Environment',
|
||||
"Relationships": 'Safe and Welcoming Environment',
|
||||
"Academic Orientation": 'Safe and Welcoming Environment',
|
||||
"Facilities & Personnel": 'Operational Efficiency',
|
||||
"Family-School Relationships": 'Family and Community Engagement',
|
||||
"Community Involvement & External Partners": 'Family and Community Engagement',
|
||||
"Perception of Performance": 'Academics and Student Achievement',
|
||||
"Student Commitment To Learning": 'Academics and Student Achievement',
|
||||
"Critical Thinking": 'Academics and Student Achievement',
|
||||
"College & Career Readiness": 'Academics and Student Achievement' }
|
||||
end
|
||||
|
||||
def watch_low_benchmark
|
||||
measures.map do |measure|
|
||||
measure.watch_low_benchmark
|
||||
end.average
|
||||
end
|
||||
|
||||
def growth_low_benchmark
|
||||
measures.map do |measure|
|
||||
measure.growth_low_benchmark
|
||||
end.average
|
||||
end
|
||||
|
||||
def approval_low_benchmark
|
||||
measures.map do |measure|
|
||||
measure.approval_low_benchmark
|
||||
end.average
|
||||
end
|
||||
|
||||
def ideal_low_benchmark
|
||||
measures.map do |measure|
|
||||
measure.ideal_low_benchmark
|
||||
end.average
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -0,0 +1,5 @@
|
||||
<h1>GPS</h1>
|
||||
|
||||
|
||||
<%= link_to "GPS source of truth", 'gps.csv' %>
|
||||
|
||||
@ -0,0 +1,32 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta content="text/html; charset=UTF-8" http-equiv="Content-Type"/>
|
||||
<meta content="width=device-width, initial-scale=1, shrink-to-fit=no" name="viewport"/>
|
||||
<link href="https://fonts.googleapis.com/css?family=Bitter:400,600,700" rel="stylesheet" type="text/css"/>
|
||||
<link href="https://fonts.googleapis.com/css?family=Cabin:400,600,700" rel="stylesheet" type="text/css"/>
|
||||
<title>HALS</title>
|
||||
<%= csp_meta_tag %>
|
||||
<%= stylesheet_link_tag '', media: 'all', 'data-turbo-track': 'reload' %>
|
||||
<%= javascript_include_tag 'application', 'data-turbo-track': 'reload' %>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
|
||||
<div class="bg-color-light-blue">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col mt-7">
|
||||
<%= yield %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- <div> -->
|
||||
<!-- <%= render partial: 'layouts/footer' %> -->
|
||||
<!-- </div> -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
@ -0,0 +1,2 @@
|
||||
<h1>Reports</h1>
|
||||
<%= link_to "gps", reports_gps_path %>
|
||||
@ -0,0 +1,76 @@
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe Report::Pillar, type: :model do
|
||||
let(:school) { create(:school, name: 'Abraham Lincoln Elementary School') }
|
||||
let(:subcategory) { create(:subcategory, subcategory_id: '1A') }
|
||||
let(:measure_1) { create(:measure, measure_id: '1A-iii', subcategory:) }
|
||||
let(:measure_2) { create(:measure, measure_id: '1B-ii', subcategory:) }
|
||||
let(:scale_1) { create(:scale, measure: measure_1) }
|
||||
let(:scale_2) { create(:scale, measure: measure_2) }
|
||||
let(:survey_item_1) { create(:student_survey_item, scale: scale_1) }
|
||||
let(:survey_item_2) do
|
||||
create(:student_survey_item, scale: scale_2, ideal_low_benchmark: 5)
|
||||
end
|
||||
let(:measures) do
|
||||
subcategory.measures
|
||||
end
|
||||
let(:academic_year_1) { create(:academic_year, range: '2017-2018') }
|
||||
let(:academic_year_2) { create(:academic_year, range: '2018-2019') }
|
||||
let(:academic_years) { [academic_year_1, academic_year_2] }
|
||||
|
||||
before :each do
|
||||
create(:respondent, school:, academic_year: academic_year_1)
|
||||
create(:survey, school:, academic_year: academic_year_1)
|
||||
measures
|
||||
end
|
||||
|
||||
context '.pillar' do
|
||||
it 'returns the GPS pillar' do
|
||||
pillar = Report::Pillar.new(school:, measures:, indicator: 'Teaching Environment',
|
||||
period: 'Current', academic_year: academic_year_1)
|
||||
expect(pillar.pillar).to eq('Operational Efficiency')
|
||||
end
|
||||
end
|
||||
|
||||
context '.school' do
|
||||
it 'returns the name of the school' do
|
||||
pillar = Report::Pillar.new(school:, measures:, indicator: 'The Teaching Environment', period: 'Current',
|
||||
academic_year: academic_year_1)
|
||||
expect(pillar.school_name).to eq('Abraham Lincoln Elementary School')
|
||||
end
|
||||
end
|
||||
|
||||
context '.score' do
|
||||
before do
|
||||
create(:survey_item_response, survey_item: survey_item_1, school:, academic_year: academic_year_1,
|
||||
likert_score: 3)
|
||||
create(:survey_item_response, survey_item: survey_item_1, school:, academic_year: academic_year_1,
|
||||
likert_score: 5)
|
||||
end
|
||||
it 'returns the average score for all the measures in the pillar' do
|
||||
pillar = Report::Pillar.new(school:, measures:, indicator: 'The Teaching Environment', period: 'Current',
|
||||
academic_year: academic_year_1)
|
||||
expect(pillar.score).to eq 4
|
||||
end
|
||||
end
|
||||
|
||||
context '.zone' do
|
||||
before do
|
||||
create(:survey_item_response, survey_item: survey_item_1, school:, academic_year: academic_year_1,
|
||||
likert_score: 4)
|
||||
create(:survey_item_response, survey_item: survey_item_1, school:, academic_year: academic_year_1,
|
||||
likert_score: 5)
|
||||
create(:survey_item_response, survey_item: survey_item_2, school:, academic_year: academic_year_1,
|
||||
likert_score: 4)
|
||||
create(:survey_item_response, survey_item: survey_item_2, school:, academic_year: academic_year_1,
|
||||
likert_score: 5)
|
||||
end
|
||||
|
||||
it 'returns the zone for the average score for all the measures in the pillar' do
|
||||
pillar = Report::Pillar.new(school:, measures:, indicator: 'The Teaching Environment', period: 'Current',
|
||||
academic_year: academic_year_1)
|
||||
expect(pillar.score).to eq 4.5
|
||||
expect(pillar.zone).to eq 'approval'
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -0,0 +1,7 @@
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe "Reports", type: :request do
|
||||
describe "GET /index" do
|
||||
pending "add some examples (or delete) #{__FILE__}"
|
||||
end
|
||||
end
|
||||
Loading…
Reference in new issue