Performance: avoid querying all memberships in User#roles_for_project (#13301).
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@11508 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
parent
69657be534
commit
6803d95a32
|
@ -132,6 +132,7 @@ class User < Principal
|
||||||
def reload(*args)
|
def reload(*args)
|
||||||
@name = nil
|
@name = nil
|
||||||
@projects_by_role = nil
|
@projects_by_role = nil
|
||||||
|
@membership_by_project_id = nil
|
||||||
base_reload(*args)
|
base_reload(*args)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -419,6 +420,17 @@ class User < Principal
|
||||||
!logged?
|
!logged?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Returns user's membership for the given project
|
||||||
|
# or nil if the user is not a member of project
|
||||||
|
def membership(project)
|
||||||
|
project_id = project.is_a?(Project) ? project.id : project
|
||||||
|
|
||||||
|
@membership_by_project_id ||= Hash.new {|h, project_id|
|
||||||
|
h[project_id] = memberships.where(:project_id => project_id).first
|
||||||
|
}
|
||||||
|
@membership_by_project_id[project_id]
|
||||||
|
end
|
||||||
|
|
||||||
# Return user's roles for project
|
# Return user's roles for project
|
||||||
def roles_for_project(project)
|
def roles_for_project(project)
|
||||||
roles = []
|
roles = []
|
||||||
|
@ -426,7 +438,7 @@ class User < Principal
|
||||||
return roles if project.nil? || project.archived?
|
return roles if project.nil? || project.archived?
|
||||||
if logged?
|
if logged?
|
||||||
# Find project membership
|
# Find project membership
|
||||||
membership = memberships.detect {|m| m.project_id == project.id}
|
membership = membership(project)
|
||||||
if membership
|
if membership
|
||||||
roles = membership.roles
|
roles = membership.roles
|
||||||
else
|
else
|
||||||
|
|
|
@ -762,6 +762,32 @@ class UserTest < ActiveSupport::TestCase
|
||||||
assert_equal true, User.default_admin_account_changed?
|
assert_equal true, User.default_admin_account_changed?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_membership_with_project_should_return_membership
|
||||||
|
project = Project.find(1)
|
||||||
|
|
||||||
|
membership = @jsmith.membership(project)
|
||||||
|
assert_kind_of Member, membership
|
||||||
|
assert_equal @jsmith, membership.user
|
||||||
|
assert_equal project, membership.project
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_membership_with_project_id_should_return_membership
|
||||||
|
project = Project.find(1)
|
||||||
|
|
||||||
|
membership = @jsmith.membership(1)
|
||||||
|
assert_kind_of Member, membership
|
||||||
|
assert_equal @jsmith, membership.user
|
||||||
|
assert_equal project, membership.project
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_membership_for_non_member_should_return_nil
|
||||||
|
project = Project.find(1)
|
||||||
|
|
||||||
|
user = User.generate!
|
||||||
|
membership = user.membership(1)
|
||||||
|
assert_nil membership
|
||||||
|
end
|
||||||
|
|
||||||
def test_roles_for_project
|
def test_roles_for_project
|
||||||
# user with a role
|
# user with a role
|
||||||
roles = @jsmith.roles_for_project(Project.find(1))
|
roles = @jsmith.roles_for_project(Project.find(1))
|
||||||
|
|
Loading…
Reference in New Issue