Thu, 27 Aug 2020 00:29:31 +0300
..., part two
#!/usr/bin/env python3 from flask import Flask, render_template, redirect, request from ldcheck import appname, version, version_string from ldcheck import load_config, load_colours, find_ldconfig_ldr_paths from parse import read_ldraw from testsuite import load_tests, check_model, problem_text, all_problem_types app = Flask(appname) def format_report_html(report, model, test_suite): messages = [] for problem in report['problems']: ldraw_code = model.body[problem.body_index].textual_representation() message = str.format( '<li class="{problem_type}">{model_name}:{line_number}:' '{problem_type}: {message}<br />{ldraw_code}</li>', model_name = model.name, line_number = problem.line_number, problem_type = problem.severity, message = problem_text(problem, test_suite), ldraw_code = ldraw_code, ) messages.append(message) return '\n'.join(messages) @app.route('/', methods = ['GET', 'POST']) def web_front(): test_suite = load_tests() common_args = { 'appname': appname, 'version': version_string, 'is_debug': max(version) == 9999, } if request.method == 'POST': # check if the post request has the file part if 'file' not in request.files or not request.files['file'].filename: return redirect(request.url) file = request.files['file'] filename = file.filename config = load_config('ldcheck.cfg') for ldconfig_ldr_path in find_ldconfig_ldr_paths(config): with ldconfig_ldr_path.open() as ldconfig_ldr: load_colours(ldconfig_ldr) model = read_ldraw( file.stream, name = filename, ldraw_directories = config['libraries'], ) report = check_model(model, test_suite) # Amend human-readable messages into the report for problem in report['problems']: object = model.body[problem.body_index] problem.message_str = problem_text(problem, test_suite) problem.ldraw_code = object.textual_representation() return render_template('webfront.html', report = report, name = filename, problem_types = all_problem_types(test_suite), **common_args, ) else: test_suite = load_tests() return render_template('webfront.html', report = None, name = None, problem_types = all_problem_types(test_suite), **common_args, ) @app.route('/static/<path:path>') def static_file(path): from flask import send_from_directory from os import path return send_from_directory(path.join('static', path)) if __name__ == '__main__': from argparse import ArgumentParser parser = ArgumentParser() parser.add_argument('-p', '--port', type = int, default = 5000) parser.add_argument('-d', '--debug', action = 'store_true') args = parser.parse_args() app.run(port = args.port, debug = args.debug)