diff --git a/lib/tasks/one_off.rake b/lib/tasks/one_off.rake index 855c4f1f..deaa370e 100644 --- a/lib/tasks/one_off.rake +++ b/lib/tasks/one_off.rake @@ -201,7 +201,7 @@ namespace :one_off do end desc "Generate CSV report of teacher survey item responses" task teacher_survey_questions_csv: :environment do - headers = ['School ID', 'Academic Year', 'Survey Item', 'Count','Percentage_diff'] + headers = ['School ID', 'Academic Year', 'Survey Item','Prmpt', 'Count','Percentage_diff'] output_rows = [] counts={} avg=0 @@ -212,7 +212,7 @@ namespace :one_off do threshold = Respondent.where(school: sc, academic_year: ay).pluck(:total_teachers) SurveyItem.teacher_survey_items.all.each do |si| c = SurveyItemResponse.where(school: sc, academic_year: ay, survey_item: si).group(:school_id).count - if c.any? && (c.values.first >= 10 || c.values.first > threshold/4) + if c.any? counts[[sc.id, ay.id, si.id]] = c sum+=c.values.first nof_si+=1 @@ -245,20 +245,87 @@ namespace :one_off do puts "CSV report of teacher survey item responses with removed stray responses.csv" end + desc "Generate CSV report of regular survey item responses" + task regular_survey_questions_csv: :environment do + headers = ['School ID', 'Academic Year', 'Survey Item','Prompt', 'Count','Percentage_diff'] + output_rows = [] + counts={} + avg=0 + temp=0 + count_response_grades_not_in_grades=0 + School.all.each do |sc| + AcademicYear.all.each do |ay| + if Respondent.where(school: sc,academic_year:ay).any? + grades_count=Respondent.where(school:sc,academic_year:ay).first.counts_by_grade + grades= grades_count.keys + else + grades=[] + end + sum=0 + nof_si=0 + threshold=0 + threshold = Respondent.where(school: sc, academic_year: ay).pluck(:total_students) + SurveyItem.where.not(on_short_form:true).where.not("survey_items.survey_item_id LIKE '%-%-es%'").where.not("survey_items.survey_item_id LIKE 't-%'").all.each do |si| + c = SurveyItemResponse.where(school: sc, academic_year: ay, survey_item: si).group(:school_id).count + response_grades = SurveyItemResponse.where(school: sc, academic_year: ay, survey_item: si).pluck(:grade) + t = response_grades.count { |grade| !grades.include?(grade) } + count_response_grades_not_in_grades+=t + response_grades=[] + if c.any? + c[c.keys.first] = c.values.first - t + end + + if threshold.any? + if c.any? && (c.values.first >= 10 || c.values.first > threshold.first/4) + counts[[sc.id, ay.id, si.id]] = c + sum+=c.values.first + nof_si+=1 + end + end + end + + + avg = sum.to_f/ nof_si + counts.each do |key, value| + if key[0] == sc.id && key[1] == ay.id + count = value.values.first + percentage_diff = ((count-avg) / avg) * 100 + counts[key] = { count: count, percentage_diff: percentage_diff } + end + end + end end + + counts.each do |key, value| + output_rows << [School.where(id:key[0]).pluck(:name) , AcademicYear.where(id:key[1]).pluck(:range) , SurveyItem.where(id:key[2]).pluck(:survey_item_id), SurveyItem.where(id:key[2]).pluck(:prompt), value[:count], value[:percentage_diff]] + end + + file = File.new('regular_survey_questions.csv', 'w') + CSV.open(file, 'w', write_headers: true, headers: headers) do |csv| + output_rows.each do |row| + csv << row + end + end + + file.close + puts "CSV report of regular survey item responses with removed stray responses.csv" + end desc "Generate CSV report of short survey item responses" task short_survey_questions_csv: :environment do - headers = ['School ID', 'Academic Year', 'Survey Item', 'Count','Percentage_diff'] + headers = ['School ID', 'Academic Year', 'Survey Item','Prompt', 'Count','Percentage_diff'] output_rows = [] counts={} avg=0 temp=0 count_response_grades_not_in_grades=0 School.all.each do |sc| - if Respondent.where(school: sc).any? - grades_count=Respondent.where(school:sc).first.counts_by_grade - grades= grades_count.keys AcademicYear.all.each do |ay| + if Respondent.where(school: sc,academic_year:ay).any? + grades_count=Respondent.where(school:sc,academic_year:ay).first.counts_by_grade + grades= grades_count.keys + else + grades=[] + end sum=0 nof_si=0 threshold=0 @@ -266,9 +333,11 @@ namespace :one_off do SurveyItem.short_form_items.all.each do |si| c = SurveyItemResponse.where(school: sc, academic_year: ay, survey_item: si).group(:school_id).count response_grades = SurveyItemResponse.where(school: sc, academic_year: ay, survey_item: si).pluck(:grade) - count_response_grades_not_in_grades = response_grades.count { |grade| !grades.include?(grade) } - if !count_response_grades_not_in_grades.nil? && c.any? - c[c.keys.first] = c.values.first - count_response_grades_not_in_grades + t = response_grades.count { |grade| !grades.include?(grade) } + count_response_grades_not_in_grades+=t + response_grades=[] + if c.any? + c[c.keys.first] = c.values.first - t end if threshold.any? @@ -289,7 +358,7 @@ namespace :one_off do counts[key] = { count: count, percentage_diff: percentage_diff } end end - end end end + end end counts.each do |key, value| output_rows << [School.where(id:key[0]).pluck(:name) , AcademicYear.where(id:key[1]).pluck(:range) , SurveyItem.where(id:key[2]).pluck(:survey_item_id), SurveyItem.where(id:key[2]).pluck(:prompt), value[:count], value[:percentage_diff]] @@ -309,17 +378,20 @@ namespace :one_off do desc "Generate CSV report of early_education_surveysitem responses" task early_education_survey_questions_csv: :environment do - headers = ['School ID', 'Academic Year', 'Survey Item', 'Count','Percentage_diff'] + headers = ['School ID', 'Academic Year', 'Survey Item','Prompt', 'Count','Percentage_diff'] output_rows = [] counts={} avg=0 temp=0 count_response_grades_not_in_grades=0 School.all.each do |sc| - if Respondent.where(school: sc).any? - grades_count=Respondent.where(school:sc).first.counts_by_grade - grades= grades_count.keys AcademicYear.all.each do |ay| + if Respondent.where(school: sc,academic_year:ay).any? + grades_count=Respondent.where(school:sc,academic_year:ay).first.counts_by_grade + grades= grades_count.keys + else + grades=[] + end sum=0 nof_si=0 threshold=0 @@ -327,9 +399,11 @@ namespace :one_off do SurveyItem.early_education_surveys.all.each do |si| c = SurveyItemResponse.where(school: sc, academic_year: ay, survey_item: si).group(:school_id).count response_grades = SurveyItemResponse.where(school: sc, academic_year: ay, survey_item: si).pluck(:grade) - count_response_grades_not_in_grades = response_grades.count { |grade| !grades.include?(grade) } - if !count_response_grades_not_in_grades.nil? && c.any? - c[c.keys.first] = c.values.first - count_response_grades_not_in_grades + t = response_grades.count { |grade| !grades.include?(grade) } + count_response_grades_not_in_grades+=t + response_grades=[] + if c.any? + c[c.keys.first] = c.values.first - t end if threshold.any? @@ -350,7 +424,7 @@ namespace :one_off do counts[key] = { count: count, percentage_diff: percentage_diff } end end - end end end + end end counts.each do |key, value| output_rows << [School.where(id:key[0]).pluck(:name) , AcademicYear.where(id:key[1]).pluck(:range) , SurveyItem.where(id:key[2]).pluck(:survey_item_id), SurveyItem.where(id:key[2]).pluck(:prompt), value[:count], value[:percentage_diff]]