webfront.py

Thu, 26 Aug 2021 19:36:44 +0300

author
Teemu Piippo <teemu@hecknology.net>
date
Thu, 26 Aug 2021 19:36:44 +0300
changeset 147
bec55b021ae7
parent 145
fde18c4d6784
child 151
e4401bf4a387
permissions
-rwxr-xr-x

Merge commit

#!/usr/bin/env python3
from flask import Flask, render_template, redirect, request
from ldcheck import appname, version, version_string
from parse import read_ldraw
from testsuite import load_tests, check_model, problem_text, all_problem_types

app = Flask(appname)

from ldcheck import LDrawContext
try:
    context = LDrawContext()
except RuntimeError as error:
    from sys import stderr, exit
    print('error:', str(error), file = stderr)
    exit(1)

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
        model = read_ldraw(file.stream, name = filename, context = context)
        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)

mercurial