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.")