Skip to content

Commit 80833b9

Browse files
Correctly order run_after tasks (#154)
With all other things equal, older tasks should come first (meaning they'll more likely to be run closer to their `run_after` date)
1 parent ee700b0 commit 80833b9

File tree

3 files changed

+37
-2
lines changed

3 files changed

+37
-2
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Generated by Django 5.1.5 on 2025-04-27 12:00
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
dependencies = [
8+
("django_tasks_database", "0014_remove_dbtaskresult_exception_data"),
9+
]
10+
11+
operations = [
12+
migrations.AlterModelOptions(
13+
name="dbtaskresult",
14+
options={
15+
"ordering": [
16+
models.OrderBy(models.F("priority"), descending=True),
17+
models.OrderBy(models.F("run_after"), nulls_last=True),
18+
],
19+
"verbose_name": "Task Result",
20+
"verbose_name_plural": "Task Results",
21+
},
22+
),
23+
]

django_tasks/backends/database/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ class DBTaskResult(GenericBase[P, T], models.Model):
108108
objects = DBTaskResultQuerySet.as_manager()
109109

110110
class Meta:
111-
ordering = [F("priority").desc(), F("run_after").desc(nulls_last=True)]
111+
ordering = [F("priority").desc(), F("run_after").asc(nulls_last=True)]
112112
verbose_name = _("Task Result")
113113
verbose_name_plural = _("Task Results")
114114

tests/tests/test_database_backend.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -638,6 +638,14 @@ def test_run_after(self) -> None:
638638
self.assertEqual(DBTaskResult.objects.succeeded().count(), 1)
639639

640640
def test_run_after_priority(self) -> None:
641+
old_task = test_tasks.noop_task.using(
642+
priority=20, run_after=timezone.now() - timedelta(hours=2)
643+
).enqueue()
644+
645+
very_old_task = test_tasks.noop_task.using(
646+
priority=20, run_after=timezone.now() - timedelta(hours=10)
647+
).enqueue()
648+
641649
far_future_result = test_tasks.noop_task.using(
642650
run_after=timezone.now() + timedelta(hours=10)
643651
).enqueue()
@@ -658,18 +666,22 @@ def test_run_after_priority(self) -> None:
658666
self.assertEqual(
659667
[dbt.task_result for dbt in DBTaskResult.objects.all()],
660668
[
669+
very_old_task,
670+
old_task,
661671
high_priority_far_future_result,
662672
high_priority_result,
663673
low_priority_result,
664-
far_future_result,
665674
future_result,
675+
far_future_result,
666676
lower_priority_result,
667677
],
668678
)
669679

670680
self.assertEqual(
671681
[dbt.task_result for dbt in DBTaskResult.objects.ready()],
672682
[
683+
very_old_task,
684+
old_task,
673685
high_priority_result,
674686
low_priority_result,
675687
lower_priority_result,

0 commit comments

Comments
 (0)