mirror of
https://github.com/meineerde/redmine.git
synced 2025-12-20 07:21:12 +00:00
Speeds up Project.allowed_to_condition for users who belong to hundreds of projects.
git-svn-id: http://svn.redmine.org/redmine/trunk@16124 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
parent
f8df935dca
commit
98f8a17851
@ -204,9 +204,9 @@ class Project < ActiveRecord::Base
|
|||||||
statement_by_role[role] = s
|
statement_by_role[role] = s
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
user.projects_by_role.each do |role, projects|
|
user.project_ids_by_role.each do |role, project_ids|
|
||||||
if role.allowed_to?(permission) && projects.any?
|
if role.allowed_to?(permission) && project_ids.any?
|
||||||
statement_by_role[role] = "#{Project.table_name}.id IN (#{projects.collect(&:id).join(',')})"
|
statement_by_role[role] = "#{Project.table_name}.id IN (#{project_ids.join(',')})"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
if statement_by_role.empty?
|
if statement_by_role.empty?
|
||||||
|
|||||||
@ -163,6 +163,7 @@ class User < Principal
|
|||||||
def reload(*args)
|
def reload(*args)
|
||||||
@name = nil
|
@name = nil
|
||||||
@projects_by_role = nil
|
@projects_by_role = nil
|
||||||
|
@project_ids_by_role = nil
|
||||||
@membership_by_project_id = nil
|
@membership_by_project_id = nil
|
||||||
@notified_projects_ids = nil
|
@notified_projects_ids = nil
|
||||||
@notified_projects_ids_changed = false
|
@notified_projects_ids_changed = false
|
||||||
@ -564,33 +565,51 @@ class User < Principal
|
|||||||
end
|
end
|
||||||
|
|
||||||
# Returns a hash of user's projects grouped by roles
|
# Returns a hash of user's projects grouped by roles
|
||||||
|
# TODO: No longer used, should be deprecated
|
||||||
def projects_by_role
|
def projects_by_role
|
||||||
return @projects_by_role if @projects_by_role
|
return @projects_by_role if @projects_by_role
|
||||||
|
|
||||||
hash = Hash.new([])
|
result = Hash.new([])
|
||||||
|
project_ids_by_role.each do |role, ids|
|
||||||
|
result[role] = Project.where(:id => ids).to_a
|
||||||
|
end
|
||||||
|
@projects_by_role = result
|
||||||
|
end
|
||||||
|
|
||||||
|
# Returns a hash of project ids grouped by roles.
|
||||||
|
# Includes the projects that the user is a member of and the projects
|
||||||
|
# that grant custom permissions to the builtin groups.
|
||||||
|
def project_ids_by_role
|
||||||
|
return @project_ids_by_role if @project_ids_by_role
|
||||||
|
|
||||||
group_class = anonymous? ? GroupAnonymous : GroupNonMember
|
group_class = anonymous? ? GroupAnonymous : GroupNonMember
|
||||||
members = Member.joins(:project, :principal).
|
group_id = group_class.pluck(:id).first
|
||||||
where("#{Project.table_name}.status <> 9").
|
|
||||||
where("#{Member.table_name}.user_id = ? OR (#{Project.table_name}.is_public = ? AND #{Principal.table_name}.type = ?)", self.id, true, group_class.name).
|
|
||||||
preload(:project, :roles).
|
|
||||||
to_a
|
|
||||||
|
|
||||||
members.reject! {|member| member.user_id != id && project_ids.include?(member.project_id)}
|
members = Member.joins(:project, :member_roles).
|
||||||
members.each do |member|
|
where("#{Project.table_name}.status <> 9").
|
||||||
if member.project
|
where("#{Member.table_name}.user_id = ? OR (#{Project.table_name}.is_public = ? AND #{Member.table_name}.user_id = ?)", self.id, true, group_id).
|
||||||
member.roles.each do |role|
|
pluck(:user_id, :role_id, :project_id)
|
||||||
hash[role] = [] unless hash.key?(role)
|
|
||||||
hash[role] << member.project
|
hash = {}
|
||||||
|
members.each do |user_id, role_id, project_id|
|
||||||
|
# Ignore the roles of the builtin group if the user is a member of the project
|
||||||
|
next if user_id != id && project_ids.include?(project_id)
|
||||||
|
|
||||||
|
hash[role_id] ||= []
|
||||||
|
hash[role_id] << project_id
|
||||||
|
end
|
||||||
|
|
||||||
|
result = Hash.new([])
|
||||||
|
if hash.present?
|
||||||
|
roles = Role.where(:id => hash.keys).to_a
|
||||||
|
hash.each do |role_id, proj_ids|
|
||||||
|
role = roles.detect {|r| r.id == role_id}
|
||||||
|
if role
|
||||||
|
result[role] = proj_ids.uniq
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@project_ids_by_role = result
|
||||||
hash.each do |role, projects|
|
|
||||||
projects.uniq!
|
|
||||||
end
|
|
||||||
|
|
||||||
@projects_by_role = hash
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns the ids of visible projects
|
# Returns the ids of visible projects
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user