Project

General

Profile

Patch #43203 ยป optimize_remove_inherited_member_roles.patch

Kenta Kumojima, 2025-09-13 07:54

View differences:

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)
    (1-1/1)