Patch #43203 ยป optimize_remove_inherited_member_roles.patch
app/models/project.rb | ||
---|---|---|
1023 | 1023 |
end |
1024 | 1024 |
end |
1025 | 1025 | |
1026 |
def remove_inherited_member_roles(not_deleted_ids_at_parent=[]) |
|
1027 |
member_ids = membership_ids |
|
1028 |
member_roles = MemberRole.where(member_id: member_ids) |
|
1029 |
not_delete_ids = member_roles.where(inherited_from: nil).ids |
|
1030 |
not_delete_ids += member_roles.where(inherited_from: member_roles.ids + not_deleted_ids_at_parent).ids |
|
1031 |
delete_member_roles = member_roles.where.not(id: not_delete_ids).delete_all |
|
1032 | ||
1033 |
# MemberRole#remove_member_if_empty |
|
1034 |
delete_member_ids = Member.where(id: member_ids).left_outer_joins(:roles).where(roles: {id: nil}).ids |
|
1035 |
delete_members = Member.where(id: delete_member_ids) |
|
1036 |
delete_member_user_ids = delete_members.pluck(:user_id) |
|
1037 |
delete_members.delete_all |
|
1038 | ||
1039 |
# Member#set_issue_category_nil |
|
1040 |
IssueCategory.where(project_id: self.id, assigned_to_id: delete_member_user_ids).update_all("assigned_to_id = NULL") |
|
1041 | ||
1042 |
# Member#remove_from_project_default_assigned_to |
|
1043 |
if self.default_assigned_to_id && delete_member_user_ids.include?(self.default_assigned_to_id) |
|
1044 |
update_column(:default_assigned_to_id, nil) |
|
1045 |
end |
|
1046 | ||
1047 |
# MemberRole#remove_inherited_roles |
|
1048 |
children.where(inherit_members: true).map {|c| c.remove_inherited_member_roles(not_delete_ids) } |
|
1049 |
end |
|
1050 | ||
1026 | 1051 |
private |
1027 | 1052 | |
1028 | 1053 |
def update_inherited_members |
... | ... | |
1036 | 1061 |
end |
1037 | 1062 |
end |
1038 | 1063 | |
1039 |
def remove_inherited_member_roles |
|
1040 |
member_roles = MemberRole.where(:member_id => membership_ids).to_a |
|
1041 |
member_role_ids = member_roles.map(&:id) |
|
1042 |
member_roles.each do |member_role| |
|
1043 |
if member_role.inherited_from && !member_role_ids.include?(member_role.inherited_from) |
|
1044 |
member_role.destroy |
|
1045 |
end |
|
1046 |
end |
|
1047 |
end |
|
1048 | ||
1049 | 1064 |
def add_inherited_member_roles |
1050 | 1065 |
if inherit_members? && parent |
1051 | 1066 |
parent.memberships.each do |parent_member| |
test/unit/project_members_inheritance_test.rb | ||
---|---|---|
119 | 119 |
assert_equal other_member.roles.sort, member.roles.sort |
120 | 120 |
end |
121 | 121 | |
122 |
def test_moving_a_subproject_as_root_should_clear_issue_category_assigned_to |
|
123 |
Project.generate_with_parent!(@parent, :inherit_members => true) |
|
124 |
project = Project.order('id desc').first |
|
125 |
user = project.members.first.user |
|
126 |
category = IssueCategory.create!(:project => project, :assigned_to => user, :name => 'foo') |
|
127 | ||
128 |
assert_difference 'Member.count', -1 do |
|
129 |
project.set_parent!(nil) |
|
130 |
project.reload |
|
131 |
category.reload |
|
132 | ||
133 |
assert_equal 0, project.memberships.count |
|
134 |
assert_nil category.assigned_to |
|
135 |
end |
|
136 |
end |
|
137 | ||
138 |
def test_moving_a_subproject_as_root_should_clear_default_assigned_to |
|
139 |
Project.generate_with_parent!(@parent, :inherit_members => true) |
|
140 |
project = Project.order('id desc').first |
|
141 |
user = project.members.first.user |
|
142 |
project.update!(:default_assigned_to => user) |
|
143 | ||
144 |
assert_difference 'Member.count', -1 do |
|
145 |
project.set_parent!(nil) |
|
146 |
project.reload |
|
147 | ||
148 |
assert_equal 0, project.memberships.count |
|
149 |
assert_nil project.default_assigned_to |
|
150 |
end |
|
151 |
end |
|
152 | ||
122 | 153 |
def test_inheritance_should_propagate_to_subprojects |
123 | 154 |
project = Project.generate_with_parent!(@parent, :inherit_members => false) |
124 | 155 |
subproject = Project.generate_with_parent!(project, :inherit_members => true) |