Add submit job to HTML page

This commit is contained in:
Brett Williams
2022-12-10 16:16:37 -08:00
parent d0b14fc001
commit 10dd5b4295
6 changed files with 276 additions and 79 deletions

View File

@@ -10,32 +10,67 @@ from datetime import datetime
from zipfile import ZipFile
import requests
from flask import Flask, request, render_template, send_file, after_this_request, Response, redirect, url_for
from flask import Flask, request, render_template, send_file, after_this_request, Response, redirect, url_for, abort
from werkzeug.utils import secure_filename
from lib.render_job import RenderJob
from lib.render_queue import RenderQueue
from utilities.render_worker import RenderWorkerFactory, string_to_status
from lib.server_helper import post_job_to_server
from utilities.render_worker import RenderWorkerFactory, string_to_status, RenderStatus
logger = logging.getLogger()
server = Flask(__name__, template_folder='../templates')
categories = [RenderStatus.RUNNING, RenderStatus.ERROR, RenderStatus.NOT_STARTED, RenderStatus.SCHEDULED,
RenderStatus.COMPLETED, RenderStatus.CANCELLED]
def sorted_jobs(all_jobs, sort_by_date=True):
if not sort_by_date:
sorted_job_list = []
if all_jobs:
for status_category in categories:
found_jobs = [x for x in all_jobs if x.render_status() == status_category.value]
if found_jobs:
sorted_found_jobs = sorted(found_jobs, key=lambda d: d.date_created, reverse=True)
sorted_job_list.extend(sorted_found_jobs)
else:
sorted_job_list = sorted(all_jobs, key=lambda d: d.date_created, reverse=True)
return sorted_job_list
@server.route('/')
@server.route('/index')
def index():
return render_template('index.html', all_jobs=RenderQueue.job_queue, hostname=RenderQueue.host_name)
return render_template('index.html', all_jobs=sorted_jobs(RenderQueue.job_queue), hostname=RenderQueue.host_name,
renderer_info=renderer_info())
@server.route('/ui/job/<job_id>/full_details')
def job_detail(job_id):
found_job = RenderQueue.job_with_id(job_id)
if found_job:
table_html = json2html.json2html.convert(json=found_job.json())
return render_template('details.html', detail_table=table_html)
table_html = json2html.json2html.convert(json=found_job.json(), table_attributes='class="table is-narrow is-striped"')
media_url = None
if found_job.file_list():
media_basename = os.path.basename(found_job.file_list()[0])
media_url = f"/api/job/{job_id}/file/{media_basename}"
return render_template('details.html', detail_table=table_html, media_url=media_url)
return f'Cannot find job with ID {job_id}', 400
# Get job file routing
@server.route('/api/job/<job_id>/file/<filename>', methods=['GET'])
def get_job_file(job_id, filename):
found_job = RenderQueue.job_with_id(job_id)
try:
for full_path in found_job.file_list():
if filename in full_path:
return send_file(path_or_file=full_path)
except FileNotFoundError:
abort(404)
@server.get('/api/jobs')
def jobs_json():
return [x.json() for x in RenderQueue.job_queue]
@@ -169,8 +204,22 @@ def add_job_handler():
try:
"""Create new job and add to server render queue"""
if not request.form.get('json', None) and not request.is_json:
return 'missing json data', 400
if request.is_json:
jobs_list = [request.json]
elif request.form.get('json', None):
jobs_list = json.loads(request.form['json'])
else:
form_dict = dict(request.form)
args = {}
arg_keys = [k for k in form_dict.keys() if '-arg_' in k]
for key in arg_keys:
if form_dict['renderer'] in key:
cleaned_key = key.split('-arg_')[-1]
args[cleaned_key] = form_dict[key]
form_dict.pop(key)
args['raw'] = form_dict.get('raw_args', None)
form_dict['args'] = args
jobs_list = [form_dict]
# handle uploaded files
uploaded_file = request.files.get('file', None)
@@ -185,8 +234,6 @@ def add_job_handler():
uploaded_file.save(uploaded_file_local_path)
# convert job input paths for uploaded files and add jobs
json_string = request.form.get('json', None)
jobs_list = json.loads(json_string) if json_string else [request.json]
results = []
for job in jobs_list:
if uploaded_file_local_path:
@@ -205,7 +252,11 @@ def add_job_handler():
return results, response.get('code', 500)
else:
return results, 400
return results
if request.args.get('redirect', False):
return redirect(url_for('index'))
else:
return results
except Exception as e:
logger.exception(f"Unknown error adding job: {e}")
@@ -296,7 +347,10 @@ def cancel_job(job_id):
return 'Confirmation required to cancel job', 400
if RenderQueue.cancel_job(found_job):
return redirect(url_for('index'))
if request.args.get('redirect', False):
return redirect(url_for('index'))
else:
return "Job cancelled"
else:
return "Unknown error", 500
@@ -328,10 +382,13 @@ def delete_job(job_id):
shutil.rmtree(input_dir)
RenderQueue.delete_job(found_job)
return redirect(url_for('index'))
if request.args.get('redirect', False):
return redirect(url_for('index'))
else:
return "Job deleted", 200
except Exception as e:
return "Unknown error", 500
return f"Unknown error: {e}", 500
@server.get('/api/clear_history')
@@ -362,12 +419,3 @@ def upload_file_page():
return render_template('upload.html', render_clients=RenderQueue.render_clients,
supported_renderers=RenderWorkerFactory.supported_renderers())
#todo: move this to a helper file
def post_job_to_server(input_path, job_list, client, server_port=8080):
# Pack job data and submit to server
job_files = {'file': (os.path.basename(input_path), open(input_path, 'rb'), 'application/octet-stream'),
'json': (None, json.dumps(job_list), 'application/json')}
req = requests.post(f'http://{client}:{server_port}/api/add_job', files=job_files)
return req