Skip to content

Commit aaf8787

Browse files
committed
fix:local datetime for OnceTask #280
1 parent 0bc3066 commit aaf8787

File tree

4 files changed

+27
-30
lines changed

4 files changed

+27
-30
lines changed

scheduler/admin/task_admin.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from django.contrib.contenttypes.admin import GenericStackedInline
55
from django.db.models import QuerySet
66
from django.http import HttpRequest
7+
from django.utils import timezone, formats
78
from django.utils.translation import gettext_lazy as _
89

910
from scheduler.helpers.queues import get_queue
@@ -120,7 +121,11 @@ class Media:
120121
@admin.display(description="Schedule")
121122
def task_schedule(self, o: Task) -> str:
122123
if o.task_type == TaskType.ONCE.value:
123-
return f"Run once: {o.scheduled_time:%Y-%m-%d %H:%M:%S}"
124+
if timezone.is_naive(o.scheduled_time):
125+
local_time = timezone.make_aware(o.scheduled_time, timezone.get_current_timezone())
126+
else:
127+
local_time = timezone.localtime(o.scheduled_time)
128+
return f"Run once: {formats.date_format(local_time, 'DATETIME_FORMAT')}"
124129
elif o.task_type == TaskType.CRON.value:
125130
return f"Cron: {o.cron_string}"
126131
else: # if o.task_type == TaskType.REPEATABLE.value:

scheduler/tests/test_task_types/test_once_task.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
from datetime import timedelta, datetime
22

3+
import time_machine
34
from django.core.exceptions import ValidationError
5+
from django.urls import reverse
46
from django.utils import timezone
57

68
from scheduler import settings
@@ -9,7 +11,7 @@
911
from scheduler.tests.testtools import task_factory
1012

1113

12-
class TestScheduledTask(BaseTestCases.TestSchedulableTask):
14+
class TestScheduledOnceTask(BaseTestCases.TestSchedulableTask):
1315
task_type = TaskType.ONCE
1416
queue_name = settings.get_queue_names()[0]
1517

@@ -19,6 +21,17 @@ def test_clean(self):
1921
task.callable = "scheduler.tests.jobs.test_job"
2022
self.assertIsNone(task.clean())
2123

24+
@time_machine.travel(datetime(2016, 12, 25))
25+
def test_admin_changelist_view__has_timezone_data(self):
26+
# arrange
27+
self.client.login(username="admin", password="admin")
28+
task_factory(self.task_type)
29+
url = reverse("admin:scheduler_task_changelist")
30+
# act
31+
res = self.client.get(url)
32+
# assert
33+
self.assertContains(res, "Run once: Dec. 26, 2016, midnight", count=1, status_code=200)
34+
2235
def test_create_without_date__fail(self):
2336
task = task_factory(self.task_type, scheduled_time=None, instance_only=True)
2437
self.assertIsNone(task.scheduled_time)

scheduler/tests/test_task_types/test_repeatable_task.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414

1515
class TestRepeatableTask(BaseTestCases.TestSchedulableTask):
16+
task_type = TaskType.REPEATABLE
1617
queue_name = settings.get_queue_names()[0]
1718

1819
def test_create_task_error(self):

scheduler/tests/test_task_types/test_task_model.py

Lines changed: 6 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ def test_function_string(self):
265265
f"key1='one', key2=2, key3={repr(date)}, key4=False)",
266266
)
267267

268-
def test_admin_list_view(self):
268+
def test_admin_changelist_view(self):
269269
# arrange
270270
self.client.login(username="admin", password="admin")
271271
task_factory(self.task_type)
@@ -278,20 +278,10 @@ def test_admin_list_view(self):
278278
def test_admin_list_view_delete_model(self):
279279
# arrange
280280
self.client.login(username="admin", password="admin")
281-
task = task_factory(
282-
self.task_type,
283-
)
281+
task = task_factory(self.task_type)
284282
url = reverse("admin:scheduler_task_changelist")
285283
# act
286-
res = self.client.post(
287-
url,
288-
data={
289-
"action": "delete_model",
290-
"_selected_action": [
291-
task.pk,
292-
],
293-
},
294-
)
284+
res = self.client.post(url, data={"action": "delete_model", "_selected_action": [task.pk]})
295285
# assert
296286
self.assertEqual(302, res.status_code)
297287

@@ -320,15 +310,8 @@ def test_admin_run_job_now_enqueues_job_at(self):
320310
def test_admin_change_view(self):
321311
# arrange
322312
self.client.login(username="admin", password="admin")
323-
task = task_factory(
324-
self.task_type,
325-
)
326-
url = reverse(
327-
"admin:scheduler_task_change",
328-
args=[
329-
task.pk,
330-
],
331-
)
313+
task = task_factory(self.task_type)
314+
url = reverse("admin:scheduler_task_change", args=[task.pk])
332315
# act
333316
res = self.client.get(url)
334317
# assert
@@ -339,12 +322,7 @@ def test_admin_change_view__bad_redis_connection(self):
339322
self.client.login(username="admin", password="admin")
340323
task = task_factory(self.task_type, queue="test2", instance_only=True)
341324
task.save(schedule_job=False)
342-
url = reverse(
343-
"admin:scheduler_task_change",
344-
args=[
345-
task.pk,
346-
],
347-
)
325+
url = reverse("admin:scheduler_task_change", args=[task.pk])
348326
# act
349327
res = self.client.get(url)
350328
# assert

0 commit comments

Comments
 (0)