Sina Media Lab
commited on
Commit
·
92fe395
1
Parent(s):
700a11e
Updates
Browse files
app.py
CHANGED
|
@@ -46,7 +46,7 @@ def generate_pdf_report():
|
|
| 46 |
|
| 47 |
# Module Title
|
| 48 |
pdf.set_font("Arial", style='B', size=10)
|
| 49 |
-
pdf.multi_cell(0, 10, f"Module: {entry['
|
| 50 |
|
| 51 |
# Question
|
| 52 |
pdf.set_font("Arial", style='B', size=10)
|
|
@@ -81,7 +81,7 @@ def load_modules():
|
|
| 81 |
# Dynamically import the module only when needed
|
| 82 |
module = __import__(f"{module_dir}.{module_name}", fromlist=[''])
|
| 83 |
modules[module_name] = {
|
| 84 |
-
"title": getattr(module, "title", module_name),
|
| 85 |
"description": getattr(module, "description", "No description available."),
|
| 86 |
"generate_question": module.generate_question # Access the generate_question function
|
| 87 |
}
|
|
@@ -92,18 +92,13 @@ def generate_new_question(module_name, module):
|
|
| 92 |
# Ensure 'answered' is initialized to False and add the 'module' and 'selected' keys
|
| 93 |
question_data['answered'] = False
|
| 94 |
question_data['module'] = module_name # Add the module name to the question data
|
|
|
|
| 95 |
question_data['selected'] = None # Initialize 'selected' to None
|
| 96 |
# Ensure there are exactly 4 options
|
| 97 |
if len(question_data['options']) != 4:
|
| 98 |
st.warning(f"Question in module '{module_name}' does not have 4 options. Found {len(question_data['options'])}.")
|
| 99 |
return question_data
|
| 100 |
|
| 101 |
-
def navigate_question(direction):
|
| 102 |
-
if direction == "prev" and st.session_state.current_index > 0:
|
| 103 |
-
st.session_state.current_index -= 1
|
| 104 |
-
elif direction == "next" and st.session_state.current_index < len(st.session_state.questions) - 1:
|
| 105 |
-
st.session_state.current_index += 1
|
| 106 |
-
|
| 107 |
# Load all modules dynamically
|
| 108 |
modules = load_modules()
|
| 109 |
|
|
@@ -120,38 +115,17 @@ for module in modules:
|
|
| 120 |
if selected_module != st.session_state.current_module:
|
| 121 |
st.session_state.current_module = selected_module
|
| 122 |
st.session_state.current_index = len(st.session_state.questions) # Continue numbering from previous questions
|
| 123 |
-
st.session_state.questions.append(generate_new_question(selected_module, modules[selected_module]))
|
| 124 |
-
st.session_state.module_question_count[selected_module] = st.session_state.module_question_count.get(selected_module, 0)
|
| 125 |
-
st.session_state.module_correct_count[selected_module] = st.session_state.module_correct_count.get(selected_module, 0)
|
| 126 |
st.session_state.selected_answer = None
|
| 127 |
st.session_state.button_label = "Submit/New"
|
|
|
|
|
|
|
| 128 |
|
| 129 |
-
|
| 130 |
-
current_question = st.session_state.questions[st.session_state.current_index]
|
| 131 |
|
| 132 |
# Display module title and description with smaller header and font
|
| 133 |
st.markdown(f"### {modules[selected_module]['title']}")
|
| 134 |
st.markdown(f"<span style='font-size: 12px;'>{modules[selected_module]['description']}</span>", unsafe_allow_html=True)
|
| 135 |
|
| 136 |
-
# Navigation and PDF report buttons
|
| 137 |
-
col1, col2, col3 = st.columns([1, 1, 2])
|
| 138 |
-
with col1:
|
| 139 |
-
if st.button("⬅️ Prev", disabled=st.session_state.current_index == 0):
|
| 140 |
-
navigate_question("prev")
|
| 141 |
-
with col2:
|
| 142 |
-
if st.button("➡️ Next", disabled=st.session_state.current_index >= len(st.session_state.questions) - 1):
|
| 143 |
-
navigate_question("next")
|
| 144 |
-
with col3:
|
| 145 |
-
if any(q['answered'] for q in st.session_state.questions):
|
| 146 |
-
pdf = generate_pdf_report()
|
| 147 |
-
st.session_state.pdf_data = pdf # Reset PDF cache
|
| 148 |
-
st.download_button(
|
| 149 |
-
label="Download PDF Report 📄",
|
| 150 |
-
data=st.session_state.pdf_data,
|
| 151 |
-
file_name="quiz_report.pdf",
|
| 152 |
-
mime="application/pdf"
|
| 153 |
-
)
|
| 154 |
-
|
| 155 |
# Display the current question with larger font
|
| 156 |
st.markdown(f"<span style='font-size: 18px;'><b>Q{st.session_state.current_index + 1}: {current_question['question']}</b></span>", unsafe_allow_html=True)
|
| 157 |
|
|
@@ -162,11 +136,10 @@ with st.form(key=f'question_form_{st.session_state.current_index}'):
|
|
| 162 |
"Choose an answer:",
|
| 163 |
options=[f"{options[i]}. {opt}" for i, opt in enumerate(current_question['options'])],
|
| 164 |
key=f"question_{st.session_state.current_index}_options",
|
| 165 |
-
index=None
|
| 166 |
-
disabled=current_question['answered']
|
| 167 |
)
|
| 168 |
|
| 169 |
-
submit_button = st.form_submit_button(label="Submit/New"
|
| 170 |
|
| 171 |
# Handle button state and answer submission
|
| 172 |
if submit_button:
|
|
@@ -186,7 +159,7 @@ if submit_button:
|
|
| 186 |
# Show correct/incorrect feedback, explanation, and step-by-step solution
|
| 187 |
st.markdown(
|
| 188 |
"""
|
| 189 |
-
<div style='
|
| 190 |
""", unsafe_allow_html=True)
|
| 191 |
for i, option in enumerate(current_question['options']):
|
| 192 |
option_text = f"{options[i]}. {option}"
|
|
@@ -197,13 +170,26 @@ if submit_button:
|
|
| 197 |
else:
|
| 198 |
st.markdown(f"{option_text}", unsafe_allow_html=True)
|
| 199 |
|
| 200 |
-
st.
|
| 201 |
-
st.
|
| 202 |
for step in current_question['step_by_step_solution']:
|
| 203 |
-
st.
|
| 204 |
st.markdown("</div>", unsafe_allow_html=True)
|
| 205 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 206 |
# Generate a new question after submission
|
| 207 |
-
|
| 208 |
-
|
| 209 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 46 |
|
| 47 |
# Module Title
|
| 48 |
pdf.set_font("Arial", style='B', size=10)
|
| 49 |
+
pdf.multi_cell(0, 10, f"Module: {entry['module_title']}", border=1, fill=True)
|
| 50 |
|
| 51 |
# Question
|
| 52 |
pdf.set_font("Arial", style='B', size=10)
|
|
|
|
| 81 |
# Dynamically import the module only when needed
|
| 82 |
module = __import__(f"{module_dir}.{module_name}", fromlist=[''])
|
| 83 |
modules[module_name] = {
|
| 84 |
+
"title": getattr(module, "title", module_name.replace("_", " ").title()),
|
| 85 |
"description": getattr(module, "description", "No description available."),
|
| 86 |
"generate_question": module.generate_question # Access the generate_question function
|
| 87 |
}
|
|
|
|
| 92 |
# Ensure 'answered' is initialized to False and add the 'module' and 'selected' keys
|
| 93 |
question_data['answered'] = False
|
| 94 |
question_data['module'] = module_name # Add the module name to the question data
|
| 95 |
+
question_data['module_title'] = module['title'] # Add the module title to the question data
|
| 96 |
question_data['selected'] = None # Initialize 'selected' to None
|
| 97 |
# Ensure there are exactly 4 options
|
| 98 |
if len(question_data['options']) != 4:
|
| 99 |
st.warning(f"Question in module '{module_name}' does not have 4 options. Found {len(question_data['options'])}.")
|
| 100 |
return question_data
|
| 101 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 102 |
# Load all modules dynamically
|
| 103 |
modules = load_modules()
|
| 104 |
|
|
|
|
| 115 |
if selected_module != st.session_state.current_module:
|
| 116 |
st.session_state.current_module = selected_module
|
| 117 |
st.session_state.current_index = len(st.session_state.questions) # Continue numbering from previous questions
|
|
|
|
|
|
|
|
|
|
| 118 |
st.session_state.selected_answer = None
|
| 119 |
st.session_state.button_label = "Submit/New"
|
| 120 |
+
# Generate a new question without adding it to the answered list yet
|
| 121 |
+
st.session_state.current_question = generate_new_question(selected_module, modules[selected_module])
|
| 122 |
|
| 123 |
+
current_question = st.session_state.current_question
|
|
|
|
| 124 |
|
| 125 |
# Display module title and description with smaller header and font
|
| 126 |
st.markdown(f"### {modules[selected_module]['title']}")
|
| 127 |
st.markdown(f"<span style='font-size: 12px;'>{modules[selected_module]['description']}</span>", unsafe_allow_html=True)
|
| 128 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 129 |
# Display the current question with larger font
|
| 130 |
st.markdown(f"<span style='font-size: 18px;'><b>Q{st.session_state.current_index + 1}: {current_question['question']}</b></span>", unsafe_allow_html=True)
|
| 131 |
|
|
|
|
| 136 |
"Choose an answer:",
|
| 137 |
options=[f"{options[i]}. {opt}" for i, opt in enumerate(current_question['options'])],
|
| 138 |
key=f"question_{st.session_state.current_index}_options",
|
| 139 |
+
index=None,
|
|
|
|
| 140 |
)
|
| 141 |
|
| 142 |
+
submit_button = st.form_submit_button(label="Submit/New")
|
| 143 |
|
| 144 |
# Handle button state and answer submission
|
| 145 |
if submit_button:
|
|
|
|
| 159 |
# Show correct/incorrect feedback, explanation, and step-by-step solution
|
| 160 |
st.markdown(
|
| 161 |
"""
|
| 162 |
+
<div style='padding: 10px;'>
|
| 163 |
""", unsafe_allow_html=True)
|
| 164 |
for i, option in enumerate(current_question['options']):
|
| 165 |
option_text = f"{options[i]}. {option}"
|
|
|
|
| 170 |
else:
|
| 171 |
st.markdown(f"{option_text}", unsafe_allow_html=True)
|
| 172 |
|
| 173 |
+
st.markdown(f"<span style='font-size: 12px;'><b>Explanation:</b> {current_question['explanation']}</span>", unsafe_allow_html=True)
|
| 174 |
+
st.markdown(f"<span style='font-size: 12px;'><b>Step-by-Step Solution:</b></span>", unsafe_allow_html=True)
|
| 175 |
for step in current_question['step_by_step_solution']:
|
| 176 |
+
st.markdown(f"<span style='font-size: 12px;'>{step}</span>", unsafe_allow_html=True)
|
| 177 |
st.markdown("</div>", unsafe_allow_html=True)
|
| 178 |
|
| 179 |
+
# Add the question to the answered list only after submission
|
| 180 |
+
st.session_state.questions.append(current_question)
|
| 181 |
+
st.session_state.current_index = len(st.session_state.questions)
|
| 182 |
+
|
| 183 |
# Generate a new question after submission
|
| 184 |
+
st.session_state.current_question = generate_new_question(selected_module, modules[selected_module])
|
| 185 |
+
|
| 186 |
+
# Generate PDF report only if there is at least one answered question
|
| 187 |
+
if any(q['answered'] for q in st.session_state.questions):
|
| 188 |
+
pdf = generate_pdf_report()
|
| 189 |
+
st.session_state.pdf_data = pdf # Reset PDF cache
|
| 190 |
+
st.download_button(
|
| 191 |
+
label="Download PDF Report 📄",
|
| 192 |
+
data=st.session_state.pdf_data,
|
| 193 |
+
file_name="quiz_report.pdf",
|
| 194 |
+
mime="application/pdf"
|
| 195 |
+
)
|