API cleanup

This commit is contained in:
Brett Williams
2023-05-28 01:17:10 -05:00
parent bac069201f
commit 4911ed538d
4 changed files with 30 additions and 33 deletions

View File

@@ -90,9 +90,9 @@ def create_node_tree(all_server_data) -> Tree:
for job in jobs_to_display: for job in jobs_to_display:
renderer = f"{renderer_colors[job['renderer']]}{job['renderer']}[default]" 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': 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: else:
jobs_tree.add(f"{filename} ({job['id']}) - {status_string_to_color(job['status'])}{job['status'].title()}") 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_color = '[{}]'.format(status_colors[job_status])
job_text = f"{job_color}" + job_status.value.title() job_text = f"{job_color}" + job_status.value.title()
if job_status == RenderStatus.ERROR and job['worker']['errors']: if job_status == RenderStatus.ERROR and job['errors']:
job_text = job_text + "\n" + "\n".join(job['worker']['errors']) job_text = job_text + "\n" + "\n".join(job['errors'])
# calculate elapsed time # calculate elapsed time
elapsed_time = 'Unknown' elapsed_time = job['time_elapsed']
start_time = None if job['start_time'] and job_status == RenderStatus.RUNNING:
end_time = None start_time = datetime.datetime.fromisoformat(job['start_time'])
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 = str(datetime.datetime.now() - start_time)
# Project name # Project name
project_name = job_color + job['name'] project_name = job_color + job['name']
if job_status == RenderStatus.RUNNING: if job_status == RenderStatus.RUNNING:
job_text = f"{job_color}[bold]Running - {float(job['worker']['percent_complete']) * 100:.1f}%" job_text = f"{job_color}[bold]Running - {float(job['percent_complete']) * 100:.1f}%"
delta = datetime.datetime.now() - datetime.datetime.fromisoformat(job['worker']['start_time']) delta = datetime.datetime.now() - datetime.datetime.fromisoformat(job['start_time'])
elapsed_time = "[bold]" + str(delta) elapsed_time = "[bold]" + str(delta)
project_name = "[bold]" + project_name project_name = "[bold]" + project_name
elif job_status == RenderStatus.CANCELLED or job_status == RenderStatus.ERROR: 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( table.add_row(
job['id'], job['id'],
project_name, 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']}", f"[{priority_color}]{job['priority']}",
job_text, job_text,
elapsed_time, elapsed_time,
str(max(int(job['worker']['total_frames']), 1)), str(max(int(job['total_frames']), 1)),
client_title client_title
) )

View File

@@ -100,6 +100,7 @@ class ScheduledJob(Base):
"""Converts RenderJob into JSON-friendly dict""" """Converts RenderJob into JSON-friendly dict"""
job_dict = None job_dict = None
try: try:
worker_data = self.worker_data()
job_dict = { job_dict = {
'id': self.id, 'id': self.id,
'name': self.name, 'name': self.name,
@@ -111,13 +112,17 @@ class ScheduledJob(Base):
'notify': self.notify, 'notify': self.notify,
'date_created': self.date_created, 'date_created': self.date_created,
'scheduled_start': self.scheduled_start, 'scheduled_start': self.scheduled_start,
'start_time': worker_data.get('start_time', None),
'status': self.render_status().value, '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, 'file_hash': self.file_hash,
'percent_complete': self.worker_data().get('percent_complete', None), 'percent_complete': worker_data.get('percent_complete', None),
'file_list': self.file_list(), 'file_count': len(self.file_list()),
'renderer': self.renderer, '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 # convert to json and back to auto-convert dates to iso format

View File

@@ -138,7 +138,7 @@ def get_job_logs(job_id):
@server.get('/api/job/<job_id>/file_list') @server.get('/api/job/<job_id>/file_list')
def get_file_list(job_id): 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/<job_id>/download_all') @server.route('/api/job/<job_id>/download_all')

View File

@@ -2,7 +2,7 @@ const grid = new gridjs.Grid({
columns: [ columns: [
{ data: (row) => row.id, { data: (row) => row.id,
name: 'Thumbnail', name: 'Thumbnail',
formatter: (cell) => gridjs.html(`<img src="/ui/job/${cell}/thumbnail" style='width: 320px; min-width: 240px;'>`), formatter: (cell) => gridjs.html(`<img src="/ui/job/${cell}/thumbnail" style='width: 200px; min-width: 120px;'>`),
sort: {enabled: false} sort: {enabled: false}
}, },
{ id: 'name', { id: 'name',
@@ -10,20 +10,22 @@ columns: [
data: (row) => row.name, data: (row) => row.name,
formatter: (name, row) => gridjs.html(`<a href="/ui/job/${row.cells[0].data}/full_details">${name}</a>`) formatter: (name, row) => gridjs.html(`<a href="/ui/job/${row.cells[0].data}/full_details">${name}</a>`)
}, },
{ 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: 'priority', name: 'Priority' },
{ id: 'status', { id: 'status',
name: 'Status', name: 'Status',
data: (row) => row, data: (row) => row,
formatter: (cell, row) => gridjs.html(` formatter: (cell, row) => gridjs.html(`
<span class="tag is-primary is-light ${(cell.status == 'running') ? 'is-hidden': ''}">${cell.status}</span> <span class="tag ${(cell.status == 'running') ? 'is-hidden' : ''} ${(cell.status == 'cancelled') ?
'is-warning' : (cell.status == 'error') ? 'is-danger' : (cell.status == 'not_started') ?
'is-light' : 'is-primary'}">${cell.status}</span>
<progress class="progress is-primary ${(cell.status != 'running') ? 'is-hidden': ''}" <progress class="progress is-primary ${(cell.status != 'running') ? 'is-hidden': ''}"
value="${(parseFloat(cell.percent_complete) * 100.0)}" max="100">${cell.status}</progress> value="${(parseFloat(cell.percent_complete) * 100.0)}" max="100">${cell.status}</progress>
`)}, `)},
{ id: 'time_elapsed', name: 'Time Elapsed' }, { 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'}, { id: 'client', name: 'Client'},
{ data: (row) => row.worker?.last_output ?? 'N/A', { data: (row) => row.last_output ?? 'N/A',
name: 'Last Output', name: 'Last Output',
formatter: (output, row) => gridjs.html(`<a href="/api/job/${row.cells[0].data}/logs">${output}</a>`) formatter: (output, row) => gridjs.html(`<a href="/api/job/${row.cells[0].data}/logs">${output}</a>`)
}, },
@@ -42,7 +44,7 @@ columns: [
</button> </button>
<button class="button is-success ${(cell.status != 'completed') ? 'is-hidden': ''}" onclick="window.location.href='/api/job/${row.cells[0].data}/download_all';"> <button class="button is-success ${(cell.status != 'completed') ? 'is-hidden': ''}" onclick="window.location.href='/api/job/${row.cells[0].data}/download_all';">
<span class="icon"><i class="fa-solid fa-download"></i></span> <span class="icon"><i class="fa-solid fa-download"></i></span>
<span>${cell.file_list.length}</span> <span>${cell.file_count}</span>
</button> </button>
<button class="button is-danger" onclick="window.location.href='/api/job/${row.cells[0].data}/delete?confirm=True&redirect=True'"> <button class="button is-danger" onclick="window.location.href='/api/job/${row.cells[0].data}/delete?confirm=True&redirect=True'">
<span class="icon"><i class="fa-regular fa-trash-can"></i></span> <span class="icon"><i class="fa-regular fa-trash-can"></i></span>