DA - split large hashes

fixes CNVS-16452

test plan:
  - regression test of the following
    - GB csv download/upload
    - assignments index
    - assignments api index
    - submissions api call to for_students
      - as teacher/observer/student
    - score calculation in GB
    - score calculation on individual grades page

Change-Id: Ifaa0c7580535c2c5d4e218508ef00c1b6007770b
Reviewed-on: https://gerrit.instructure.com/43361
Tested-by: Jenkins <jenkins@instructure.com>
Reviewed-by: Cameron Sutter <csutter@instructure.com>
QA-Review: Sean Lewis <slewis@instructure.com>
Product-Review: Simon Williams <simon@instructure.com>
This commit is contained in:
Michael Nomitch 2014-10-27 13:19:36 -05:00 committed by Mike Nomitch
parent bf89485c92
commit 386a8d15e8
3 changed files with 88 additions and 68 deletions

View File

@ -77,30 +77,34 @@ class GradebookUploadsController < ApplicationController
assignment_map[a.id] = a
end
if da_enabled = @context.feature_enabled?(:differentiated_assignments)
visible_assignments = AssignmentStudentVisibility.visible_assignment_ids_in_course_by_user(course_id: @context.id, user_id: @students.map{|s| s["previous_id"].to_i})
end
@submissions ||= []
@students.each_slice(100) do |students|
@submissions = @students.inject([]) do |list, student_record|
student_record['submissions'].each do |submission_record|
assignment_id = new_assignment_ids[submission_record['assignment_id']] || submission_record['assignment_id'].to_i
user_id = student_record['previous_id'].to_i
new_submission = {
:assignment_id => assignment_id,
:user_id => user_id,
:grade => submission_record['grade']
}
if da_enabled
if visible_assignments[user_id].include?(assignment_id)
list << new_submission
else
logger.info "Assignment: #{assignment_map[assignment_id].title} for student: #{student_record['name']} was not updated because it is not assigned to that student."
end
else
list << new_submission
end
if da_enabled = @context.feature_enabled?(:differentiated_assignments)
visible_assignments = AssignmentStudentVisibility.visible_assignment_ids_in_course_by_user(course_id: @context.id, user_id: students.map{|s| s["previous_id"].to_i})
end
students.inject(@submissions) do |list, student_record|
student_record['submissions'].each do |submission_record|
assignment_id = new_assignment_ids[submission_record['assignment_id']] || submission_record['assignment_id'].to_i
user_id = student_record['previous_id'].to_i
new_submission = {
:assignment_id => assignment_id,
:user_id => user_id,
:grade => submission_record['grade']
}
if da_enabled
if visible_assignments[user_id].include?(assignment_id)
list << new_submission
else
logger.info "Assignment: #{assignment_map[assignment_id].title} for student: #{student_record['name']} was not updated because it is not assigned to that student."
end
else
list << new_submission
end
end
list
end
list
end
all_submissions = {}

View File

@ -1569,46 +1569,49 @@ class Course < ActiveRecord::Base
row << read_only if self.grading_standard_enabled?
csv << row
if da_enabled = feature_enabled?(:differentiated_assignments)
visible_assignments = AssignmentStudentVisibility.visible_assignment_ids_in_course_by_user(user_id: student_enrollments.map(&:user_id), course_id: id)
end
student_enrollments.each_slice(100) do |student_enrollments_batch|
student_enrollments.each do |student_enrollment|
student = student_enrollment.user
student_sections = student_section_names[student.id].sort.to_sentence
student_submissions = assignments.map do |a|
if da_enabled && visible_assignments[student.id] && !visible_assignments[student.id].include?(a.id)
"N/A"
else
submission = submissions[[student.id, a.id]]
submission.try(:score)
if da_enabled = feature_enabled?(:differentiated_assignments)
visible_assignments = AssignmentStudentVisibility.visible_assignment_ids_in_course_by_user(user_id: student_enrollments_batch.map(&:user_id), course_id: id)
end
student_enrollments_batch.each do |student_enrollment|
student = student_enrollment.user
student_sections = student_section_names[student.id].sort.to_sentence
student_submissions = assignments.map do |a|
if da_enabled && visible_assignments[student.id] && !visible_assignments[student.id].include?(a.id)
"N/A"
else
submission = submissions[[student.id, a.id]]
submission.try(:score)
end
end
#Last Row
row = [student.last_name_first, student.id]
if options[:include_sis_id]
pseudonym = student.sis_pseudonym_for(self.root_account, include_root_account)
row << pseudonym.try(:sis_user_id)
pseudonym ||= student.find_pseudonym_for_account(self.root_account, include_root_account)
row << pseudonym.try(:unique_id)
row << (pseudonym && HostUrl.context_host(pseudonym.account)) if include_root_account
end
end
#Last Row
row = [student.last_name_first, student.id]
if options[:include_sis_id]
pseudonym = student.sis_pseudonym_for(self.root_account, include_root_account)
row << pseudonym.try(:sis_user_id)
pseudonym ||= student.find_pseudonym_for_account(self.root_account, include_root_account)
row << pseudonym.try(:unique_id)
row << (pseudonym && HostUrl.context_host(pseudonym.account)) if include_root_account
end
row << student_sections
row.concat(student_submissions)
row << student_sections
row.concat(student_submissions)
(current_info, current_group_info),
(final_info, final_group_info) = grades.shift
groups.each do |g|
row << current_group_info[g.id][:score] << final_group_info[g.id][:score] if include_points
row << current_group_info[g.id][:grade] << final_group_info[g.id][:grade]
(current_info, current_group_info),
(final_info, final_group_info) = grades.shift
groups.each do |g|
row << current_group_info[g.id][:score] << final_group_info[g.id][:score] if include_points
row << current_group_info[g.id][:grade] << final_group_info[g.id][:grade]
end
row << current_info[:total] << final_info[:total] if include_points
row << current_info[:grade] << final_info[:grade]
if self.grading_standard_enabled?
row << score_to_grade(final_info[:grade])
end
csv << row
end
row << current_info[:total] << final_info[:total] if include_points
row << current_info[:grade] << final_info[:grade]
if self.grading_standard_enabled?
row << score_to_grade(final_info[:grade])
end
csv << row
end
end
end

View File

@ -52,15 +52,21 @@ class GradeCalculator
select("submissions.id, user_id, assignment_id, score")
submissions_by_user = @submissions.group_by(&:user_id)
@user_ids.map do |user_id|
user_submissions = submissions_by_user[user_id] || []
if differentiated_assignments_on?
user_submissions.select!{|s| assignment_ids_visible_to_user(user_id).include?(s.assignment_id)}
scores = []
@user_ids.each_slice(100) do |batched_ids|
load_assignment_visibilities_for_users(batched_ids)
batched_ids.each do |user_id|
user_submissions = submissions_by_user[user_id] || []
if differentiated_assignments_on?
user_submissions.select!{|s| assignment_ids_visible_to_user(user_id).include?(s.assignment_id)}
end
current, current_groups = calculate_current_score(user_id, user_submissions)
final, final_groups = calculate_final_score(user_id, user_submissions)
scores << [[current, current_groups], [final, final_groups]]
end
current, current_groups = calculate_current_score(user_id, user_submissions)
final, final_groups = calculate_final_score(user_id, user_submissions)
[[current, current_groups], [final, final_groups]]
clear_assignment_visibilities_cache
end
scores
end
def compute_and_save_scores
@ -158,16 +164,23 @@ class GradeCalculator
end
end
def assignment_ids_visible_to_user(user_id)
def load_assignment_visibilities_for_users(user_ids)
@assignment_ids_visible_to_user ||= begin
if differentiated_assignments_on?
AssignmentStudentVisibility.visible_assignment_ids_in_course_by_user(course_id: @course.id, user_id: @user_ids)
AssignmentStudentVisibility.visible_assignment_ids_in_course_by_user(course_id: @course.id, user_id: user_ids)
else
assignment_ids = @assignments.map(&:id)
@user_ids.reduce({}){|hash, id| hash[id] = assignment_ids; hash}
user_ids.reduce({}){|hash, id| hash[id] = assignment_ids; hash}
end
end
@assignment_ids_visible_to_user[user_id] || []
end
def clear_assignment_visibilities_cache
@assignment_ids_visible_to_user = nil
end
def assignment_ids_visible_to_user(user_id)
@assignment_ids_visible_to_user[user_id]
end
# see comments for dropAssignments in grade_calculator.coffee