Skip to content

Commit 9535e14

Browse files
authored
Merge pull request opf#18888 from opf/bugfix/63831-error-500-when-bulk-delete-related-work-packages
[63831] Fix error 500 when bulk deleting related work packages
2 parents c0b13d0 + 16d7501 commit 9535e14

File tree

3 files changed

+31
-8
lines changed

3 files changed

+31
-8
lines changed

app/services/work_packages/delete_service.rb

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ def persist(service_result)
5050

5151
def destroy_descendants(descendants, result)
5252
descendants.each do |descendant|
53-
success = destroy(descendant)
53+
success = destroy(descendant.reload)
5454
result.add_dependent!(ServiceResult.new(success:, result: descendant))
5555
end
5656
end
@@ -63,6 +63,7 @@ def destroy(work_package)
6363

6464
def find_successors_of_self_and_descendants(work_package)
6565
WorkPackage.where(id: Relation.follows.of_predecessor(work_package.self_and_descendants).select(:from_id))
66+
.where.not(id: work_package.self_and_descendants)
6667
end
6768

6869
def update_ancestors_and_successors(successors, result)
@@ -94,8 +95,8 @@ def reschedule_related(deleted_work_package, successors)
9495
.new(user:, work_package: work_packages_to_reschedule)
9596
.call
9697

97-
result.dependent_results.map(&:result).each do |dependent_result|
98-
dependent_result.save(validate: false)
98+
result.dependent_results.map(&:result).each do |rescheduled_work_package|
99+
rescheduled_work_package.save(validate: false)
99100
end
100101

101102
result

spec/controllers/work_packages/bulk_controller_spec.rb

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@
8181
principal: user,
8282
roles: [role])
8383
end
84-
shared_let(:work_package1) do
84+
shared_let(:work_package1, refind: true) do
8585
create(:work_package,
8686
author: user,
8787
assigned_to: user,
@@ -91,7 +91,7 @@
9191
custom_field_values: { custom_field1.id => custom_field_value },
9292
project: project1)
9393
end
94-
shared_let(:work_package2) do
94+
shared_let(:work_package2, refind: true) do
9595
create(:work_package,
9696
author: user,
9797
assigned_to: user,
@@ -101,7 +101,7 @@
101101
custom_field_values: { custom_field1.id => custom_field_value },
102102
project: project1)
103103
end
104-
shared_let(:work_package3) do
104+
shared_let(:work_package3, refind: true) do
105105
create(:work_package,
106106
author: user,
107107
type:,
@@ -643,5 +643,23 @@ def send_destroy_request
643643
expect(response).to redirect_to(project_work_packages_path(work_package1.project))
644644
end
645645
end
646+
647+
context "with children work packages following each other" do
648+
before_all do
649+
work_package1.update(subject: "parent", schedule_manually: false)
650+
work_package2.update(subject: "predecessor child", parent: work_package1, schedule_manually: true)
651+
work_package3.update(subject: "successor child", parent: work_package1, schedule_manually: false)
652+
create(:follows_relation, predecessor: work_package2, successor: work_package3)
653+
end
654+
655+
let(:params) { { "ids" => [work_package1.id, work_package2.id, work_package3.id] } }
656+
657+
it "deletes them all without errors" do
658+
expect { send_destroy_request }.not_to raise_error
659+
660+
expect(WorkPackage.count).to eq(0)
661+
expect(response).to redirect_to(project_work_packages_path(project1))
662+
end
663+
end
646664
end
647665
end

spec/services/work_packages/delete_service_spec.rb

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,10 +133,14 @@
133133

134134
context "with descendants" do
135135
let(:child) do
136-
build_stubbed(:work_package)
136+
build_stubbed(:work_package).tap do |wp|
137+
allow(wp).to receive(:reload).and_return(wp)
138+
end
137139
end
138140
let(:grandchild) do
139-
build_stubbed(:work_package)
141+
build_stubbed(:work_package).tap do |wp|
142+
allow(wp).to receive(:reload).and_return(wp)
143+
end
140144
end
141145
let(:descendants) do
142146
[child, grandchild]

0 commit comments

Comments
 (0)