vladyslav
Refactored returns in functions. Fixed displaying components when not all fields are filled
c37b8d9
import json | |
import os | |
import gradio as gr | |
from dotenv import load_dotenv | |
from constants import MODELS, MODELS_PATH, BOOKS | |
from utils import save_results | |
load_dotenv() | |
if os.getenv("ENV_TYPE") == "dev": | |
MODELS["Test"] = "test" | |
MODELS_PATH["Test"] = "test" | |
BOOKS["Test"] = "test.json" | |
questions_data = [] | |
current_question_index = 0 | |
answers_log = [] # Log for saving answers | |
def load_questions(model, book, student_name, class_name): | |
global questions_data, current_question_index | |
current_question_index = 0 | |
answers_log.clear() | |
if not model or not book or not student_name or not class_name: | |
return "# Будь ласка, заповніть усі поля!", [] | |
model_path = MODELS_PATH[model] | |
book_filename = BOOKS[book] | |
file_path = os.path.join("questions", model_path, book_filename) | |
if not os.path.exists(file_path): | |
return f"Файл за шляхом {file_path} не знайдено.", [] | |
with open(file_path, "r", encoding="utf-8") as file: | |
questions_data = json.load(file) | |
if questions_data: | |
first_question = questions_data[current_question_index] | |
question_text = f"# Питання:\n## {first_question['question']}" | |
answers = [answer['answer'] for answer in first_question['answers']] | |
return question_text, answers | |
else: | |
return "У файлі немає питань.", [] | |
def get_next_question(selected_answer): | |
global current_question_index, answers_log | |
# Writing answer in log | |
answers_log.append({ | |
"selected": selected_answer, | |
"isCorrect": any(answer['answer'] == selected_answer and answer['isCorrect'] for answer in | |
questions_data[current_question_index]['answers']) | |
}) | |
# Move to the next question | |
current_question_index += 1 | |
if current_question_index < len(questions_data): | |
next_question = questions_data[current_question_index] | |
question_text = f"# Питання:\n## {next_question['question']}" | |
answers = [answer['answer'] for answer in next_question['answers']] | |
return question_text, gr.update(choices=answers, interactive=True), gr.update(visible=True), gr.update( | |
visible=False), gr.update(visible=False), gr.update(visible=False) | |
else: | |
# All questions are completed — ask for feedback | |
question_text = "Дякуємо за участь у тесті! Залиште, будь ласка, свій відгук і оцініть тест." | |
return ( | |
question_text, # question_radio | |
gr.update(visible=False), # answer_radio | |
gr.update(visible=False), # next_button | |
gr.update(visible=True), # feedback_input | |
gr.update(visible=True), # rating_slider | |
gr.update(visible=True) # submit_feedback_button | |
) | |
def summarize_results(student_name, class_name, model, book, feedback, rating): | |
global questions_data, answers_log | |
questions = [] | |
for question, answer in zip(questions_data, answers_log): | |
questions.append({ | |
"question": question, | |
"answer": answer | |
}) | |
save_results(student_name, class_name, MODELS[model], book, questions, feedback, rating) | |
correct_answers_count = sum(1 for answer in answers_log if answer['isCorrect']) | |
total_questions = len(questions_data) | |
grade_12 = (correct_answers_count / total_questions) * 12 | |
summary = ( | |
f"# Усі питання пройдено.\n\n" | |
f"## Ви відповіли правильно на {correct_answers_count} з {total_questions} питань.\n\n" | |
f"## Оцінка за 12-бальною шкалою: {grade_12:.2f}\n\n" | |
) | |
return ( | |
summary, # question_output | |
gr.update(visible=False, value=""), # feedback_input | |
gr.update(visible=False, value=0), # rating_slider | |
gr.update(visible=False) # submit_feedback_button | |
) | |
with gr.Blocks() as demo: | |
with gr.Column(): | |
gr.Markdown("# Оберіть модель та книгу, щоб завантажити питання") | |
student_name_input = gr.Textbox(label="Ваше ім'я") | |
class_name_input = gr.Textbox(label="Ваш клас") | |
model_radio = gr.Radio(list(MODELS.keys()), label="Оберіть модель") | |
book_radio = gr.Radio(list(BOOKS.keys()), label="Оберіть книгу") | |
load_button = gr.Button("Завантажити питання") | |
question_output = gr.Markdown(label="Питання") | |
answer_radio = gr.Radio([], label="Варіанти відповіді", interactive=True, visible=False) | |
next_button = gr.Button("Наступне питання", visible=False) | |
feedback_input = gr.Textbox(label="Ваш відгук про тест", visible=False) | |
rating_slider = gr.Slider(1, 5, step=1, label="Оцініть тест", visible=False) | |
submit_feedback_button = gr.Button("Завершити тест", visible=False) | |
def update_question(model, book): | |
question, answers = load_questions(model, book, student_name_input, class_name_input) | |
is_field_filled = len(answers) > 0 | |
return ( | |
question, # question_output | |
gr.update(choices=answers, interactive=True, visible=is_field_filled), # answer_radio | |
gr.update(visible=is_field_filled), # next_button | |
gr.update(visible=False), # feedback_input | |
gr.update(visible=False), # rating_slider | |
gr.update(visible=False) # submit_feedback_button | |
) | |
load_button.click( | |
update_question, | |
inputs=[model_radio, book_radio], | |
outputs=[question_output, answer_radio, next_button, feedback_input, rating_slider, submit_feedback_button] | |
) | |
next_button.click( | |
get_next_question, | |
inputs=[answer_radio], | |
outputs=[question_output, answer_radio, next_button, feedback_input, rating_slider, submit_feedback_button] | |
) | |
submit_feedback_button.click( | |
summarize_results, | |
inputs=[student_name_input, class_name_input, model_radio, book_radio, feedback_input, rating_slider], | |
outputs=[question_output, feedback_input, rating_slider, submit_feedback_button] | |
) | |
if __name__ == "__main__": | |
demo.launch() | |