diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index b3b620f0070..20062f64da2 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -647,7 +647,7 @@ class ApplicationController < ActionController::Base # we already know the user can read these courses and groups, so skip # the grants_right? check to avoid querying for the various memberships # again. - enrollment_scope = @context.enrollments.current.shard(@context).preload(:course) + enrollment_scope = @context.enrollments.current.shard(@context).preload(:course, :enrollment_state) group_scope = opts[:include_groups] ? @context.current_groups : nil if only_contexts.present? @@ -669,7 +669,7 @@ class ApplicationController < ActionController::Base end end end - courses = enrollment_scope.select { |e| e.state_based_on_date == :active }.map(&:course).uniq + courses = enrollment_scope.select(&:active?).map(&:course).uniq groups = group_scope ? group_scope.shard(@context).to_a.reject{|g| g.context_type == "Course" && g.context.concluded?} : [] if opts[:favorites_first] diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index f2303e184d8..0f5b304cc1a 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -175,7 +175,7 @@ class UsersController < ApplicationController add_crumb(@current_user.short_name, crumb_url) add_crumb(t('crumbs.grades', 'Grades'), grades_path) - current_active_enrollments = @user.enrollments.current.preload(:course).shard(@user).to_a + current_active_enrollments = @user.enrollments.current.preload(:course, :enrollment_state).shard(@user).to_a @presenter = GradesPresenter.new(current_active_enrollments) @@ -1009,7 +1009,7 @@ class UsersController < ApplicationController shard(@user). where("enrollments.workflow_state<>'deleted' AND courses.workflow_state<>'deleted'"). eager_load(:course). - preload(:associated_user, :course_section, course: { enrollment_term: :enrollment_dates_overrides }).to_a + preload(:associated_user, :course_section, :enrollment_state, course: { enrollment_term: :enrollment_dates_overrides }).to_a # restrict view for other users if @user != @current_user diff --git a/app/helpers/dashboard_helper.rb b/app/helpers/dashboard_helper.rb index a0fd4a3ce0d..4afe6c81df2 100644 --- a/app/helpers/dashboard_helper.rb +++ b/app/helpers/dashboard_helper.rb @@ -23,7 +23,7 @@ module DashboardHelper def show_welcome_message? @current_user.present? && - @current_user.cached_current_enrollments(:include_enrollment_uuid => session[:enrollment_uuid], :preload_dates => true).select(&:active?).empty? + @current_user.cached_current_enrollments(:include_enrollment_uuid => session[:enrollment_uuid], :preload_dates => true).all?{|e| !e.active?} end def welcome_message diff --git a/app/models/broadcast_policies/submission_policy.rb b/app/models/broadcast_policies/submission_policy.rb index 73260c1a0c6..04785748c4f 100644 --- a/app/models/broadcast_policies/submission_policy.rb +++ b/app/models/broadcast_policies/submission_policy.rb @@ -103,7 +103,7 @@ module BroadcastPolicies end def user_active_or_invited? - course.student_enrollments.where(user_id: submission.user_id).to_a.any?{|e| e.active? || e.invited?} + course.student_enrollments.where(user_id: submission.user_id).preload(:enrollment_state).to_a.any?{|e| e.active? || e.invited?} end end end diff --git a/app/models/course.rb b/app/models/course.rb index fb35eb8620c..6e028001bb9 100644 --- a/app/models/course.rb +++ b/app/models/course.rb @@ -1196,7 +1196,7 @@ class Course < ActiveRecord::Base # Prior users given do |user| (available? || completed?) && user && - prior_enrollments.for_user(user).any?{|e| !e.inactive?} + prior_enrollments.for_user(user).preload(:enrollment_state).any?{|e| !e.inactive?} end can :read, :read_outcomes @@ -1217,7 +1217,7 @@ class Course < ActiveRecord::Base given do |user| !self.deleted? && user && - (prior_enrollments.for_user(user).any?{|e| !e.inactive? && e.has_permission_to?(permission) && (!applicable_roles || applicable_roles.include?(e.type))} || + (prior_enrollments.for_user(user).preload(:enrollment_state).any?{|e| !e.inactive? && e.has_permission_to?(permission) && (!applicable_roles || applicable_roles.include?(e.type))} || user.cached_not_ended_enrollments.any? do |e| e.course_id == self.id && e.completed? && e.has_permission_to?(permission) && (!applicable_roles || applicable_roles.include?(e.type)) end @@ -1240,7 +1240,7 @@ class Course < ActiveRecord::Base # Student of a concluded course given do |user| (self.available? || self.completed?) && user && - (prior_enrollments.for_user(user).any?{|e| !e.inactive? && (e.student? || e.assigned_observer?) } || + (prior_enrollments.for_user(user).preload(:enrollment_state).any?{|e| (e.student? || e.assigned_observer?) && !e.inactive?} || user.cached_not_ended_enrollments.any? do |e| e.course_id == self.id && (e.student? || e.assigned_observer?) && e.state_based_on_date == :completed end @@ -1287,7 +1287,8 @@ class Course < ActiveRecord::Base is_unpublished = self.created? || self.claimed? @enrollment_lookup ||= {} @enrollment_lookup[user.id] ||= shard.activate do - self.enrollments.active_or_pending.for_user(user).reject { |e| (is_unpublished && !(e.admin? || e.fake_student?)) || [:inactive, :completed].include?(e.state_based_on_date)} + self.enrollments.active_or_pending.for_user(user).preload(:enrollment_state). + reject { |e| (is_unpublished && !(e.admin? || e.fake_student?)) || [:inactive, :completed].include?(e.state_based_on_date)} end @enrollment_lookup[user.id].any? {|e| (allow_future || e.state_based_on_date == :active) && e.has_permission_to?(permission) } diff --git a/app/models/group.rb b/app/models/group.rb index 1211333db28..3533a89d36c 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -563,7 +563,7 @@ class Group < ActiveRecord::Base return false unless user.present? && self.context.present? return true if self.group_category.try(:communities?) if self.context.is_a?(Course) - return self.context.enrollments.not_fake.except(:preload).where(:user_id => user.id).any?(&:participating?) + return self.context.enrollments.not_fake.except(:preload).preload(:enrollment_state).where(:user_id => user.id).any?(&:participating?) elsif self.context.is_a?(Account) return self.context.root_account.user_account_associations.where(:user_id => user.id).exists? end diff --git a/app/models/lti/lti_user_creator.rb b/app/models/lti/lti_user_creator.rb index a89c27e62fc..5eea2b98669 100644 --- a/app/models/lti/lti_user_creator.rb +++ b/app/models/lti/lti_user_creator.rb @@ -69,7 +69,7 @@ module Lti def current_course_enrollments return [] unless @canvas_context.is_a?(Course) - @current_course_enrollments ||= @canvas_user.enrollments.current.where(course_id: @canvas_context).to_a + @current_course_enrollments ||= @canvas_user.enrollments.current.where(course_id: @canvas_context).preload(:enrollment_state).to_a end def current_account_enrollments() diff --git a/app/models/quizzes/quiz_eligibility.rb b/app/models/quizzes/quiz_eligibility.rb index e90998127d6..2b2ee265345 100644 --- a/app/models/quizzes/quiz_eligibility.rb +++ b/app/models/quizzes/quiz_eligibility.rb @@ -163,7 +163,7 @@ class Quizzes::QuizEligibility end def inactive_enrollment? - course.enrollments.where(user_id: user.id).all?(&:inactive?) + course.enrollments.where(user_id: user.id).preload(:enrollment_state).all?(&:inactive?) end def inactive_student_with_private_course? diff --git a/app/models/user.rb b/app/models/user.rb index 5bba172ed11..f4bd6cecd32 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -613,7 +613,7 @@ class User < ActiveRecord::Base # Returns an array of groups which are currently visible for the user. def visible_groups @visible_groups ||= begin - enrollments = self.cached_current_enrollments(preload_courses: true) + enrollments = self.cached_current_enrollments(preload_dates: true, preload_courses: true) visible_groups = self.current_groups.select do |group| group.context_type != 'Course' || enrollments.any? do |en| en.course == group.context && !(en.inactive? || en.completed?) && (en.admin? || en.course.available?) @@ -1760,7 +1760,8 @@ class User < ActiveRecord::Base if opts[:preload_dates] Canvas::Builders::EnrollmentDateBuilder.preload_state(enrollments) - elsif opts[:preload_courses] + end + if opts[:preload_courses] ActiveRecord::Associations::Preloader.new.preload(enrollments, :course) end enrollments @@ -1770,9 +1771,11 @@ class User < ActiveRecord::Base def cached_not_ended_enrollments RequestCache.cache("not_ended_enrollments", self) do self.shard.activate do - Rails.cache.fetch([self, 'not_ended_enrollments2'].cache_key) do + enrollments = Rails.cache.fetch([self, 'not_ended_enrollments2'].cache_key) do self.not_ended_enrollments.to_a end + Canvas::Builders::EnrollmentDateBuilder.preload_state(enrollments) + enrollments end end end diff --git a/lib/lti/substitutions_helper.rb b/lib/lti/substitutions_helper.rb index 0281a62bd3d..1c884f8ce3a 100644 --- a/lib/lti/substitutions_helper.rb +++ b/lib/lti/substitutions_helper.rb @@ -143,7 +143,7 @@ module Lti end def enrollment_state - enrollments = @user ? @context.enrollments.where(user_id: @user.id) : [] + enrollments = @user ? @context.enrollments.where(user_id: @user.id).preload(:enrollment_state) : [] return '' if enrollments.size == 0 enrollments.any? { |membership| membership.state_based_on_date == :active } ? LtiOutbound::LTIUser::ACTIVE_STATE : LtiOutbound::LTIUser::INACTIVE_STATE end