From 94a58a87d72fdb6c2d13957a63874bcebba60654 Mon Sep 17 00:00:00 2001 From: rebuilt Date: Tue, 2 Aug 2022 18:16:33 -0700 Subject: [PATCH] Use modules to namespace classes for analyze page --- app/controllers/analyze_controller.rb | 2 +- .../analysis_graph/students_and_teachers.rb | 17 --- .../analysis_graph/students_by_group.rb | 15 -- .../analyze/graph/students_and_teachers.rb | 20 +++ app/models/analyze/graph/students_by_group.rb | 25 ++++ .../column/grouped_bar_column_presenter.rb | 130 ++++++++++++++++++ .../analyze/graph/column/student.rb | 33 +++++ .../analyze/graph/column/teacher.rb | 33 +++++ .../grouped_bar_column_presenter.rb | 117 ---------------- .../student_grouped_bar_column_presenter.rb | 27 ---- .../teacher_grouped_bar_column_presenter.rb | 27 ---- app/views/analyze/_graph_background.html.erb | 2 - app/views/analyze/_grouped_bar_chart.html.erb | 3 +- .../analyze/_grouped_bar_column.html.erb | 1 + lib/tasks/data.rake | 7 +- 15 files changed, 246 insertions(+), 213 deletions(-) delete mode 100644 app/models/analysis_graph/students_and_teachers.rb delete mode 100644 app/models/analysis_graph/students_by_group.rb create mode 100644 app/models/analyze/graph/students_and_teachers.rb create mode 100644 app/models/analyze/graph/students_by_group.rb create mode 100644 app/presenters/analyze/graph/column/grouped_bar_column_presenter.rb create mode 100644 app/presenters/analyze/graph/column/student.rb create mode 100644 app/presenters/analyze/graph/column/teacher.rb delete mode 100644 app/presenters/grouped_bar_column_presenter.rb delete mode 100644 app/presenters/student_grouped_bar_column_presenter.rb delete mode 100644 app/presenters/teacher_grouped_bar_column_presenter.rb diff --git a/app/controllers/analyze_controller.rb b/app/controllers/analyze_controller.rb index ad0f09e9..54877304 100644 --- a/app/controllers/analyze_controller.rb +++ b/app/controllers/analyze_controller.rb @@ -74,7 +74,7 @@ class AnalyzeController < SqmApplicationController end def graphs - @graphs ||= [AnalysisGraph::StudentsAndTeachers.new, AnalysisGraph::StudentsByGroup.new] + @graphs ||= [Analyze::Graph::StudentsAndTeachers.new, Analyze::Graph::StudentsByGroup.new] end def background diff --git a/app/models/analysis_graph/students_and_teachers.rb b/app/models/analysis_graph/students_and_teachers.rb deleted file mode 100644 index bdda0ac1..00000000 --- a/app/models/analysis_graph/students_and_teachers.rb +++ /dev/null @@ -1,17 +0,0 @@ -# frozen_string_literal: true - -module AnalysisGraph - class StudentsAndTeachers - def to_s - 'Students & Teachers' - end - - def value - 'students-and-teachers' - end - - def columns - [StudentGroupedBarColumnPresenter, TeacherGroupedBarColumnPresenter, GroupedBarColumnPresenter] - end - end -end diff --git a/app/models/analysis_graph/students_by_group.rb b/app/models/analysis_graph/students_by_group.rb deleted file mode 100644 index dff36037..00000000 --- a/app/models/analysis_graph/students_by_group.rb +++ /dev/null @@ -1,15 +0,0 @@ -module AnalysisGraph - class StudentsByGroup - def to_s - 'Students by Group' - end - - def value - 'students-by-group' - end - - def columns - [StudentGroupedBarColumnPresenter] - end - end -end diff --git a/app/models/analyze/graph/students_and_teachers.rb b/app/models/analyze/graph/students_and_teachers.rb new file mode 100644 index 00000000..8039c8ce --- /dev/null +++ b/app/models/analyze/graph/students_and_teachers.rb @@ -0,0 +1,20 @@ +# frozen_string_literal: true + +module Analyze + module Graph + class StudentsAndTeachers + include Analyze::Graph::Column + def to_s + 'Students & Teachers' + end + + def value + 'students-and-teachers' + end + + def columns + [Student, Teacher, GroupedBarColumnPresenter] + end + end + end +end diff --git a/app/models/analyze/graph/students_by_group.rb b/app/models/analyze/graph/students_by_group.rb new file mode 100644 index 00000000..ff420652 --- /dev/null +++ b/app/models/analyze/graph/students_by_group.rb @@ -0,0 +1,25 @@ +module Analyze + module Graph + class StudentsByGroup + def to_s + 'Students by Group' + end + + def value + 'students-by-group' + end + + def columns + [Analyze::Graph::Column::Student, + Analyze::Graph::Column::Student, + Analyze::Graph::Column::Student, + Analyze::Graph::Column::Student, + Analyze::Graph::Column::Student, + Analyze::Graph::Column::Student, + Analyze::Graph::Column::Student, + Analyze::Graph::Column::Student, + Analyze::Graph::Column::Student] + end + end + end +end diff --git a/app/presenters/analyze/graph/column/grouped_bar_column_presenter.rb b/app/presenters/analyze/graph/column/grouped_bar_column_presenter.rb new file mode 100644 index 00000000..19a50bb1 --- /dev/null +++ b/app/presenters/analyze/graph/column/grouped_bar_column_presenter.rb @@ -0,0 +1,130 @@ +# frozen_string_literal: true + +module Analyze + module Graph + module Column + class GroupedBarColumnPresenter + include AnalyzeHelper + + attr_reader :measure_name, :measure_id, :category, :position, :measure, :school, :academic_years, + :number_of_columns + + def initialize(measure:, school:, academic_years:, position:, number_of_columns:) + @measure = measure + @measure_name = @measure.name + @measure_id = @measure.measure_id + @category = @measure.subcategory.category + @school = school + @academic_years = academic_years + @position = position + @number_of_columns = number_of_columns + end + + def score(year_index) + measure.score(school:, academic_year: academic_years[year_index]) || 0 + end + + def bars + @bars ||= yearly_scores.map.each_with_index do |yearly_score, index| + year = yearly_score.year + AnalyzeBarPresenter.new(measure:, academic_year: year, + score: yearly_score.score, + x_position: bar_x(index), + color: bar_color(year)) + end + end + + def label + 'All Data' + end + + def basis + '' + end + + def show_irrelevancy_message? + !measure.includes_teacher_survey_items? && !measure.includes_student_survey_items? + end + + def show_insufficient_data_message? + scores = academic_years.map do |year| + measure.score(school:, academic_year: year) + end + + scores.all? { |score| !score.meets_teacher_threshold? && !score.meets_student_threshold? } + end + + def column_midpoint + zone_label_width + (grouped_chart_column_width * (position + 1)) - (grouped_chart_column_width / 2) + end + + def bar_width + min_bar_width(10.5 / data_sources) + end + + def min_bar_width(number) + min_width = 2 + number < min_width ? min_width : number + end + + def message_x + column_midpoint - message_width / 2 + end + + def message_y + 17 + end + + def message_width + 20 + end + + def message_height + 34 + end + + def column_end_x + zone_label_width + (grouped_chart_column_width * (position + 1)) + end + + def column_start_x + zone_label_width + (grouped_chart_column_width * position) + end + + def grouped_chart_column_width + graph_width / data_sources + end + + def bar_label_height + (100 - ((100 - analyze_graph_height) / 2)) + end + + def data_sources + number_of_columns + end + + private + + YearlyScore = Struct.new(:year, :score) + def yearly_scores + yearly_scores = academic_years.each_with_index.map do |year, index| + YearlyScore.new(year, score(index)) + end + yearly_scores.reject do |yearly_score| + yearly_score.score.blank? + end + end + + def bar_color(year) + @available_academic_years ||= AcademicYear.order(:range).all + colors[@available_academic_years.find_index(year)] + end + + def bar_x(index) + column_start_x + (index * bar_width * 1.2) + + ((column_end_x - column_start_x) - (yearly_scores.size * bar_width * 1.2)) / 2 + end + end + end + end +end diff --git a/app/presenters/analyze/graph/column/student.rb b/app/presenters/analyze/graph/column/student.rb new file mode 100644 index 00000000..fe865657 --- /dev/null +++ b/app/presenters/analyze/graph/column/student.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +module Analyze + module Graph + module Column + class Student < GroupedBarColumnPresenter + def label + 'All Students' + end + + def basis + 'student' + end + + def show_irrelevancy_message? + !measure.includes_student_survey_items? + end + + def show_insufficient_data_message? + scores = academic_years.map do |year| + measure.score(school:, academic_year: year) + end + + scores.all? { |score| !score.meets_student_threshold? } + end + + def score(year_index) + measure.student_score(school:, academic_year: academic_years[year_index]) + end + end + end + end +end diff --git a/app/presenters/analyze/graph/column/teacher.rb b/app/presenters/analyze/graph/column/teacher.rb new file mode 100644 index 00000000..652b2464 --- /dev/null +++ b/app/presenters/analyze/graph/column/teacher.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +module Analyze + module Graph + module Column + class Teacher < GroupedBarColumnPresenter + def label + 'All Teachers' + end + + def basis + 'teacher' + end + + def show_irrelevancy_message? + !measure.includes_teacher_survey_items? + end + + def show_insufficient_data_message? + scores = academic_years.map do |year| + measure.score(school:, academic_year: year) + end + + scores.all? { |score| !score.meets_teacher_threshold? } + end + + def score(year_index) + measure.teacher_score(school:, academic_year: academic_years[year_index]) + end + end + end + end +end diff --git a/app/presenters/grouped_bar_column_presenter.rb b/app/presenters/grouped_bar_column_presenter.rb deleted file mode 100644 index 0b721047..00000000 --- a/app/presenters/grouped_bar_column_presenter.rb +++ /dev/null @@ -1,117 +0,0 @@ -# frozen_string_literal: true - -class GroupedBarColumnPresenter - include AnalyzeHelper - - attr_reader :measure_name, :measure_id, :category, :position, :measure, :school, :academic_years - - def initialize(measure:, school:, academic_years:, position:) - @measure = measure - @measure_name = @measure.name - @measure_id = @measure.measure_id - @category = @measure.subcategory.category - @school = school - @academic_years = academic_years - @position = position - end - - def score(year_index) - measure.score(school:, academic_year: academic_years[year_index]) || 0 - end - - def bars - @bars ||= yearly_scores.map.each_with_index do |yearly_score, index| - year = yearly_score.year - AnalyzeBarPresenter.new(measure:, academic_year: year, - score: yearly_score.score, - x_position: bar_x(index), - color: bar_color(year)) - end - end - - def label - 'All Data' - end - - def basis - '' - end - - def show_irrelevancy_message? - !measure.includes_teacher_survey_items? && !measure.includes_student_survey_items? - end - - def show_insufficient_data_message? - scores = academic_years.map do |year| - measure.score(school:, academic_year: year) - end - - scores.all? { |score| !score.meets_teacher_threshold? && !score.meets_student_threshold? } - end - - def column_midpoint - zone_label_width + (grouped_chart_column_width * (position + 1)) - (grouped_chart_column_width / 2) - end - - def bar_width - 3.5 - end - - def message_x - column_midpoint - message_width / 2 - end - - def message_y - 17 - end - - def message_width - 20 - end - - def message_height - 34 - end - - def column_end_x - zone_label_width + (grouped_chart_column_width * (position + 1)) - end - - def column_start_x - zone_label_width + (grouped_chart_column_width * position) - end - - def grouped_chart_column_width - graph_width / data_sources - end - - def bar_label_height - (100 - ((100 - analyze_graph_height) / 2)) - end - - def data_sources - 3 - end - - private - - YearlyScore = Struct.new(:year, :score) - def yearly_scores - yearly_scores = academic_years.each_with_index.map do |year, index| - YearlyScore.new(year, score(index)) - end - yearly_scores.reject do |yearly_score| - yearly_score.score.blank? - end - end - - def bar_color(year) - @available_academic_years ||= AcademicYear.order(:range).all - colors[@available_academic_years.find_index(year)] - end - - def bar_x(index) - column_start_x + (index * bar_width * 1.2) + - ((column_end_x - column_start_x) - (yearly_scores.size * bar_width * 1.2)) / 2 - end -end diff --git a/app/presenters/student_grouped_bar_column_presenter.rb b/app/presenters/student_grouped_bar_column_presenter.rb deleted file mode 100644 index 4377d6ed..00000000 --- a/app/presenters/student_grouped_bar_column_presenter.rb +++ /dev/null @@ -1,27 +0,0 @@ -# frozen_string_literal: true - -class StudentGroupedBarColumnPresenter < GroupedBarColumnPresenter - def label - 'All Students' - end - - def basis - 'student' - end - - def show_irrelevancy_message? - !measure.includes_student_survey_items? - end - - def show_insufficient_data_message? - scores = academic_years.map do |year| - measure.score(school:, academic_year: year) - end - - scores.all? { |score| !score.meets_student_threshold? } - end - - def score(year_index) - measure.student_score(school:, academic_year: academic_years[year_index]) - end -end diff --git a/app/presenters/teacher_grouped_bar_column_presenter.rb b/app/presenters/teacher_grouped_bar_column_presenter.rb deleted file mode 100644 index bd285452..00000000 --- a/app/presenters/teacher_grouped_bar_column_presenter.rb +++ /dev/null @@ -1,27 +0,0 @@ -# frozen_string_literal: true - -class TeacherGroupedBarColumnPresenter < GroupedBarColumnPresenter - def label - 'All Teachers' - end - - def basis - 'teacher' - end - - def show_irrelevancy_message? - !measure.includes_teacher_survey_items? - end - - def show_insufficient_data_message? - scores = academic_years.map do |year| - measure.score(school:, academic_year: year) - end - - scores.all? { |score| !score.meets_teacher_threshold? } - end - - def score(year_index) - measure.teacher_score(school:, academic_year: academic_years[year_index]) - end -end diff --git a/app/views/analyze/_graph_background.html.erb b/app/views/analyze/_graph_background.html.erb index ab6cc079..fca394cc 100644 --- a/app/views/analyze/_graph_background.html.erb +++ b/app/views/analyze/_graph_background.html.erb @@ -2,8 +2,6 @@ - - diff --git a/app/views/analyze/_grouped_bar_chart.html.erb b/app/views/analyze/_grouped_bar_chart.html.erb index 7bb79535..35aa4780 100644 --- a/app/views/analyze/_grouped_bar_chart.html.erb +++ b/app/views/analyze/_grouped_bar_chart.html.erb @@ -2,8 +2,9 @@ <%= render partial: "graph_background", locals: {background: @background} %> <%# <% columns = [StudentGroupedBarColumnPresenter, TeacherGroupedBarColumnPresenter, GroupedBarColumnPresenter] %1> %> + <% number_of_columns = @graph.columns.length %> <% @graph.columns.each_with_index do |column, index| %> - <% p = column.new(measure: measure, school: @school, academic_years: @selected_academic_years, position: index ) %> + <% p = column.new(measure: measure, school: @school, academic_years: @selected_academic_years, position: index , number_of_columns:) %> <%= render partial: "grouped_bar_column", locals: {column: p} %> <% end %> diff --git a/app/views/analyze/_grouped_bar_column.html.erb b/app/views/analyze/_grouped_bar_column.html.erb index 536eb45f..0e59d9f3 100644 --- a/app/views/analyze/_grouped_bar_column.html.erb +++ b/app/views/analyze/_grouped_bar_column.html.erb @@ -10,6 +10,7 @@ <% end %> <% end %> + <%= column.label %> diff --git a/lib/tasks/data.rake b/lib/tasks/data.rake index df8dd29b..0e9168f6 100644 --- a/lib/tasks/data.rake +++ b/lib/tasks/data.rake @@ -67,12 +67,7 @@ namespace :data do end desc 'load students' task load_students: :environment do - files = ['2021-22_attleboro_student_survey_responses.csv', - '2021-22_lowell_milford_student_survey_responses.csv', - '2021-22_revere_somerville_wareham_student_survey_responses.csv', - '2021-22_winchester_student_survey_responses.csv' ] - files.each do |file| - file = Rails.root.join('data', 'survey_responses', file) + Dir.glob(Rails.root.join('data', 'survey_responses', '*.csv')).each do |file| puts "=====================> Loading student data from csv at path: #{file}" StudentLoader.load_data filepath: file end