Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import pandas as pd | |
| from fpdf import FPDF | |
| import datetime | |
| # Initialize session state | |
| def init_session_state(): | |
| if "study_data" not in st.session_state: | |
| st.session_state.study_data = pd.DataFrame(columns=["Subject", "Topic", "Goal", "Progress (%)"]) | |
| if "calendar_data" not in st.session_state: | |
| st.session_state.calendar_data = pd.DataFrame({"Day": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], "Planned Topic": ["" for _ in range(7)]}) | |
| # PDF Generation | |
| def generate_pdf(df): | |
| pdf = FPDF() | |
| pdf.add_page() | |
| pdf.set_font("Arial", size=12) | |
| pdf.cell(200, 10, txt="Study Plan Report", ln=True, align='C') | |
| pdf.ln(10) | |
| for i, row in df.iterrows(): | |
| pdf.multi_cell(0, 10, f"Subject: {row['Subject']}\nTopic: {row['Topic']}\nGoal: {row['Goal']}\nProgress: {row['Progress (%)']}%\n") | |
| pdf.ln(1) | |
| file_path = "study_report.pdf" | |
| pdf.output(file_path) | |
| return file_path | |
| def main(): | |
| st.set_page_config(page_title="Study Planner", layout="wide") | |
| st.title("π Smart Study Planner") | |
| init_session_state() | |
| st.sidebar.markdown("---") | |
| st.sidebar.header("π Upload Your Study Plan (optional)") | |
| uploaded_plan = st.sidebar.file_uploader("Upload Study CSV", type=["csv"]) | |
| uploaded_calendar = st.sidebar.file_uploader("Upload Calendar CSV", type=["csv"]) | |
| # Handle uploads | |
| if uploaded_plan: | |
| st.session_state.study_data = pd.read_csv(uploaded_plan) | |
| if uploaded_calendar: | |
| st.session_state.calendar_data = pd.read_csv(uploaded_calendar) | |
| if st.sidebar.button("π Reset All"): | |
| st.session_state.study_data = pd.DataFrame(columns=["Subject", "Topic", "Goal", "Progress (%)"]) | |
| st.session_state.calendar_data = pd.DataFrame({"Day": ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"], "Planned Topic": ["" for _ in range(7)]}) | |
| st.sidebar.success("Planner has been reset.") | |
| with st.sidebar: | |
| st.header("β Add Study Task") | |
| subject = st.text_input("Subject") | |
| topic = st.text_input("Topic") | |
| goal = st.text_area("Goal Description") | |
| progress = st.slider("Progress (%)", 0, 100, 0) | |
| if st.button("Add Task"): | |
| if subject and topic: | |
| new_row = {"Subject": subject, "Topic": topic, "Goal": goal, "Progress (%)": progress} | |
| st.session_state.study_data = pd.concat([ | |
| st.session_state.study_data, | |
| pd.DataFrame([new_row]) | |
| ], ignore_index=True) | |
| st.success("Task added!") | |
| else: | |
| st.error("Subject and Topic are required.") | |
| df = st.session_state.study_data | |
| calendar_df = st.session_state.calendar_data | |
| st.subheader("π― Study Summary by Subject") | |
| if not df.empty: | |
| subjects = df["Subject"].unique() | |
| cols = st.columns(len(subjects)) | |
| colors = ["#fca311", "#a1c181", "#f28482", "#8ecae6", "#ffb703"] | |
| for i, subject in enumerate(subjects): | |
| sub_df = df[df["Subject"] == subject] | |
| avg_progress = int(sub_df["Progress (%)"].mean()) | |
| with cols[i % len(cols)]: | |
| st.markdown(f""" | |
| <div style='padding: 1em; border-radius: 10px; background-color: {colors[i % len(colors)]}; color: black'> | |
| <h4>{subject}</h4> | |
| <p>Topics: {len(sub_df)}</p> | |
| <p>Avg. Progress: {avg_progress}%</p> | |
| </div> | |
| """, unsafe_allow_html=True) | |
| st.subheader("π Weekly Study Calendar") | |
| days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"] | |
| calendar_data = [] | |
| for day in days: | |
| default_topic = calendar_df.set_index("Day").get("Planned Topic", {}).get(day, "") | |
| topic = st.text_input(f"{day}", value=default_topic) | |
| calendar_data.append({"Day": day, "Planned Topic": topic}) | |
| if st.button("Save Weekly Plan"): | |
| st.session_state.calendar_data = pd.DataFrame(calendar_data) | |
| st.success("Weekly calendar saved.") | |
| st.markdown("---") | |
| st.subheader("π All Study Tasks (Editable)") | |
| if not df.empty: | |
| edited_df = st.data_editor(df, num_rows="dynamic", use_container_width=True) | |
| st.session_state.study_data = edited_df | |
| st.markdown("---") | |
| st.subheader("π Progress Summary") | |
| summary = edited_df.groupby("Subject")["Progress (%)"].mean().reset_index() | |
| st.bar_chart(summary.set_index("Subject")) | |
| st.markdown("---") | |
| st.subheader("π€ Export Options") | |
| csv = df.to_csv(index=False).encode("utf-8") | |
| st.download_button("β¬οΈ Download CSV", data=csv, file_name="study_data.csv", mime="text/csv") | |
| if st.button("π Generate PDF Report"): | |
| file_path = generate_pdf(edited_df) | |
| with open(file_path, "rb") as f: | |
| st.download_button("π₯ Download PDF", f, file_name="study_plan_report.pdf") | |
| else: | |
| st.info("No tasks added yet.") | |
| if __name__ == "__main__": | |
| main() | |