diff --git a/app/controllers/favorites_controller.rb b/app/controllers/favorites_controller.rb index 38376ed24ef..45aa906eb15 100644 --- a/app/controllers/favorites_controller.rb +++ b/app/controllers/favorites_controller.rb @@ -70,7 +70,7 @@ class FavoritesController < ApplicationController def list_favorite_courses includes = Set.new(Array(params[:include])) opts = {} - opts[:observee_user] = params[:observed_user].to_i if params.key?(:observed_user) + opts[:observee_user] = User.find_by(id: params[:observed_user].to_i) || @current_user if params.key?(:observed_user) courses = @current_user.menu_courses(nil, opts) if courses.any? && value_to_boolean(params[:exclude_blueprint_courses]) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index c87459c169a..a6d8c3af930 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -583,7 +583,7 @@ class UsersController < ApplicationController def dashboard_cards opts = {} - opts[:observee_user] = params[:observed_user].to_i if params.key?(:observed_user) + opts[:observee_user] = User.find_by(id: params[:observed_user].to_i) || @current_user if params.key?(:observed_user) dashboard_courses = map_courses_for_menu(@current_user.menu_courses(nil, opts), tabs: DASHBOARD_CARD_TABS) published, unpublished = dashboard_courses.partition { |course| course[:published] } Rails.cache.write(['last_known_dashboard_cards_published_count', @current_user.global_id].cache_key, published.count) diff --git a/app/models/user.rb b/app/models/user.rb index c00f7aeb218..2364f867de1 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -425,12 +425,12 @@ class User < ActiveRecord::Base after_save :self_enroll_if_necessary def courses_for_enrollments(enrollment_scope, associated_user = nil) - if associated_user && associated_user != id + if associated_user && associated_user != self Course.active.joins(:observer_enrollments) .merge(enrollment_scope.except(:joins)) - .where(enrollments: { associated_user_id: associated_user }) + .where(enrollments: { associated_user_id: associated_user.id }) else - enrollments_to_include = associated_user == id ? :non_observer_enrollments : :all_enrollments + enrollments_to_include = associated_user == self ? :non_observer_enrollments : :all_enrollments Course.active.joins(enrollments_to_include).merge(enrollment_scope.except(:joins)).distinct end end diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index 9122ef29941..2a2f21827ce 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -806,16 +806,16 @@ describe User do observer_enrollment2.save! @teacher_course = course_factory(:course_name => "English ", :active_course => true) - teacher_entollment = @teacher_course.enroll_user(@user, 'TeacherEnrollment', :enrollment_state => 'active') - teacher_entollment.save! + teacher_enrollment = @teacher_course.enroll_user(@user, 'TeacherEnrollment', :enrollment_state => 'active') + teacher_enrollment.save! @student_course = course_factory(:course_name => "Leadership", :active_course => true) - teacher_entollment = @student_course.enroll_user(@user, 'StudentEnrollment', :enrollment_state => 'active') - teacher_entollment.save! + student_enrollment = @student_course.enroll_user(@user, 'StudentEnrollment', :enrollment_state => 'active') + student_enrollment.save! end it "returns observed courses related to the associated_user" do - expect(@observer.courses_with_primary_enrollment(:current_and_invited_courses, nil, :observee_user => @student.id) + expect(@observer.courses_with_primary_enrollment(:current_and_invited_courses, nil, :observee_user => @student) .map { |c| [c.id, c.primary_enrollment_type] }).to eq [ [@observer_course2.id, 'ObserverEnrollment'], [@observer_course.id, 'ObserverEnrollment'] @@ -824,12 +824,39 @@ describe User do it "returns only own courses if the associated_user is the current user" do expect(@observer - .courses_with_primary_enrollment(:current_and_invited_courses, nil, :observee_user => @observer.id) + .courses_with_primary_enrollment(:current_and_invited_courses, nil, :observee_user => @observer) .map { |c| [c.id, c.primary_enrollment_type] }).to eq [ [@teacher_course.id, 'TeacherEnrollment'], [@student_course.id, 'StudentEnrollment'] ] end + + describe "with cross sharding" do + specs_require_sharding + + before(:once) do + @shard2.activate do + account = Account.create! + course_with_teacher(account: account, active_all: true) + + observer_enrollment = @observer_course.enroll_user(@teacher, 'ObserverEnrollment', :enrollment_state => 'active') + observer_enrollment.associated_user_id = @student.id + observer_enrollment.save! + end + end + + it "returns the user's courses across shards when they are the observee" do + own_courses = @teacher.courses_with_primary_enrollment(:current_and_invited_courses, nil, :observee_user => @teacher) + expect(own_courses.count).to be 1 + expect(own_courses.first.id).to be @course.id + end + + it "returns the observer's courses across shards when observing someone else" do + observed_courses = @teacher.courses_with_primary_enrollment(:current_and_invited_courses, nil, :observee_user => @student) + expect(observed_courses.count).to be 1 + expect(observed_courses.first.id).to be @observer_course.id + end + end end it "includes invitations to temporary users" do