HackBuddyAI / app_simple.py
Mahdiyar
initial version
9a255bf
import gradio as gr
import pandas as pd
import logging
import sys
import os
from database import initialize_database, add_participant, get_participants_dataframe
# --- Logging Setup ---
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[logging.StreamHandler(sys.stdout)]
)
logger = logging.getLogger('app_simple')
# --- Initial Setup ---
logger.info("Initializing database...")
initialize_database()
# --- Gradio UI Functions ---
def register_participant(name, email, linkedin, background, goals):
"""Callback function to register a new participant."""
if not all([name, email]):
return "Please provide at least a name and email.", get_participants_dataframe()
participant_data = {
"name": name,
"email": email,
"linkedin_profile": linkedin,
"background": background,
"goals": goals
}
try:
add_participant(participant_data)
feedback = f"βœ… Success! Participant '{name}' registered."
logger.info(f"Registered new participant: {email}")
except Exception as e:
feedback = f"❌ Error! Could not register participant. Reason: {e}"
logger.error(f"Failed to register participant {email}: {e}")
return feedback, get_participants_dataframe()
def refresh_participants_list():
"""Callback to reload the participant data from the database."""
return get_participants_dataframe()
def mock_matching_process(organizer_criteria):
"""Mock function for the matching process (without using TinyCodeAgent)."""
participants_df = get_participants_dataframe()
if len(participants_df) < 2:
logger.warning("Matching process aborted: not enough participants.")
return "Cannot run matching with fewer than 2 participants."
# Create a simple mock output
result = f"""
## Team Matching Results
**Criteria used**: {organizer_criteria}
### Team 1
* **{participants_df['name'].iloc[0] if len(participants_df) > 0 else 'No participants'}**
* **{participants_df['name'].iloc[1] if len(participants_df) > 1 else 'No participants'}**
**Justification**: This is a mock team created for demonstration purposes.
### Team 2
* **{participants_df['name'].iloc[2] if len(participants_df) > 2 else 'No participants'}**
* **{participants_df['name'].iloc[3] if len(participants_df) > 3 else 'No participants'}**
**Justification**: This is another mock team created for demonstration purposes.
*Note: This is a simplified version without the AI matching. The full version would use TinyCodeAgent to create optimized teams.*
"""
return result
# --- Gradio App Definition ---
with gr.Blocks(theme=gr.themes.Soft(), title="HackBuddyAI (Simple)") as app:
gr.Markdown("# πŸ€– HackBuddyAI (Simple Version)")
gr.Markdown("*This is a simplified version without the AI matching component.*")
with gr.Tabs():
with gr.TabItem("πŸ‘€ Participant Registration"):
gr.Markdown("## Welcome, Participant!")
gr.Markdown("Fill out the form below to register for the hackathon.")
with gr.Row():
with gr.Column():
name_in = gr.Textbox(label="Full Name")
email_in = gr.Textbox(label="Email Address")
linkedin_in = gr.Textbox(label="LinkedIn Profile URL", placeholder="Optional")
with gr.Column():
background_in = gr.Textbox(label="Your Background & Skills", lines=5, placeholder="e.g., Python developer with 3 years of experience, specializing in Django and REST APIs...")
goals_in = gr.Textbox(label="Your Goals for this Hackathon", lines=5, placeholder="e.g., I want to learn about machine learning and work on a cool data visualization project...")
submit_button = gr.Button("Register", variant="primary")
registration_feedback = gr.Markdown()
with gr.TabItem("πŸ‘‘ Organizer Dashboard"):
gr.Markdown("## Welcome, Organizer!")
gr.Markdown("Here you can view registered participants and run the team matching process.")
with gr.Accordion("View Registered Participants", open=False):
refresh_button = gr.Button("πŸ”„ Refresh List")
participants_df_out = gr.DataFrame(value=get_participants_dataframe, interactive=False)
gr.Markdown("### Run Matching")
organizer_criteria_in = gr.Textbox(
label="Matching Criteria",
lines=4,
value="Create teams of 3. Try to balance skills in each team (e.g., frontend, backend, data).",
placeholder="Describe your ideal team composition..."
)
run_button = gr.Button("πŸš€ Run Matching", variant="primary")
gr.Markdown("### 🀝 Matched Teams")
matching_results_out = gr.Markdown("Matching has not been run yet.")
# --- Event Handlers ---
submit_button.click(
fn=register_participant,
inputs=[name_in, email_in, linkedin_in, background_in, goals_in],
outputs=[registration_feedback, participants_df_out]
)
refresh_button.click(
fn=refresh_participants_list,
inputs=[],
outputs=[participants_df_out]
)
run_button.click(
fn=mock_matching_process,
inputs=[organizer_criteria_in],
outputs=[matching_results_out]
)
# --- Launching the App ---
if __name__ == "__main__":
try:
logger.info("Launching Gradio app (simple version)...")
# queue() is important for handling multiple users
app.queue().launch(share=False)
except KeyboardInterrupt:
logger.info("Gradio app shutting down.")