Skip to content

Commit 6708db6

Browse files
committed
fix:get_many return nones #285
1 parent 4386a7a commit 6708db6

File tree

4 files changed

+79
-73
lines changed

4 files changed

+79
-73
lines changed

scheduler/helpers/queues/queue_logic.py

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -167,37 +167,38 @@ def get_registry(self, name: str) -> JobNamesRegistry:
167167
raise NoSuchRegistryError(f"Unknown registry name {name}")
168168

169169
def get_all_job_names(self) -> List[str]:
170-
res = list()
171-
res.extend(self.queued_job_registry.all())
172-
res.extend(self.finished_job_registry.all())
173-
res.extend(self.active_job_registry.all())
174-
res.extend(self.failed_job_registry.all())
175-
res.extend(self.scheduled_job_registry.all())
176-
res.extend(self.canceled_job_registry.all())
170+
all_job_names = list()
171+
all_job_names.extend(self.queued_job_registry.all())
172+
all_job_names.extend(self.finished_job_registry.all())
173+
all_job_names.extend(self.active_job_registry.all())
174+
all_job_names.extend(self.failed_job_registry.all())
175+
all_job_names.extend(self.scheduled_job_registry.all())
176+
all_job_names.extend(self.canceled_job_registry.all())
177+
res = list(filter(lambda job_name: JobModel.exists(job_name, self.connection), all_job_names))
177178
return res
178179

179180
def get_all_jobs(self) -> List[JobModel]:
180181
job_names = self.get_all_job_names()
181182
return JobModel.get_many(job_names, connection=self.connection)
182183

183184
def create_and_enqueue_job(
184-
self,
185-
func: FunctionReferenceType,
186-
args: Union[Tuple[Any, ...], List[Any], None] = None,
187-
kwargs: Optional[Dict[str, Any]] = None,
188-
when: Optional[datetime] = None,
189-
timeout: Optional[int] = None,
190-
result_ttl: Optional[int] = None,
191-
job_info_ttl: Optional[int] = None,
192-
description: Optional[str] = None,
193-
name: Optional[str] = None,
194-
at_front: bool = False,
195-
meta: Optional[Dict[str, Any]] = None,
196-
on_success: Optional[Callback] = None,
197-
on_failure: Optional[Callback] = None,
198-
on_stopped: Optional[Callback] = None,
199-
task_type: Optional[str] = None,
200-
scheduled_task_id: Optional[int] = None,
185+
self,
186+
func: FunctionReferenceType,
187+
args: Union[Tuple[Any, ...], List[Any], None] = None,
188+
kwargs: Optional[Dict[str, Any]] = None,
189+
when: Optional[datetime] = None,
190+
timeout: Optional[int] = None,
191+
result_ttl: Optional[int] = None,
192+
job_info_ttl: Optional[int] = None,
193+
description: Optional[str] = None,
194+
name: Optional[str] = None,
195+
at_front: bool = False,
196+
meta: Optional[Dict[str, Any]] = None,
197+
on_success: Optional[Callback] = None,
198+
on_failure: Optional[Callback] = None,
199+
on_stopped: Optional[Callback] = None,
200+
task_type: Optional[str] = None,
201+
scheduled_task_id: Optional[int] = None,
201202
) -> JobModel:
202203
"""Creates a job to represent the delayed function call and enqueues it.
203204
:param when: When to schedule the job (None to enqueue immediately)
@@ -248,7 +249,7 @@ def create_and_enqueue_job(
248249
return job_model
249250

250251
def job_handle_success(
251-
self, job: JobModel, result: Any, job_info_ttl: int, result_ttl: int, connection: ConnectionType
252+
self, job: JobModel, result: Any, job_info_ttl: int, result_ttl: int, connection: ConnectionType
252253
) -> None:
253254
"""Saves and cleanup job after successful execution"""
254255
job.after_execution(
@@ -307,7 +308,7 @@ def run_sync(self, job: JobModel) -> JobModel:
307308

308309
@classmethod
309310
def dequeue_any(
310-
cls, queues: List[Self], timeout: Optional[int], connection: ConnectionType
311+
cls, queues: List[Self], timeout: Optional[int], connection: ConnectionType
311312
) -> Tuple[Optional[JobModel], Optional[Self]]:
312313
"""Class method returning a Job instance at the front of the given set of Queues, where the order of the queues
313314
is important.
@@ -410,7 +411,7 @@ def delete_job(self, job_name: str, expire_job_model: bool = True) -> None:
410411
pass
411412

412413
def enqueue_job(
413-
self, job_model: JobModel, pipeline: Optional[PipelineType] = None, at_front: bool = False
414+
self, job_model: JobModel, pipeline: Optional[PipelineType] = None, at_front: bool = False
414415
) -> JobModel:
415416
"""Enqueues a job for delayed execution without checking dependencies.
416417

scheduler/templates/admin/scheduler/jobs-list-with-tasks.partial.html

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -30,27 +30,13 @@ <h2>Job executions</h2>
3030
</a>
3131
{% endif %}
3232
</td>
33-
<td>
34-
{{ exec|job_status }}
35-
</td>
36-
<td>
37-
{{ exec.created_at|date:"Y-m-d, H:i:s"|default:"-" }}
38-
</td>
39-
<td>
40-
{{ exec.enqueued_at|date:"Y-m-d, H:i:s"|default:"-" }}
41-
</td>
42-
<td>
43-
{{ exec.started_at|date:"Y-m-d, H:i:s"|default:"-" }}
44-
</td>
45-
<td>
46-
{{ exec|job_runtime }}
47-
</td>
48-
<td>
49-
{{ exec.worker_name|default:"-" }}
50-
</td>
51-
<td>
52-
{{ exec|job_result|default:"-" }}
53-
</td>
33+
<td>{{ exec|job_status }}</td>
34+
<td>{{ exec.created_at|date:"Y-m-d, H:i:s"|default:"-" }}</td>
35+
<td>{{ exec.enqueued_at|date:"Y-m-d, H:i:s"|default:"-" }}</td>
36+
<td>{{ exec.started_at|date:"Y-m-d, H:i:s"|default:"-" }}</td>
37+
<td>{{ exec|job_runtime }}</td>
38+
<td>{{ exec.worker_name|default:"-" }}</td>
39+
<td>{{ exec|job_result|default:"-" }}</td>
5440
</tr>
5541
{% endfor %}
5642
</tbody>
@@ -68,9 +54,8 @@ <h2>Job executions</h2>
6854
class="end" {% endif %}>{{ i }}</a>
6955
{% endif %}
7056
{% endfor %}
71-
{{ executions.paginator.count }} {% blocktranslate count counter=executions.paginator.count %}entry
72-
{% plural %}entries{% endblocktranslate %}
7357
{% endif %}
58+
<span id="counter">{{ executions.paginator.count }} {% blocktranslate count counter=executions.paginator.count %}entry{% plural %}entries{% endblocktranslate %}</span>
7459
</p>
7560
</fieldset>
7661
{% endif %}

scheduler/templates/admin/scheduler/jobs-list.partial.html

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -27,27 +27,13 @@ <h2>Job executions</h2>
2727
</a>
2828
{% endif %}
2929
</td>
30-
<td>
31-
{{ exec|job_status }}
32-
</td>
33-
<td>
34-
{{ exec.created_at|date:"Y-m-d, H:i:s"|default:"-" }}
35-
</td>
36-
<td>
37-
{{ exec.enqueued_at|date:"Y-m-d, H:i:s"|default:"-" }}
38-
</td>
39-
<td>
40-
{{ exec.started_at|date:"Y-m-d, H:i:s"|default:"-" }}
41-
</td>
42-
<td>
43-
{{ exec|job_runtime }}
44-
</td>
45-
<td>
46-
{{ exec.worker_name|default:"-" }}
47-
</td>
48-
<td>
49-
{{ exec|job_result|default:"-" }}
50-
</td>
30+
<td>{{ exec|job_status }}</td>
31+
<td>{{ exec.created_at|date:"Y-m-d, H:i:s"|default:"-" }}</td>
32+
<td>{{ exec.enqueued_at|date:"Y-m-d, H:i:s"|default:"-" }}</td>
33+
<td>{{ exec.started_at|date:"Y-m-d, H:i:s"|default:"-" }}</td>
34+
<td>{{ exec|job_runtime }}</td>
35+
<td>{{ exec.worker_name|default:"-" }}</td>
36+
<td>{{ exec|job_result|default:"-" }}</td>
5137
</tr>
5238
{% endfor %}
5339
</tbody>
@@ -65,9 +51,8 @@ <h2>Job executions</h2>
6551
class="end" {% endif %}>{{ i }}</a>
6652
{% endif %}
6753
{% endfor %}
68-
{{ executions.paginator.count }} {% blocktranslate count counter=executions.paginator.count %}entry
69-
{% plural %}entries{% endblocktranslate %}
7054
{% endif %}
55+
<span id="counter">{{ executions.paginator.count }} {% blocktranslate count counter=executions.paginator.count %}entry{% plural %}entries{% endblocktranslate %}</span>
7156
</p>
7257
</fieldset>
7358
{% endif %}

scheduler/tests/test_task_types/test_once_task.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
from django.utils import timezone
77

88
from scheduler import settings
9+
from scheduler.helpers.queues import get_queue
910
from scheduler.models import TaskType
11+
from scheduler.redis_models import JobModel
1012
from scheduler.tests.test_task_types.test_task_model import BaseTestCases
1113
from scheduler.tests.testtools import task_factory
1214

@@ -32,6 +34,39 @@ def test_admin_changelist_view__has_timezone_data(self):
3234
# assert
3335
self.assertContains(res, "Run once: Dec. 26, 2016, midnight", count=1, status_code=200)
3436

37+
@time_machine.travel(datetime(2016, 12, 25))
38+
def test_admin_change_view__has_execution_list(self):
39+
# arrange
40+
self.client.login(username="admin", password="admin")
41+
task = task_factory(self.task_type)
42+
queue = get_queue(self.queue_name)
43+
job = JobModel.get(task.job_name, connection=queue.connection)
44+
url = reverse("admin:scheduler_task_change", args=(task.id,))
45+
# act
46+
res = self.client.get(url)
47+
# assert
48+
self.assertContains(res, "Job executions")
49+
self.assertContains(res, """<table id="result_list">""")
50+
self.assertContains(res, task.job_name, status_code=200)
51+
self.assertContains(res, "Scheduled", status_code=200)
52+
self.assertContains(res, """<span id="counter">1""", status_code=200)
53+
54+
@time_machine.travel(datetime(2016, 12, 25))
55+
def test_admin_change_view__has_empty_execution_list(self):
56+
# arrange
57+
self.client.login(username="admin", password="admin")
58+
task = task_factory(self.task_type)
59+
queue = get_queue(self.queue_name)
60+
job = JobModel.get(task.job_name, connection=queue.connection)
61+
JobModel.delete(job, connection=queue.connection)
62+
url = reverse("admin:scheduler_task_change", args=(task.id,))
63+
# act
64+
res = self.client.get(url)
65+
# assert
66+
self.assertContains(res, "Job executions")
67+
self.assertContains(res, """<table id="result_list">""")
68+
self.assertContains(res, """<span id="counter">0""", status_code=200)
69+
3570
def test_create_without_date__fail(self):
3671
task = task_factory(self.task_type, scheduled_time=None, instance_only=True)
3772
self.assertIsNone(task.scheduled_time)

0 commit comments

Comments
 (0)