From f254e04fc5e18d2ad7fc6225cf13e3cc1772366d Mon Sep 17 00:00:00 2001 From: mahmamdouh Date: Sun, 4 Jan 2026 18:01:23 +0100 Subject: [PATCH] fix loading issue --- app/models.py | 3 ++- app/routes/jobs.py | 20 +++++++++++++++++--- app/templates/dashboard/index.html | 8 ++++---- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/app/models.py b/app/models.py index a206e1d..c58633e 100644 --- a/app/models.py +++ b/app/models.py @@ -49,6 +49,7 @@ class Job(db.Model): 'in_progress': '🔄', 'passed': '✅', 'failed': '❌', - 'aborted': '⚫' + 'aborted': '⚫', + 'error': '⚠️' } return icons.get(self.status, '⚪') diff --git a/app/routes/jobs.py b/app/routes/jobs.py index 860326b..e1c6237 100644 --- a/app/routes/jobs.py +++ b/app/routes/jobs.py @@ -517,6 +517,10 @@ def update_job_status_internal(job): r_data = r_resp.json() for key, val in r_data.items(): if key.upper() == scenario.upper(): + # Transform file:/// link to web link + if isinstance(val, list) and len(val) > 1 and val[1].startswith('file:///'): + val[1] = val[1].replace('file:///home/asf/testarena/', 'http://asf-server.duckdns.org:8080/results/') + results[scenario] = val if val[0] == 'FAIL': any_failed = True @@ -525,17 +529,27 @@ def update_job_status_internal(job): all_finished = False elif t_data.get('status') == 'Aborted': results[scenario] = ['ABORTED', '#'] - all_finished = True # Or handle as aborted + all_finished = True + elif t_data.get('status') == 'Error': + results[scenario] = ['ERROR', '#'] + any_failed = True + all_finished = True else: all_finished = False else: all_finished = False else: - if results[scenario][0] == 'FAIL': + if results[scenario][0] in ['FAIL', 'ERROR']: any_failed = True if all_finished and task_ids: - job.status = 'failed' if any_failed else 'passed' + # If any task has ERROR, the job status could be 'error' or 'failed' + # User said "mark it in the dash board as error" + has_error = any(r[0] == 'ERROR' for r in results.values()) + if has_error: + job.status = 'error' + else: + job.status = 'failed' if any_failed else 'passed' from app import db job.completed_at = db.session.query(db.func.now()).scalar() diff --git a/app/templates/dashboard/index.html b/app/templates/dashboard/index.html index 4068c05..fa7638d 100644 --- a/app/templates/dashboard/index.html +++ b/app/templates/dashboard/index.html @@ -186,7 +186,7 @@ actions.style.display = 'flex'; const btnAbort = document.getElementById('btn-abort'); - if (['passed', 'failed', 'aborted'].includes(job.status)) { + if (['passed', 'failed', 'aborted', 'error'].includes(job.status)) { btnAbort.style.display = 'none'; if (isPolling) clearInterval(pollingInterval); } else { @@ -244,8 +244,8 @@ let statusHtml = '⌛ Waiting'; if (result) { - const icon = result[0] === 'PASS' ? '✅' : (result[0] === 'FAIL' ? '❌' : '⚫'); - const color = result[0] === 'PASS' ? 'var(--success)' : (result[0] === 'FAIL' ? 'var(--danger)' : 'var(--gray)'); + const icon = result[0] === 'PASS' ? '✅' : (result[0] === 'FAIL' ? '❌' : (result[0] === 'ERROR' ? '⚠️' : '⚫')); + const color = result[0] === 'PASS' ? 'var(--success)' : (result[0] === 'FAIL' ? 'var(--danger)' : (result[0] === 'ERROR' ? 'var(--warning)' : 'var(--gray)')); statusHtml = `${icon} ${result[0]}`; } else if (job.status === 'in_progress') { statusHtml = '🔄 Running'; @@ -277,7 +277,7 @@ if (logElement) logElement.scrollTop = logElement.scrollHeight; } - if (!['passed', 'failed', 'aborted'].includes(job.status)) { + if (!['passed', 'failed', 'aborted', 'error'].includes(job.status)) { fetch(`/jobs/${jobId}/status`) .then(r => r.json()) .then(data => {