Skip to content

Commit a110a9d

Browse files
committed
Don't update queue positions if packaged workbasket is no longer a queue member
1 parent a01b1d0 commit a110a9d

File tree

2 files changed

+37
-5
lines changed

2 files changed

+37
-5
lines changed

publishing/models/packaged_workbasket.py

+6-5
Original file line numberDiff line numberDiff line change
@@ -669,7 +669,7 @@ def promote_to_top_position(self) -> "PackagedWorkBasket":
669669
"""Promote the instance to the top position of the package processing
670670
queue so that it occupies position 1."""
671671

672-
if self.position == 1:
672+
if self.position <= 1:
673673
return self
674674

675675
position = self.position
@@ -680,6 +680,7 @@ def promote_to_top_position(self) -> "PackagedWorkBasket":
680680

681681
self.position = 1
682682
self.save()
683+
self.refresh_from_db()
683684

684685
return self
685686

@@ -689,8 +690,8 @@ def promote_position(self) -> "PackagedWorkBasket":
689690
"""Promote the instance by one position up the package processing
690691
queue."""
691692

692-
if self.position == 1:
693-
return
693+
if self.position <= 1:
694+
return self
694695

695696
obj_to_swap = PackagedWorkBasket.objects.select_for_update(nowait=True).get(
696697
position=self.position - 1,
@@ -711,8 +712,8 @@ def demote_position(self) -> "PackagedWorkBasket":
711712
"""Demote the instance by one position down the package processing
712713
queue."""
713714

714-
if self.position == PackagedWorkBasket.objects.max_position():
715-
return
715+
if self.position in {0, PackagedWorkBasket.objects.max_position()}:
716+
return self
716717

717718
obj_to_swap = PackagedWorkBasket.objects.select_for_update(nowait=True).get(
718719
position=self.position + 1,

publishing/tests/test_models.py

+31
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,37 @@ def test_demote_position():
333333
assert initially_second.position == 1
334334

335335

336+
def test_cannot_promote_or_demote_removed_packaged_workbasket():
337+
"""Tests that packaged workbasket positions remain unchanged after
338+
attempting to reposition a packaged workbasket that has since been removed
339+
from the queue."""
340+
with patch(
341+
"publishing.tasks.create_xml_envelope_file.apply_async",
342+
return_value=MagicMock(id=factory.Faker("uuid4")),
343+
):
344+
factories.PackagedWorkBasketFactory()
345+
346+
with patch(
347+
"publishing.tasks.create_xml_envelope_file.apply_async",
348+
return_value=MagicMock(id=factory.Faker("uuid4")),
349+
):
350+
factories.PackagedWorkBasketFactory()
351+
352+
queued_pwb = PackagedWorkBasket.objects.get(position=1)
353+
removed_pwb = PackagedWorkBasket.objects.get(position=2)
354+
removed_pwb.abandon()
355+
356+
removed_pwb = removed_pwb.promote_to_top_position()
357+
assert removed_pwb.position == 0
358+
queued_pwb.refresh_from_db()
359+
assert queued_pwb.position == 1
360+
361+
removed_pwb = removed_pwb.demote_position()
362+
assert removed_pwb.position == 0
363+
queued_pwb.refresh_from_db()
364+
assert queued_pwb.position == 1
365+
366+
336367
def test_pause_and_unpause_queue(unpause_queue):
337368
assert not OperationalStatus.is_queue_paused()
338369
OperationalStatus.pause_queue(user=None)

0 commit comments

Comments
 (0)