|
import os |
|
import pandas as pd |
|
import utils |
|
import base64 |
|
from flask import Flask, render_template, request, redirect, url_for |
|
from postmarker.core import PostmarkClient |
|
from werkzeug.utils import secure_filename |
|
|
|
app = Flask(__name__) |
|
app.config['UPLOAD_FOLDER'] = 'uploads' |
|
app.config['ALLOWED_EXTENSIONS'] = {'zip'} |
|
|
|
def allowed_file(filename): |
|
return '.' in filename and \ |
|
filename.rsplit('.', 1)[1].lower() in app.config['ALLOWED_EXTENSIONS'] |
|
|
|
@app.route('/') |
|
def index(): |
|
|
|
df = pd.read_csv('static/leaderboard.csv') |
|
|
|
df = df.round(3) |
|
df.insert(0, '#', '') |
|
|
|
up_arrow, down_arrow = "↑", "↓" |
|
|
|
|
|
|
|
df = df.rename(columns={ |
|
"Ordinal (Win rate)": f"Ordinal - Win rate ({up_arrow})", |
|
"Cardinal (Score)": f"Cardinal - Score ({up_arrow})", |
|
"RO Stability": f"RO Stability ({up_arrow})", |
|
"Stress": f"Stress ({down_arrow})", |
|
"Rank Distance": f"Rank Distance ({down_arrow})", |
|
"Separability": f"Separability ({up_arrow})", |
|
"CFI": f"CFI ({up_arrow})", |
|
"SRMR": f"SRMR ({down_arrow})", |
|
"RMSEA": f"RMSEA ({down_arrow})", |
|
"Cronbach alpha": f"Cronbach alpha ({up_arrow})" |
|
}) |
|
|
|
|
|
|
|
main_table_metrics = [ |
|
"#", |
|
"Model", |
|
f"Ordinal - Win rate ({up_arrow})", |
|
f"Cardinal - Score ({up_arrow})", |
|
f"RO Stability ({up_arrow})" |
|
] |
|
|
|
main_df = df[main_table_metrics].copy() |
|
main_table_html = utils.metrics_df_to_table_html(main_df, additional_class="main-table") |
|
full_table_html = utils.metrics_df_to_table_html(df, additional_class="full-table") |
|
|
|
|
|
return render_template('index.html', main_table_html=main_table_html, full_table_html=full_table_html) |
|
|
|
@app.route('/model/<model_name>') |
|
def model_detail(model_name): |
|
|
|
df = pd.read_csv(f'static/models_data/{model_name}/cfa_metrics.csv') |
|
|
|
df = df.round(3) |
|
df.insert(0, '#', '') |
|
|
|
up_arrow, down_arrow = "↑", "↓" |
|
|
|
metrics_to_show = [df.columns[0], df.columns[1], "CFI", "SRMR", "RMSEA"] |
|
df = df[metrics_to_show].copy() |
|
df = df.rename(columns={ |
|
"CFI": f"CFI ({up_arrow})", |
|
"SRMR": f"SRMR ({down_arrow})", |
|
"RMSEA": f"RMSEA ({down_arrow})", |
|
}) |
|
classes = 'table table-striped table-bordered' |
|
cfa_table_html = df.to_html(classes=classes, escape=False, index=False) |
|
|
|
|
|
model_detail_file = f'static/models_data/{model_name}/model_detail.html' |
|
if os.path.exists(model_detail_file): |
|
|
|
with open(model_detail_file, 'r', encoding='utf-8') as file: |
|
model_detail = file.read() |
|
else: |
|
model_detail = "<p>No additional detail is provided for this model.</p>" |
|
|
|
return render_template( |
|
'model_detail.html', |
|
model_name=model_name, |
|
model_detail=model_detail, |
|
cfa_table_html=cfa_table_html |
|
) |
|
|
|
@app.route('/about') |
|
def about(): |
|
return render_template('about.html') |
|
|
|
@app.route('/new_model') |
|
def new_model(): |
|
return render_template('new_model.html') |
|
|
|
@app.route('/model_submitted') |
|
def model_submitted(): |
|
return render_template('model_submitted.html') |
|
|
|
@app.route('/failed_submission') |
|
def failed_submission(): |
|
return render_template('failed_submission.html') |
|
|
|
|
|
@app.route('/submit_model', methods=['POST']) |
|
def submit_model(): |
|
model_name = request.form['model_name'] |
|
pull_request_link = request.form['pull_request_link'] |
|
email = request.form['email'] |
|
description = request.form['description'] |
|
|
|
|
|
if 'model_files' not in request.files: |
|
return redirect(url_for('failed_submission')) |
|
|
|
file = request.files['model_files'] |
|
|
|
if file and allowed_file(file.filename): |
|
filename = secure_filename(file.filename) |
|
file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename) |
|
file.save(file_path) |
|
|
|
|
|
with open(file_path, 'rb') as f: |
|
file_content = base64.b64encode(f.read()).decode('ascii') |
|
|
|
|
|
postmark = PostmarkClient(server_token=os.getenv('POSTMARK_SERVER_API')) |
|
|
|
|
|
postmark.emails.send( |
|
From='grgur.kovac@inria.fr', |
|
To='grgur.kovac@inria.fr', |
|
Subject=f'Stick to Your Role! Model Submission: {model_name}', |
|
HtmlBody=f""" |
|
<p><strong>Model Name:</strong> {model_name}</p> |
|
<p><strong>Pull Request Link:</strong> {pull_request_link}</p> |
|
<p><strong>Email:</strong> {email}</p> |
|
<p><strong>Description:</strong> {description}</p> |
|
""", |
|
Attachments=[{ |
|
'Name': filename, |
|
'Content': file_content, |
|
'ContentType': 'application/zip' |
|
}] |
|
) |
|
else: |
|
return redirect(url_for('failed_submission')) |
|
|
|
return redirect(url_for('model_submitted')) |
|
|
|
|
|
if __name__ == '__main__': |
|
app.run(host='0.0.0.0', port=7860, debug=True) |
|
|