mirror of
https://github.com/blw1138/Zordon.git
synced 2025-12-17 08:48:13 +00:00
API cleanup
This commit is contained in:
34
dashboard.py
34
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
|
||||
)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -138,7 +138,7 @@ def get_job_logs(job_id):
|
||||
|
||||
@server.get('/api/job/<job_id>/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/<job_id>/download_all')
|
||||
|
||||
@@ -2,7 +2,7 @@ const grid = new gridjs.Grid({
|
||||
columns: [
|
||||
{ data: (row) => row.id,
|
||||
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}
|
||||
},
|
||||
{ id: 'name',
|
||||
@@ -10,20 +10,22 @@ columns: [
|
||||
data: (row) => row.name,
|
||||
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: 'status',
|
||||
name: 'Status',
|
||||
data: (row) => row,
|
||||
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': ''}"
|
||||
value="${(parseFloat(cell.percent_complete) * 100.0)}" max="100">${cell.status}</progress>
|
||||
`)},
|
||||
{ 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(`<a href="/api/job/${row.cells[0].data}/logs">${output}</a>`)
|
||||
},
|
||||
@@ -42,7 +44,7 @@ columns: [
|
||||
</button>
|
||||
<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>${cell.file_list.length}</span>
|
||||
<span>${cell.file_count}</span>
|
||||
</button>
|
||||
<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>
|
||||
|
||||
Reference in New Issue
Block a user