diff --git a/app/app.py b/app/app.py index f06521b..e5a8aac 100644 --- a/app/app.py +++ b/app/app.py @@ -2,11 +2,13 @@ from flask import Flask from flask_bootstrap import Bootstrap5 from flask_login import LoginManager +from flask_socketio import SocketIO from .config import Config from .models import User, db from .results.main_results import results from .admin.main_admin import admin + from .main import main bootstrap = Bootstrap5() @@ -36,6 +38,12 @@ def create_app(): app.register_blueprint(admin, url_prefix="/admin") app.register_blueprint(main) app.shell_context_processor(make_shell_context) + socketio = SocketIO(app) with app.app_context(): db.create_all() - return app + app.socket = socketio + from .interactive.main_interactive import interactive + + app.register_blueprint(interactive, url_prefix="/admin") + + return socketio, app diff --git a/app/env.dist b/app/env.dist index 3273d0c..6cebbe8 100644 --- a/app/env.dist +++ b/app/env.dist @@ -1 +1 @@ -COMPARE=True \ No newline at end of file +SECRET=Really-hard-to-guess-secret. \ No newline at end of file diff --git a/app/results/forms.py b/app/interactive/forms.py similarity index 63% rename from app/results/forms.py rename to app/interactive/forms.py index fa18845..67b793b 100644 --- a/app/results/forms.py +++ b/app/interactive/forms.py @@ -1,8 +1,10 @@ from flask_wtf import FlaskForm -from wtforms import SubmitField, SelectField +from wtforms import SubmitField, SelectField, TextAreaField from benchmark.Arguments import ALL_METRICS +##### NOT USED ##### class RankingForm(FlaskForm): score = SelectField("Score", choices=ALL_METRICS) + output = TextAreaField("Output") submit = SubmitField("Generate Ranking") diff --git a/app/interactive/main_interactive.py b/app/interactive/main_interactive.py new file mode 100644 index 0000000..f4e1404 --- /dev/null +++ b/app/interactive/main_interactive.py @@ -0,0 +1,91 @@ +import os +import shutil +from pathlib import Path +from flask import Blueprint, render_template, url_for, current_app +from benchmark.ResultsFiles import Benchmark +from flask_login import current_user, login_required + +interactive = Blueprint("interactive", __name__, template_folder="templates") + + +@interactive.route("/ranking") +@login_required +def ranking(): + os.chdir(current_user.benchmark.folder) + return render_template("ranking.html") + + +@current_app.socket.on("client") +def handle_client(message): + current_app.logger.info(message) + if message.get("action") == "ReadyToRock!": + get_benchmark(message.get("score"), excel=message.get("excel", False)) + current_app.socket.emit("server", {"message": "Ready!", "percentage": 0}) + + +def send_message(message, percentage, status="Ok", payload={}): + output = { + "message": message, + "percentage": percentage, + "status": status, + "payload": payload, + } + current_app.socket.emit("server", output) + + +def get_benchmark(score, excel=False): + def move_exreport(): + src = os.path.join( + current_user.benchmark.folder, "exreport", "exreport_output" + ) + dst = os.path.join( + current_app.static_folder, "exreport", "exreport_output" + ) + shutil.copytree(src, dst, dirs_exist_ok=True) + + benchmark = Benchmark(score=score, visualize=True) + send_message("Start", 0) + try: + send_message("Generating ranking...", 0) + benchmark.compile_results() + send_message("Saving results...", 20 if excel else 40) + benchmark.save_results() + send_message("Generating report...", 40 if excel else 60) + benchmark.report(tex_output=False) + send_message("Generating exreport...", 60 if excel else 80) + benchmark.exreport() + if excel: + send_message("Generating excel...", 80) + benchmark.excel() + except ValueError as e: + send_message( + "Error: Couldn't generate ranking. " + str(e), + percentage=100, + status="Error", + ) + return + except KeyError as e: + send_message( + "Couldn't generate ranking. It seems that there are " + "partial results for some classifierss. " + f"Key not found {str(e)}", + percentage=100, + status="Error", + ) + return + # copy the results to the static folder + move_exreport() + excel_payload = ( + "" if not excel else str(Path(benchmark.get_excel_file_name())) + ) + current_app.logger.info("excel_payload:" + excel_payload) + send_message( + "Done!", + 100, + payload={ + "excel": excel_payload, + "html": url_for( + "static", filename="exreport/exreport_output/report.html" + ), + }, + ) diff --git a/app/interactive/templates/iobase.html b/app/interactive/templates/iobase.html new file mode 100644 index 0000000..ee640fc --- /dev/null +++ b/app/interactive/templates/iobase.html @@ -0,0 +1,8 @@ +{% extends "base.html" %} +{% block jscript %} + {{ super() }} + +{% endblock %} diff --git a/app/interactive/templates/ranking.html b/app/interactive/templates/ranking.html new file mode 100644 index 0000000..c69e6fb --- /dev/null +++ b/app/interactive/templates/ranking.html @@ -0,0 +1,144 @@ +{% extends "iobase.html" %} +{% block content %} +