File size: 5,392 Bytes
215d189 146b688 40c29ba 215d189 146b688 ea2d6ae 215d189 b14be2c 215d189 40c29ba ea2d6ae 146b688 b845998 146b688 f7e9cda 40c29ba 1047c44 40c29ba ca60da9 40c29ba ca60da9 40c29ba b845998 40c29ba 1047c44 146b688 40c29ba b14be2c b845998 1047c44 d7c0630 1047c44 d7c0630 b845998 b42419d 215d189 ea2d6ae |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 |
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' # Directory where files will be stored
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():
# Load the CSV file into a DataFrame
df = pd.read_csv('static/leaderboard.csv')
df = df.round(3)
df.insert(0, '#', '')
up_arrow, down_arrow = "↑", "↓"
# up_arrow, down_arrow = "⬆️", "⬇️"
# 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})"
})
# Generate full table HTML with clickable model names
################
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")
# Render the template with the table HTML
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)
# Load model specific description
model_detail_file = f'static/models_data/{model_name}/model_detail.html'
if os.path.exists(model_detail_file):
# If the file exists, open and read the HTML file as a string
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']
# Handle ZIP file upload
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)
# Read the file content and encode it in base64
with open(file_path, 'rb') as f:
file_content = base64.b64encode(f.read()).decode('ascii')
# Set up Postmark email client
postmark = PostmarkClient(server_token=os.getenv('POSTMARK_SERVER_API'))
# Send the email with the attachment
postmark.emails.send(
From='[email protected]',
To='[email protected]',
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)
|