mirror of
https://github.com/meineerde/redmine.git
synced 2025-12-19 15:01:14 +00:00
Don't preload projects and roles on Principal#memberships association (#23519).
Patch by Ondřej Ezr. git-svn-id: http://svn.redmine.org/redmine/trunk@16153 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
parent
79c2e42889
commit
3deb70d4aa
@ -69,7 +69,7 @@ class UsersController < ApplicationController
|
|||||||
end
|
end
|
||||||
|
|
||||||
# show projects based on current user visibility
|
# show projects based on current user visibility
|
||||||
@memberships = @user.memberships.where(Project.visible_condition(User.current)).to_a
|
@memberships = @user.memberships.preload(:roles, :project).where(Project.visible_condition(User.current)).to_a
|
||||||
|
|
||||||
respond_to do |format|
|
respond_to do |format|
|
||||||
format.html {
|
format.html {
|
||||||
|
|||||||
@ -28,8 +28,7 @@ class Principal < ActiveRecord::Base
|
|||||||
|
|
||||||
has_many :members, :foreign_key => 'user_id', :dependent => :destroy
|
has_many :members, :foreign_key => 'user_id', :dependent => :destroy
|
||||||
has_many :memberships,
|
has_many :memberships,
|
||||||
lambda {preload(:project, :roles).
|
lambda {joins(:project).
|
||||||
joins(:project).
|
|
||||||
where("#{Project.table_name}.status<>#{Project::STATUS_ARCHIVED}")},
|
where("#{Project.table_name}.status<>#{Project::STATUS_ARCHIVED}")},
|
||||||
:class_name => 'Member',
|
:class_name => 'Member',
|
||||||
:foreign_key => 'user_id'
|
:foreign_key => 'user_id'
|
||||||
|
|||||||
@ -546,6 +546,10 @@ class User < Principal
|
|||||||
@membership_by_project_id[project_id]
|
@membership_by_project_id[project_id]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def roles
|
||||||
|
@roles ||= Role.joins(members: :project).where(["#{Project.table_name}.status <> ?", Project::STATUS_ARCHIVED]).where(Member.arel_table[:user_id].eq(id)).uniq
|
||||||
|
end
|
||||||
|
|
||||||
# Returns the user's bult-in role
|
# Returns the user's bult-in role
|
||||||
def builtin_role
|
def builtin_role
|
||||||
@builtin_role ||= Role.non_member
|
@builtin_role ||= Role.non_member
|
||||||
@ -673,9 +677,9 @@ class User < Principal
|
|||||||
return true if admin?
|
return true if admin?
|
||||||
|
|
||||||
# authorize if user has at least one role that has this permission
|
# authorize if user has at least one role that has this permission
|
||||||
roles = memberships.collect {|m| m.roles}.flatten.uniq
|
rls = self.roles.to_a
|
||||||
roles << (self.logged? ? Role.non_member : Role.anonymous)
|
rls << builtin_role
|
||||||
roles.any? {|role|
|
rls.any? {|role|
|
||||||
role.allowed_to?(action) &&
|
role.allowed_to?(action) &&
|
||||||
(block_given? ? yield(role, self) : true)
|
(block_given? ? yield(role, self) : true)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -12,7 +12,7 @@ api.group do
|
|||||||
end if include_in_api_response?('users') && !@group.builtin?
|
end if include_in_api_response?('users') && !@group.builtin?
|
||||||
|
|
||||||
api.array :memberships do
|
api.array :memberships do
|
||||||
@group.memberships.each do |membership|
|
@group.memberships.preload(:roles, :project).each do |membership|
|
||||||
api.membership do
|
api.membership do
|
||||||
api.id membership.id
|
api.id membership.id
|
||||||
api.project :id => membership.project.id, :name => membership.project.name
|
api.project :id => membership.project.id, :name => membership.project.name
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user