add first pillar

pull/1/head
rebuilt 3 years ago
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 %>

@ -7,6 +7,9 @@ Rails.application.routes.draw do
end
end
get :reports, to: 'reports#index'
get 'reports/gps', to: 'gps#index'
get '/welcome', to: 'home#index'
root to: 'home#index'
end

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