File size: 5,860 Bytes
fd59f22
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
import streamlit as st
import json
from openai_llm import LessonPlanGenerator

# Page configuration
st.set_page_config(
    page_title="Lesson Plan Generator",
   # page_icon="๐Ÿ“š",
    layout="wide"
)

# Custom CSS with corrected container styling
st.markdown("""
    <style>
    /* Main container */
    .main-container {
        background-color: white;
        border-radius: 8px;
        padding: 25px;
        margin: 20px 0;
        box-shadow: 0 2px 8px rgba(0,0,0,0.1);
    }

    /* Section styling */
    .section {
        margin: 15px 0;
        padding: 10px 0;
        border-bottom: 1px solid #eee;
    }

    /* Header styling */
    .section-header {
        color: #1a237e;
        font-size: 18px;
        font-weight: 600;
        margin-bottom: 10px;
    }

    /* Content styling */
    .section-content {
        color: #333;
        margin-left: 20px;
    }

    /* List item styling */
    .list-item {
        margin: 5px 0;
        color: #333;
    }

    /* Nested content */
    .nested-content {
        margin-left: 20px;
        padding-left: 10px;
        border-left: 2px solid #e8eaf6;
    }
    </style>
""", unsafe_allow_html=True)


# Initialize generator
@st.cache_resource
def get_generator():
    return LessonPlanGenerator()


generator = get_generator()

# Header
st.title("WizLab Lesson Plan Generator")
st.markdown("We help you generate lesson plans tailored to your needs.")

# Input section
st.header("๐Ÿ“ Input Your Requirements")

# Create two columns for input fields
col1, col2 = st.columns(2)

with col1:
    topic = st.text_input("Topic", placeholder="e.g., Introduction to Photosynthesis")

    age_group_options = ["Elementary (6-11)", "Middle School (12-14)",
                         "High School (15-18)", "Adult Learners", "Other"]
    age_group_selection = st.selectbox("Target Age Group", age_group_options)
    if age_group_selection == "Other":
        age_group = st.text_input("Specify Age Group")
    else:
        age_group = age_group_selection

with col2:
    duration_options = ["30 minutes", "45 minutes", "60 minutes", "90 minutes", "Other"]
    duration_selection = st.selectbox("Lesson Duration", duration_options)
    if duration_selection == "Other":
        duration = st.text_input("Specify Duration")
    else:
        duration = duration_selection

    proficiency_options = ["Beginner", "Intermediate", "Advanced", "Other"]
    proficiency_selection = st.selectbox("Proficiency Level", proficiency_options)
    if proficiency_selection == "Other":
        proficiency = st.text_input("Specify Proficiency Level")
    else:
        proficiency = proficiency_selection

tech_options = ["Interactive Whiteboard", "Computers/Laptops",
                "Mobile Devices", "Internet Access", "None", "Other"]
tech_selection = st.multiselect("Technology Requirements", tech_options)

if "Other" in tech_selection:
    other_tech = st.text_input("Specify Other Technology Requirements")
    tech_usage = [tech for tech in tech_selection if tech != "Other"] + [other_tech]
else:
    tech_usage = tech_selection


def format_content(data):
    html_content = '<div class="main-container">'

    def process_value(value, level=0):
        if isinstance(value, dict):
            return process_dict(value, level)
        elif isinstance(value, list):
            return process_list(value, level)
        else:
            return f'<div class="section-content">{value}</div>'

    def process_dict(d, level):
        content = ""
        for key, value in d.items():
            formatted_key = key.replace("_", " ").title()
            content += f'<div class="section">'
            content += f'<div class="section-header">{formatted_key}</div>'
            content += process_value(value, level + 1)
            content += '</div>'
        return content

    def process_list(lst, level):
        content = '<div class="section-content">'
        for item in lst:
            if isinstance(item, dict):
                content += process_dict(item, level + 1)
            else:
                content += f'<div class="list-item">โ€ข {item}</div>'
        content += '</div>'
        return content

    html_content += process_dict(data, 0)
    html_content += '</div>'
    return html_content


# Generate button
if st.button("Generate Lesson Plan", type="primary"):
    if not topic:
        st.error("Please enter a topic for the lesson plan.")
    else:
        with st.spinner("Generating your lesson plan..."):
            detailed_prompt = f"""
            Create a lesson plan for teaching '{topic}' to {age_group} students.
            Duration: {duration}
            Proficiency Level: {proficiency}
            Technology Requirements: {', '.join(tech_usage) if tech_usage else 'None'}
            """

            try:
                result = generator.generate_lesson_plan(detailed_prompt)
                st.success("Lesson plan generated successfully!")

                # Create tabs for different views
                tab1, tab2 = st.tabs(["Formatted View", "Raw JSON"])

                with tab1:
                    if isinstance(result, dict):
                        # Display formatted content in white container
                        st.markdown(format_content(result), unsafe_allow_html=True)
                    else:
                        st.error("Invalid response format")

                with tab2:
                    st.json(result)

                # Download button
                st.download_button(
                    label="Download Lesson Plan",
                    data=json.dumps(result, indent=2),
                    file_name="lesson_plan.json",
                    mime="application/json"
                )

            except Exception as e:
                st.error(f"An error occurred: {str(e)}")

# Footer
st.markdown("---")