diff --git a/dashboard.py b/dashboard.py index 8dbdb6b..6320193 100755 --- a/dashboard.py +++ b/dashboard.py @@ -90,9 +90,9 @@ def create_node_tree(all_server_data) -> Tree: for job in jobs_to_display: renderer = f"{renderer_colors[job['renderer']]}{job['renderer']}[default]" - filename = os.path.basename(job['worker']['input_path']).split('.')[0] + filename = os.path.basename(job['input_path']).split('.')[0] if job['status'] == 'running': - jobs_tree.add(f"[bold]{renderer} {filename} ({job['id']}) - {status_string_to_color(job['status'])}{(float(job['worker']['percent_complete']) * 100):.1f}%") + jobs_tree.add(f"[bold]{renderer} {filename} ({job['id']}) - {status_string_to_color(job['status'])}{(float(job['percent_complete']) * 100):.1f}%") else: jobs_tree.add(f"{filename} ({job['id']}) - {status_string_to_color(job['status'])}{job['status'].title()}") @@ -129,31 +129,21 @@ def create_jobs_table(all_server_data) -> Table: job_color = '[{}]'.format(status_colors[job_status]) job_text = f"{job_color}" + job_status.value.title() - if job_status == RenderStatus.ERROR and job['worker']['errors']: - job_text = job_text + "\n" + "\n".join(job['worker']['errors']) + if job_status == RenderStatus.ERROR and job['errors']: + job_text = job_text + "\n" + "\n".join(job['errors']) # calculate elapsed time - elapsed_time = 'Unknown' - start_time = None - end_time = None - - if job['worker']['start_time']: - start_time = datetime.datetime.fromisoformat(job['worker']['start_time']) - if job['worker']['end_time']: - end_time = datetime.datetime.fromisoformat(job['worker']['end_time']) - - if start_time: - if end_time: - elapsed_time = str(end_time - start_time) - elif job_status == RenderStatus.RUNNING: - elapsed_time = str(datetime.datetime.now() - start_time) + elapsed_time = job['time_elapsed'] + if job['start_time'] and job_status == RenderStatus.RUNNING: + start_time = datetime.datetime.fromisoformat(job['start_time']) + elapsed_time = str(datetime.datetime.now() - start_time) # Project name project_name = job_color + job['name'] if job_status == RenderStatus.RUNNING: - job_text = f"{job_color}[bold]Running - {float(job['worker']['percent_complete']) * 100:.1f}%" - delta = datetime.datetime.now() - datetime.datetime.fromisoformat(job['worker']['start_time']) + job_text = f"{job_color}[bold]Running - {float(job['percent_complete']) * 100:.1f}%" + delta = datetime.datetime.now() - datetime.datetime.fromisoformat(job['start_time']) elapsed_time = "[bold]" + str(delta) project_name = "[bold]" + project_name elif job_status == RenderStatus.CANCELLED or job_status == RenderStatus.ERROR: @@ -169,11 +159,11 @@ def create_jobs_table(all_server_data) -> Table: table.add_row( job['id'], project_name, - renderer_colors.get(job['renderer'], '[cyan]') + job['renderer'] + '[default]-' + job['worker']['renderer_version'], + renderer_colors.get(job['renderer'], '[cyan]') + job['renderer'] + '[default]-' + job['renderer_version'], f"[{priority_color}]{job['priority']}", job_text, elapsed_time, - str(max(int(job['worker']['total_frames']), 1)), + str(max(int(job['total_frames']), 1)), client_title ) diff --git a/lib/scheduled_job.py b/lib/scheduled_job.py index 1accc38..c9df921 100644 --- a/lib/scheduled_job.py +++ b/lib/scheduled_job.py @@ -100,6 +100,7 @@ class ScheduledJob(Base): """Converts RenderJob into JSON-friendly dict""" job_dict = None try: + worker_data = self.worker_data() job_dict = { 'id': self.id, 'name': self.name, @@ -111,13 +112,17 @@ class ScheduledJob(Base): 'notify': self.notify, 'date_created': self.date_created, 'scheduled_start': self.scheduled_start, + 'start_time': worker_data.get('start_time', None), 'status': self.render_status().value, - 'time_elapsed': self.worker_data().get('time_elapsed', None), + 'time_elapsed': worker_data.get('time_elapsed', None), 'file_hash': self.file_hash, - 'percent_complete': self.worker_data().get('percent_complete', None), - 'file_list': self.file_list(), + 'percent_complete': worker_data.get('percent_complete', None), + 'file_count': len(self.file_list()), 'renderer': self.renderer, - 'worker': self.worker_data(), + 'renderer_version': worker_data.get('renderer_version', None), + 'errors': worker_data.get('errors', []), + 'total_frames': worker_data.get('total_frames', -1), + 'last_output': worker_data.get('last_output', None) } # convert to json and back to auto-convert dates to iso format diff --git a/lib/server/job_server.py b/lib/server/job_server.py index 7466c92..04303ec 100755 --- a/lib/server/job_server.py +++ b/lib/server/job_server.py @@ -138,7 +138,7 @@ def get_job_logs(job_id): @server.get('/api/job//file_list') def get_file_list(job_id): - return RenderQueue.job_with_id(job_id) + return RenderQueue.job_with_id(job_id).file_list() @server.route('/api/job//download_all') diff --git a/lib/server/static/js/job_table.js b/lib/server/static/js/job_table.js index d99039f..f66925d 100644 --- a/lib/server/static/js/job_table.js +++ b/lib/server/static/js/job_table.js @@ -2,7 +2,7 @@ const grid = new gridjs.Grid({ columns: [ { data: (row) => row.id, name: 'Thumbnail', - formatter: (cell) => gridjs.html(``), + formatter: (cell) => gridjs.html(``), sort: {enabled: false} }, { id: 'name', @@ -10,20 +10,22 @@ columns: [ data: (row) => row.name, formatter: (name, row) => gridjs.html(`${name}`) }, - { id: 'renderer', data: (row) => `${row.renderer}-${row.worker?.renderer_version}`, name: 'Renderer' }, + { id: 'renderer', data: (row) => `${row.renderer}-${row.renderer_version}`, name: 'Renderer' }, { id: 'priority', name: 'Priority' }, { id: 'status', name: 'Status', data: (row) => row, formatter: (cell, row) => gridjs.html(` - ${cell.status} + ${cell.status} ${cell.status} `)}, { id: 'time_elapsed', name: 'Time Elapsed' }, - { data: (row) => row.worker?.total_frames ?? 'N/A', name: 'Frame Count' }, + { data: (row) => row.total_frames ?? 'N/A', name: 'Frame Count' }, { id: 'client', name: 'Client'}, - { data: (row) => row.worker?.last_output ?? 'N/A', + { data: (row) => row.last_output ?? 'N/A', name: 'Last Output', formatter: (output, row) => gridjs.html(`${output}`) }, @@ -42,7 +44,7 @@ columns: [