Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Add exclude_future_jobs arg to get_queue_depths
New arg exclude_future_jobs filters the READY and NEW jobs to only be ones without a run_after or the run_after is now/in the past
  • Loading branch information
George9Waller committed Feb 21, 2025
commit f28e85e124a71d32f51bcaf997bed52d5eb69867
15 changes: 11 additions & 4 deletions django_dbq/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
get_failure_hook_name,
get_creation_hook_name,
)
from django.db.models import JSONField, UUIDField, Count, TextChoices
from django.db.models import JSONField, UUIDField, Count, TextChoices, Q
import datetime
import logging
import uuid
Expand Down Expand Up @@ -173,10 +173,17 @@ def run_creation_hook(self):
creation_hook_function(self)

@staticmethod
def get_queue_depths():
def get_queue_depths(*, exclude_future_jobs=False):
jobs_waiting_in_queue = Job.objects.filter(
state__in=(Job.STATES.READY, Job.STATES.NEW)
)
if exclude_future_jobs:
jobs_waiting_in_queue = jobs_waiting_in_queue.filter(
Q(run_after__isnull=True) | Q(run_after__lte=timezone.now())
)

annotation_dicts = (
Job.objects.filter(state__in=(Job.STATES.READY, Job.STATES.NEW))
.values("queue_name")
jobs_waiting_in_queue.values("queue_name")
.order_by("queue_name")
.annotate(Count("queue_name"))
)
Expand Down
25 changes: 24 additions & 1 deletion django_dbq/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,12 +71,17 @@ def test_worker_with_queue_name(self):
self.assertTrue("test_queue" in output)


@freezegun.freeze_time("2025-01-01T12:00:00Z")
@override_settings(JOBS={"testjob": {"tasks": ["a"]}})
class JobModelMethodTestCase(TestCase):
def test_get_queue_depths(self):
Job.objects.create(name="testjob", queue_name="default")
Job.objects.create(name="testjob", queue_name="testworker")
Job.objects.create(name="testjob", queue_name="testworker")
Job.objects.create(
name="testjob",
queue_name="testworker",
run_after=timezone.make_aware(datetime(2025, 1, 1, 13, 0, 0)),
)
Job.objects.create(
name="testjob", queue_name="testworker", state=Job.STATES.FAILED
)
Expand All @@ -87,6 +92,24 @@ def test_get_queue_depths(self):
queue_depths = Job.get_queue_depths()
self.assertDictEqual(queue_depths, {"default": 1, "testworker": 2})

def test_get_queue_depths_exclude_future_jobs(self):
Job.objects.create(name="testjob", queue_name="default")
Job.objects.create(name="testjob", queue_name="testworker")
Job.objects.create(
name="testjob",
queue_name="testworker",
run_after=timezone.make_aware(datetime(2025, 1, 1, 13, 0, 0)),
)
Job.objects.create(
name="testjob", queue_name="testworker", state=Job.STATES.FAILED
)
Job.objects.create(
name="testjob", queue_name="testworker", state=Job.STATES.COMPLETE
)

queue_depths = Job.get_queue_depths(exclude_future_jobs=True)
self.assertDictEqual(queue_depths, {"default": 1, "testworker": 1})


@override_settings(JOBS={"testjob": {"tasks": ["a"]}})
class QueueDepthTestCase(TestCase):
Expand Down