##// END OF EJS Templates
Performance: avoid querying all memberships in User#roles_for_project (#13301)....
Jean-Philippe Lang -
r11278:6803d95a32ab
parent child
Show More
@@ -132,6 +132,7 class User < Principal
132 def reload(*args)
132 def reload(*args)
133 @name = nil
133 @name = nil
134 @projects_by_role = nil
134 @projects_by_role = nil
135 @membership_by_project_id = nil
135 base_reload(*args)
136 base_reload(*args)
136 end
137 end
137
138
@@ -419,6 +420,17 class User < Principal
419 !logged?
420 !logged?
420 end
421 end
421
422
423 # Returns user's membership for the given project
424 # or nil if the user is not a member of project
425 def membership(project)
426 project_id = project.is_a?(Project) ? project.id : project
427
428 @membership_by_project_id ||= Hash.new {|h, project_id|
429 h[project_id] = memberships.where(:project_id => project_id).first
430 }
431 @membership_by_project_id[project_id]
432 end
433
422 # Return user's roles for project
434 # Return user's roles for project
423 def roles_for_project(project)
435 def roles_for_project(project)
424 roles = []
436 roles = []
@@ -426,7 +438,7 class User < Principal
426 return roles if project.nil? || project.archived?
438 return roles if project.nil? || project.archived?
427 if logged?
439 if logged?
428 # Find project membership
440 # Find project membership
429 membership = memberships.detect {|m| m.project_id == project.id}
441 membership = membership(project)
430 if membership
442 if membership
431 roles = membership.roles
443 roles = membership.roles
432 else
444 else
@@ -762,6 +762,32 class UserTest < ActiveSupport::TestCase
762 assert_equal true, User.default_admin_account_changed?
762 assert_equal true, User.default_admin_account_changed?
763 end
763 end
764
764
765 def test_membership_with_project_should_return_membership
766 project = Project.find(1)
767
768 membership = @jsmith.membership(project)
769 assert_kind_of Member, membership
770 assert_equal @jsmith, membership.user
771 assert_equal project, membership.project
772 end
773
774 def test_membership_with_project_id_should_return_membership
775 project = Project.find(1)
776
777 membership = @jsmith.membership(1)
778 assert_kind_of Member, membership
779 assert_equal @jsmith, membership.user
780 assert_equal project, membership.project
781 end
782
783 def test_membership_for_non_member_should_return_nil
784 project = Project.find(1)
785
786 user = User.generate!
787 membership = user.membership(1)
788 assert_nil membership
789 end
790
765 def test_roles_for_project
791 def test_roles_for_project
766 # user with a role
792 # user with a role
767 roles = @jsmith.roles_for_project(Project.find(1))
793 roles = @jsmith.roles_for_project(Project.find(1))
General Comments 0
You need to be logged in to leave comments. Login now