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:
parent
bf89485c92
commit
386a8d15e8
|
@ -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 = {}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue