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) |