From 9c79f3537b2759ec8097ed7b6feec3c3820a26e2 Mon Sep 17 00:00:00 2001 From: Iasmini Gomes Date: Thu, 23 May 2024 09:04:53 -0300 Subject: [PATCH] feat: use env var to limit eta task --- django_cloud_tasks/tasks/task.py | 5 +++++ .../sample_app/tests/tests_tasks/tests_tasks.py | 13 +++++++++++++ sample_project/settings.py | 2 ++ 3 files changed, 20 insertions(+) diff --git a/django_cloud_tasks/tasks/task.py b/django_cloud_tasks/tasks/task.py index d188fd6..6cc2e8c 100644 --- a/django_cloud_tasks/tasks/task.py +++ b/django_cloud_tasks/tasks/task.py @@ -19,6 +19,7 @@ from django_cloud_tasks.serializers import deserialize, serialize import json from django.http import HttpRequest +from django.conf import settings def register(task_class) -> None: @@ -229,6 +230,10 @@ def later(cls, task_kwargs: dict, eta: int | timedelta | datetime, queue: str = f"Unsupported schedule {eta} of type {eta.__class__.__name__}. " "Must be int, timedelta or datetime." ) + max_eta_task = getattr(settings, "MAXIMUM_ETA_TASK", None) + if max_eta_task is not None and delay_in_seconds > max_eta_task: + raise ValueError(f"Invalid delay time {delay_in_seconds}, maximum is {max_eta_task}") + return cls.push( task_kwargs=task_kwargs, queue=queue, diff --git a/sample_project/sample_app/tests/tests_tasks/tests_tasks.py b/sample_project/sample_app/tests/tests_tasks/tests_tasks.py index 109e414..4519380 100644 --- a/sample_project/sample_app/tests/tests_tasks/tests_tasks.py +++ b/sample_project/sample_app/tests/tests_tasks/tests_tasks.py @@ -15,6 +15,7 @@ from django_cloud_tasks.tests import tests_base from django_cloud_tasks.tests.tests_base import eager_tasks from sample_app import models, tasks +from django.conf import settings from django.http import HttpRequest from sample_app.tasks import MyMetadata @@ -224,6 +225,18 @@ def test_task_later_error(self): push.assert_not_called() + def test_task_later_delay_exceeds_maximum_eta(self): + with self.settings(MAXIMUM_ETA_TASK=settings.MAXIMUM_ETA_TASK): + task_kwargs = dict(price=30, quantity=4, discount=0.2) + excessive_delay = int(60 * 60 * 24 * 2) # 2 days + + with self.assertRaises(ValueError) as context: + tasks.CalculatePriceTask.later(eta=excessive_delay, task_kwargs=task_kwargs) + + self.assertEqual( + f"Invalid delay time {excessive_delay}, maximum is {settings.MAXIMUM_ETA_TASK}", str(context.exception) + ) + def test_singleton_client_on_task(self): # we have a singleton if it calls the same task twice with ( diff --git a/sample_project/settings.py b/sample_project/settings.py index 61d62ba..7831ba9 100644 --- a/sample_project/settings.py +++ b/sample_project/settings.py @@ -108,3 +108,5 @@ REST_FRAMEWORK = { "DATETIME_FORMAT": "%Y-%m-%dT%H:%M:%SZ", } + +MAXIMUM_ETA_TASK = 60 * 60 * 24 # 1 day