Skip to content

Commit 4386344

Browse files
authored
Merge pull request #2604 from rommapp/task-page-cleanup
Task page cleanup
2 parents 87cf48e + eaf4144 commit 4386344

File tree

11 files changed

+88
-32
lines changed

11 files changed

+88
-32
lines changed

backend/endpoints/responses/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ class TaskExecutionResponse(TypedDict):
7575
task_name: str
7676
task_id: str
7777
status: JobStatus
78-
queued_at: str
78+
created_at: str | None
79+
enqueued_at: str | None
7980

8081

8182
class BaseTaskStatusResponse(TaskExecutionResponse):

backend/endpoints/tasks.py

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -121,15 +121,17 @@ def _build_task_status_response(
121121
task_type = job_meta.get("task_type")
122122

123123
# Convert datetime objects to ISO format strings
124-
queued_at = job.created_at.isoformat() if job.created_at else None
124+
created_at = job.created_at.isoformat() if job.created_at else None
125125
started_at = job.started_at.isoformat() if job.started_at else None
126126
ended_at = job.ended_at.isoformat() if job.ended_at else None
127+
enqueued_at = job.enqueued_at.isoformat() if job.enqueued_at else None
127128

128129
common_data = {
129130
"task_name": task_name,
130131
"task_id": job.get_id(),
131132
"status": job.get_status(),
132-
"queued_at": queued_at or "",
133+
"created_at": created_at,
134+
"enqueued_at": enqueued_at,
133135
"started_at": started_at,
134136
"ended_at": ended_at,
135137
}
@@ -275,7 +277,10 @@ async def get_tasks_status(request: Request) -> list[TaskStatusResponse]:
275277
job = Job.fetch(job_id, connection=redis_client)
276278
all_tasks.append(_build_task_status_response(job))
277279

278-
all_tasks.sort(key=lambda x: x["started_at"] or x["queued_at"], reverse=True)
280+
all_tasks.sort(
281+
key=lambda x: x["started_at"] or x["enqueued_at"] or x["created_at"] or "",
282+
reverse=True,
283+
)
279284

280285
return all_tasks
281286

@@ -344,7 +349,12 @@ async def run_all_tasks(request: Request) -> list[TaskExecutionResponse]:
344349
task_name=task_name,
345350
task_id=job.get_id(),
346351
status=job.get_status() or JobStatus.QUEUED,
347-
queued_at=datetime.now(timezone.utc).isoformat(),
352+
created_at=(
353+
job.created_at.isoformat()
354+
if job.created_at
355+
else datetime.now(timezone.utc).isoformat()
356+
),
357+
enqueued_at=job.enqueued_at.isoformat() if job.enqueued_at else None,
348358
)
349359
for (task_name, job) in jobs
350360
]
@@ -390,5 +400,10 @@ async def run_single_task(request: Request, task_name: str) -> TaskExecutionResp
390400
"task_name": task_instance.title,
391401
"task_id": job.get_id(),
392402
"status": job.get_status() or JobStatus.QUEUED,
393-
"queued_at": datetime.now(timezone.utc).isoformat(),
403+
"created_at": (
404+
job.created_at.isoformat()
405+
if job.created_at
406+
else datetime.now(timezone.utc).isoformat()
407+
),
408+
"enqueued_at": job.enqueued_at.isoformat() if job.enqueued_at else None,
394409
}

backend/tests/endpoints/test_tasks.py

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,26 @@ def mock_non_manual_task():
5656
return task
5757

5858

59+
def create_mock_job(job_id="1", status="queued"):
60+
"""Helper function to create a mock job with proper datetime attributes"""
61+
from datetime import datetime
62+
63+
mock_job = Mock()
64+
mock_job.get_id.return_value = job_id
65+
mock_job.get_status.return_value = status
66+
67+
# Create mock datetime objects with isoformat methods
68+
mock_created_at = Mock()
69+
mock_created_at.isoformat = lambda: datetime.now().isoformat()
70+
mock_job.created_at = mock_created_at
71+
72+
mock_enqueued_at = Mock()
73+
mock_enqueued_at.isoformat = lambda: datetime.now().isoformat()
74+
mock_job.enqueued_at = mock_enqueued_at
75+
76+
return mock_job
77+
78+
5979
class TestListTasks:
6080
"""Test suite for the list_tasks endpoint"""
6181

@@ -192,12 +212,7 @@ def test_list_tasks_insufficient_scope(self, client, admin_user):
192212
class TestRunAllTasks:
193213
"""Test suite for the run_all_tasks endpoint"""
194214

195-
@patch(
196-
"endpoints.tasks.low_prio_queue.enqueue",
197-
return_value=Mock(
198-
get_id=Mock(return_value="1"), get_status=Mock(return_value="queued")
199-
),
200-
)
215+
@patch("endpoints.tasks.low_prio_queue.enqueue", return_value=create_mock_job())
201216
@patch(
202217
"endpoints.tasks.manual_tasks",
203218
[
@@ -332,12 +347,7 @@ def test_run_all_tasks_unauthorized(self, client):
332347
class TestRunSingleTask:
333348
"""Test suite for the run_single_task endpoint"""
334349

335-
@patch(
336-
"endpoints.tasks.low_prio_queue.enqueue",
337-
return_value=Mock(
338-
get_id=Mock(return_value="1"), get_status=Mock(return_value="queued")
339-
),
340-
)
350+
@patch("endpoints.tasks.low_prio_queue.enqueue", return_value=create_mock_job())
341351
@patch(
342352
"endpoints.tasks.manual_tasks",
343353
[
@@ -370,7 +380,8 @@ def test_run_single_task_success(self, mock_queue, client, access_token):
370380
assert data["task_name"] == "Test Task"
371381
assert data["task_id"] == "1"
372382
assert data["status"] == "queued"
373-
assert "queued_at" in data
383+
assert "created_at" in data
384+
assert "enqueued_at" in data
374385

375386
mock_queue.assert_called_once()
376387

@@ -466,6 +477,8 @@ def test_get_task_by_id_success(
466477
"""Test successful retrieval of a task by job ID"""
467478
# Mock job object with all necessary attributes
468479
mock_job = Mock()
480+
mock_job.enqueued_at = Mock()
481+
mock_job.enqueued_at.isoformat.return_value = "2023-01-01T00:00:00"
469482
mock_job.created_at = Mock()
470483
mock_job.created_at.isoformat.return_value = "2023-01-01T00:00:00"
471484
mock_job.started_at = Mock()
@@ -494,7 +507,8 @@ def test_get_task_by_id_success(
494507
assert data["task_name"] == "test_task"
495508
assert data["task_id"] == "test-job-id-123"
496509
assert data["status"] == "finished"
497-
assert data["queued_at"] == "2023-01-01T00:00:00"
510+
assert data["created_at"] == "2023-01-01T00:00:00"
511+
assert data["enqueued_at"] == "2023-01-01T00:00:00"
498512
assert data["started_at"] == "2023-01-01T00:01:00"
499513
assert data["ended_at"] == "2023-01-01T00:02:00"
500514

@@ -526,6 +540,8 @@ def test_get_task_by_id_with_exception_info(
526540
):
527541
"""Test retrieval of a task that failed with exception"""
528542
mock_job = Mock()
543+
mock_job.enqueued_at = Mock()
544+
mock_job.enqueued_at.isoformat.return_value = "2023-01-01T00:00:00"
529545
mock_job.created_at = Mock()
530546
mock_job.created_at.isoformat.return_value = "2023-01-01T00:00:00"
531547
mock_job.started_at = Mock()
@@ -611,9 +627,7 @@ class TestIntegration:
611627
@patch("endpoints.tasks.RESCAN_ON_FILESYSTEM_CHANGE_DELAY", 5)
612628
@patch(
613629
"endpoints.tasks.low_prio_queue.enqueue",
614-
return_value=Mock(
615-
get_id=Mock(return_value="1"), get_status=Mock(return_value="queued")
616-
),
630+
return_value=create_mock_job(),
617631
)
618632
def test_full_workflow(self, mock_queue, client, access_token):
619633
"""Test a complete workflow: list tasks, then run a specific task"""

frontend/src/__generated__/models/CleanupTaskStatusResponse.ts

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

frontend/src/__generated__/models/ConversionTaskStatusResponse.ts

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

frontend/src/__generated__/models/GenericTaskStatusResponse.ts

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

frontend/src/__generated__/models/ScanTaskStatusResponse.ts

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

frontend/src/__generated__/models/TaskExecutionResponse.ts

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

frontend/src/__generated__/models/UpdateTaskStatusResponse.ts

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

frontend/src/__generated__/models/WatcherTaskStatusResponse.ts

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)