import gradio as gr import pandas as pd import PyPDF2 import json import re # Parse uploaded transcript file def parse_transcript(file): if file.name.endswith('.csv'): df = pd.read_csv(file.name) elif file.name.endswith(('.xls', '.xlsx')): df = pd.read_excel(file.name) elif file.name.endswith('.pdf'): reader = PyPDF2.PdfReader(file) text = "" for page in reader.pages: text += page.extract_text() or "" df = pd.DataFrame({'Transcript_Text': [text]}) else: raise ValueError("Unsupported file format. Use .csv, .xlsx, or .pdf") return df # Extract student info def extract_transcript_info(df): transcript_text = df['Transcript_Text'].iloc[0] if 'Transcript_Text' in df.columns else '' info = {} gpa_match = re.search(r'(GPA|Grade Point Average)[^\d]*(\d+\.\d+)', transcript_text, re.IGNORECASE) if gpa_match: info['GPA'] = gpa_match.group(2) grade_match = re.search(r'Grade:?[\s]*(\d{1,2})', transcript_text, re.IGNORECASE) if grade_match: info['Grade_Level'] = grade_match.group(1) courses = re.findall(r'(?i)\b([A-Z][a-zA-Z\s&/]+)\s+(\d{1,3})\b', transcript_text) if courses: info['Courses'] = list(set([c[0].strip() for c in courses])) return info # Learning style questions - from educationplanner.org learning_style_questions = [ "When you are learning something new, you prefer to:", "When you are at home, you like to:", "When you spell a word, you remember it by:", "When you read, you:", "When you write, you:", "When you listen to music, you:", "When you work at solving a problem, you:", "When you give someone directions, you:", "When you are concentrating, you:", "When you meet someone new, you remember them by:" ] learning_style_answers = [ ["Watch someone do it", "Listen to someone explain it", "Read about it"], ["Watch TV or play video games", "Listen to music or talk to people", "Read books or write stories"], ["Seeing the word in your mind", "Saying the word out loud", "Writing the word down"], ["See the action in your mind", "Hear the characters talk", "Focus on the written words"], ["Use diagrams or doodles", "Talk about ideas", "Write detailed notes"], ["Appreciate the rhythm and melodies", "Easily remember lyrics", "Analyze the lyrics"], ["Visualize the solution", "Discuss the problem", "Write out the steps"], ["Draw a map", "Give spoken directions", "Write directions"], ["Picture things", "Say things out loud", "Write or read quietly"], ["Remember faces", "Remember names or voices", "Remember what you wrote about them"] ] style_count_map = {0: "visual", 1: "auditory", 2: "reading/writing"} def learning_style_quiz(*answers): scores = {'visual': 0, 'auditory': 0, 'reading/writing': 0} for i, ans in enumerate(answers): if i < len(learning_style_answers): options = learning_style_answers[i] if ans in options: index = options.index(ans) style = style_count_map[index] scores[style] += 1 max_score = max(scores.values()) best_styles = [style.capitalize() for style, score in scores.items() if score == max_score] return ", ".join(best_styles) # PanoramaEd categories and multiple choice questions get_to_know_categories = { "All About Me": [ ("What’s your favorite way to spend a day off?", []), ("If you could only eat one food for the rest of your life, what would it be?", []), ("Do you have any pets? If so, what are their names?", []), ("If you could travel anywhere in the world, where would you go?", []), ("What’s your favorite holiday or tradition?", []), ("What are some of your favorite movies or shows?", []), ("Do you have a favorite book or book series? Why?", []), ("Who is a character from a show, book, or movie that you relate to? Why?", []), ("If you could be any fictional character, who would you be and why?", []) ], "Hopes and Dreams": [ ("What do you want to be when you grow up?", []), ("What’s something you hope to achieve this year?", []), ("If you could change the world in one way, what would you do?", []), ("What are you most proud of?", []), ("What’s a big dream you have for your future?", []) ], "School Life": [ ("What’s your favorite subject in school?", []), ("What’s something that makes learning easier for you?", []), ("Do you prefer working alone or in groups?", []), ("What helps you feel confident in class?", []), ("What’s something you’re good at in school?", []) ], "Relationships": [ ("Who do you look up to and why?", []), ("Who is someone that makes you feel safe and supported?", []), ("Do you have a best friend? What do you like to do together?", []), ("What’s one thing you wish people knew about you?", []), ("What’s something kind you’ve done for someone else?", []) ] } def display_saved_profile(): try: with open("student_profile.json", "r") as f: profile = json.load(f) except FileNotFoundError: return "⚠️ No profile data found." transcript_info = profile.get("transcript_info", {}) gpa = transcript_info.get("GPA", "N/A") grade = transcript_info.get("Grade_Level", "N/A") courses = transcript_info.get("Courses", []) past_classes = [{'Course': course, 'Grade': 'A'} for course in courses[:max(len(courses)-2, 0)]] current_classes = [{'Course': course, 'Grade': 'IP'} for course in courses[-2:]] all_classes_df = pd.DataFrame(past_classes + current_classes) learning_type = profile.get("learning_style", "N/A") responses = profile.get("get_to_know_answers", {}) blog = profile.get("blog", "[User skipped this section]") comments = [f"⭐ I love how you spend your free time: {responses.get('What’s your favorite way to spend a day off?', 'N/A')}.", f"🍕 {responses.get('If you could only eat one food for the rest of your life, what would it be?', 'N/A')} sounds delicious!", f"🎬 You mentioned {responses.get('What are some of your favorite movies or shows?', 'N/A')}. Great picks!"] blog_comment = "" if blog and blog != "[User chose to skip this section]": blog_comment = f"📝 Your blog was very thoughtful! You wrote: \"{blog[:150]}...\"" summary_text = f""" 👤 **Student Overview** - Name: Extracted from transcript (if available) - GPA: {gpa} - Grade Level: {grade} 📚 **Courses** {all_classes_df.to_markdown(index=False)} 🧠 **Learning Type** Based on your answers, your learning style is: **{learning_type}** 💬 **Personal Reflections** {chr(10).join(comments)} {blog_comment} ❓ Is all this information correct? """ return summary_text # Gradio confirmation block with gr.Blocks() as review_block: gr.Markdown("## ✅ Profile Review & Confirmation") summary_output = gr.Markdown() confirm_btn = gr.Button("Yes, everything is correct") correct_btn = gr.Button("No, I need to make changes") final_status = gr.Textbox(label="Final Status") def confirm_review(): return display_saved_profile() def finalize(): return "🎉 All set! You're ready to move forward." def ask_to_correct(): return "🔁 Okay! Please update the necessary information and save again." confirm_btn.click(fn=finalize, outputs=[final_status]) correct_btn.click(fn=ask_to_correct, outputs=[final_status]) review_block.load(fn=confirm_review, outputs=[summary_output]) # Automatically load profile on page reload if __name__ == '__main__': review_block.launch()