import streamlit as st
import openai
from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Paragraph
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
import docx
from docx.shared import Inches
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
# Set OpenAI API credentials
openai.api_key = "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"
st.markdown("Unleashing Boundless :red[Creativity], Welcome to Lesson Plan generator, created by **:blue[Daniyal]**")
# Apply custom CSS classes to style the app
# Set page title
st.title("A.I Lesson Plan for Teachers")
# Ask for age
age = st.number_input("Enter learner's age", min_value=0, max_value=100, step=1)
# Ask for subject and provide a text area
subject = st.text_area("Enter the subject")
topic= st.text_area("Enter the topic")
board = st.text_area("Enter the board ex: edexcel, aqa, IB or CBSE")
teacher=st.text_area("Enter the Educator's name")
# Complexity levels
complexity_levels = ["Beginner", "Intermediate", "Advanced", "Expert", "Master"]
complexity = st.selectbox("Select the complexity level", complexity_levels)
# Number of days
plan_duration = st.selectbox("Select the duration of the plan", ["1 hour", "1 week", "1 month", "3 months","6 months"])
# Generate lesson plan
if st.button("Generate Lesson Plan"):
prompt = f"You are tasked to produce a detailed lesson plan for teaching {subject} to {age}-year-old students. The lesson plan should be designed for a duration of {plan_duration}. The lesson should describe the following components:\n\nLesson Title: {topic}\nTeacher Name: {teacher}\n\n Duration: {plan_duration}\n\nKey Vocabulary: \n\nSupporting Material:\n\n. \n\nLearning Outcome:\n\n. \n\nKnowledge:\n\ninclude things students should know about {topic} in brief\n\nSkills:\n\nbecome proficient in {topic} include few example\n\nUnderstanding:\n\nunderstand the concepts of {topic} with an example. Differentiation:\n\ninclude tasks for students needing extra efforts and additional challenge\n\nLearning Experiences:\n\n.\n\nPrepare:\n\nMake a personal connect with the student including an ice breaker to develop interest in the {topic}\n\nPlan:\n\nplan out few activities to better understand the {topic} provide few example activities\n\nInvestigate:\n\nexplore in a structured way to collect and record information\n\nApply:\n\nStudents organize the information practice skills deepen understanding include few questions for student groups\n\nConnect:\n\nconnect and share learning with others.\n\nEvaluate and Reflect:\n\nStudent Assessment:\n\n sample QUESTIONS on {topic}. \n\nEducator Reflection:\n\nEnsure that the lesson plan is aligned with the requirements of the {board} exam board and promotes active learning and engagement. Incorporate appropriate supporting materials and consider the needs of diverse learners. Aim to achieve SMART objectives and create a stimulating learning environment. Once the lesson plan is developed, please provide a detailed description of each component as specified above."
# Define the prompt for ChatGPT
# Define the maximum number of tokens for each API call
response = openai.Completion.create(
engine="text-davinci-003",
prompt=prompt,
max_tokens=3600,
temperature=0.7,
n=1,
stop=None,
)
lesson_plan = response.choices[0].text.strip()
st.subheader("Generated Lesson Plan")
st.write(lesson_plan)
def create_word_document(lesson_plan):
doc = docx.Document()
# Add a section to the document
section = doc.sections[0]
# Set the header
header = section.header
paragraph = header.paragraphs[0]
# Add the logo to the header
run = paragraph.add_run()
logo_path = "digitalschool.png"
run.add_picture(logo_path, width=Inches(1.0), height=Inches(1.0))
# Set the footer
footer = section.footer
footer_text = "AI generated lesson plan - By Daniyal"
footer_paragraph = footer.paragraphs[0]
footer_paragraph.text = footer_text
# Define the custom subheading style
doc.styles.add_style("Subheading", docx.enum.style.WD_STYLE_TYPE.PARAGRAPH)
subheading_style = doc.styles["Subheading"]
subheading_style.font.bold = True
subheading_style.font.underline = True
subheading_style.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
# Split the lesson plan into lines
lines = lesson_plan.split("\n")
# Iterate over the lines and format the subheadings
for line in lines:
if line.startswith("Key Vocabulary:") or line.startswith("Supporting Material:") or line.startswith("Learning Outcome:") or line.startswith("Knowledge:") or line.startswith("Skills:") or line.startswith("Understanding:") or line.startswith("Differentiation:") or line.startswith("Learning Experiences:") or line.startswith("Prepare:") or line.startswith("Plan:") or line.startswith("Investigate:") or line.startswith("Apply:") or line.startswith("Connect:") or line.startswith("Evaluate and Reflect:") or line.startswith("Student Assessment:") or line.startswith("Educator Reflection:"):
doc.add_paragraph(line, style="Subheading")
else:
doc.add_paragraph(line)
doc_file = "lesson_plan.docx"
doc.save(doc_file)
return doc_file
def create_pdf(lesson_plan):
pdf_file = "lesson_plan.pdf"
doc = SimpleDocTemplate(pdf_file, pagesize=letter)
styles = getSampleStyleSheet()
story = []
lesson_plan = lesson_plan.replace("\n\n", "
")
# Adjust font size and leading for the lesson plan text
lesson_plan_style = styles["BodyText"]
lesson_plan_style.fontSize = 12
lesson_plan_style.leading = 14
p = Paragraph(lesson_plan, style=lesson_plan_style)
story.append(p)
doc.build(story)
return pdf_file
doc_file = create_word_document(lesson_plan)
with open(doc_file, "rb") as f:
doc_data = f.read()
# Download button for the lesson plan in Word format
st.download_button(
label="Download Lesson Plan (Word)",
data=doc_data,
file_name="lesson_plan.docx",
mime="application/vnd.openxmlformats-officedocument.wordprocessingml.document"
)
pdf_file = create_pdf(lesson_plan)
with open(pdf_file, "rb") as f:
pdf_data = f.read()
# Download button for the lesson plan in PDF format
st.download_button(
label="Download Lesson Plan (PDF)",
data=pdf_data,
file_name="lesson_plan.pdf",
mime="application/pdf"
)