hackathon / app.py
com3dian's picture
Update app.py
fd7ccb5 verified
import os
import tempfile
import panel as pn
import pandas as pd
from google_sheet import fetch_leaderboard
from google_drive import upload_to_drive
pn.extension(design="bootstrap", sizing_mode="stretch_width")
# Widgets
file_input = pn.widgets.FileInput(accept='.zip', multiple=False)
submit_button = pn.widgets.Button(name="πŸ“€ Submit", button_type="primary")
status = pn.pane.Alert("", alert_type="info", visible=False)
leaderboard = pn.pane.DataFrame(pd.DataFrame(), width=800, height=400, index=False)
# Temp dir
temp_dir = tempfile.gettempdir()
# --- Submission logic ---
def submit_file(event):
if file_input.value is None:
status.object = "⚠️ Please upload a .zip file before submitting."
status.alert_type = "warning"
status.visible = True
return
try:
filename = file_input.filename
submission_path = os.path.join(temp_dir, filename)
with open(submission_path, "wb") as f:
f.write(file_input.value)
drive_file_id = upload_to_drive(submission_path, filename)
status.object = f"βœ… Uploaded to Google Drive\n**File ID**: `{drive_file_id}`"
status.alert_type = "success"
status.visible = True
except Exception as e:
import traceback
status.object += f"\n⚠️ Could not load leaderboard:\n```\n{traceback.format_exc()}\n```"
status.alert_type = "warning"
status.visible = True
# status.object = f"❌ Failed to upload: {e}"
# status.alert_type = "danger"
# status.visible = True
return
# Refresh leaderboard
update_leaderboard()
submit_button.on_click(submit_file)
# --- Leaderboard logic ---
def update_leaderboard():
try:
df = fetch_leaderboard()
if not df.empty:
leaderboard.object = df.sort_values(by="score", ascending=False)
else:
leaderboard.object = pd.DataFrame()
except Exception as e:
status.object = f"⚠️ Could not load leaderboard: {e}"
status.alert_type = "warning"
status.visible = True
# Initial load
update_leaderboard()
# --- Layout ---
app = pn.template.BootstrapTemplate(
title="πŸ† Hackathon Leaderboard",
sidebar=[
pn.pane.Markdown("### πŸ“ Upload Your Submission (.zip)"),
file_input,
submit_button,
status,
],
main=[
pn.pane.Markdown("## πŸ₯‡ Live Leaderboard"),
pn.pane.Markdown("ℹ️ *Note: To see the most up-to-date results, please refresh the web page.*", styles={'color': 'gray', 'font-style': 'italic'}),
leaderboard
]
)
app.servable()