File size: 5,554 Bytes
31157e8
1258179
d5f098f
31157e8
 
 
 
 
0fe3545
 
 
 
31157e8
0fe3545
31157e8
d5f098f
 
0fe3545
d5f098f
0fe3545
31157e8
c0d911e
0fe3545
 
 
c0d911e
31157e8
c0d911e
0fe3545
 
c0d911e
31157e8
0fe3545
31157e8
 
 
d5f098f
0fe3545
d5f098f
 
 
0fe3545
 
 
d5f098f
 
31157e8
d5f098f
1258179
31157e8
 
0fe3545
 
 
 
 
31157e8
d5f098f
31157e8
 
c0d911e
 
0fe3545
 
 
 
 
 
 
 
 
31157e8
 
 
0fe3545
d5f098f
0fe3545
c0d911e
0fe3545
 
 
 
 
c0d911e
 
 
 
0fe3545
 
c0d911e
0fe3545
 
c0d911e
31157e8
 
 
 
 
 
c0d911e
31157e8
 
c0d911e
31157e8
0fe3545
 
c0d911e
0fe3545
 
 
 
c0d911e
0fe3545
 
 
 
1cb2d7e
c0d911e
 
 
0fe3545
 
c0d911e
31157e8
 
 
c0d911e
0fe3545
 
31157e8
 
 
 
 
0fe3545
 
31157e8
 
0fe3545
 
 
 
 
31157e8
 
 
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
import os
from datetime import datetime
import random

import gradio as gr
from datasets import load_dataset, Dataset
from huggingface_hub import whoami

# Dataset corretto
EXAM_DATASET_ID = "huggingface-course/chapter_1_exam"
EXAM_MAX_QUESTIONS = 10
EXAM_PASSING_SCORE = 0.7

# Caricamento e mescolamento delle domande
ds = load_dataset(EXAM_DATASET_ID, split="train")
quiz_data = ds.to_pandas().to_dict("records")
random.shuffle(quiz_data)
quiz_data = quiz_data[:EXAM_MAX_QUESTIONS]

def on_user_logged_in(token):
    if token is not None:
        return [
            gr.update(visible=False), gr.update(visible=True), gr.update(visible=False),
            gr.update(visible=False), "", [],
            "Click 'Start' to begin the quiz", 0, [], "", token
        ]
    else:
        return [
            gr.update(visible=True), gr.update(visible=False), gr.update(visible=False),
            gr.update(visible=False), "", [], "", 0, [], "", None
        ]

def push_results_to_hub(user_answers, token):
    if token is None:
        gr.Warning("Please log in to Hugging Face before pushing!")
        return

    correct_count = sum(1 for a in user_answers if a["is_correct"])
    total_questions = len(user_answers)
    grade = correct_count / total_questions if total_questions > 0 else 0

    if grade < EXAM_PASSING_SCORE:
        gr.Warning(f"Score {grade:.1%} below passing threshold of {EXAM_PASSING_SCORE:.1%}")
        return f"You scored {grade:.1%}. Please try again to achieve at least {EXAM_PASSING_SCORE:.1%}"

    gr.Info("Submitting answers to the Hub. Please wait...", duration=2)
    user_info = whoami(token=token.token)
    repo_id = f"{EXAM_DATASET_ID}_student_responses"
    submission_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

    new_ds = Dataset.from_list(user_answers)
    new_ds = new_ds.map(lambda x: {
        "username": user_info["name"],
        "datetime": submission_time,
        "grade": grade
    })
    new_ds.push_to_hub(repo_id)
    return f"Your responses have been submitted to the Hub! Final grade: {grade:.1%}"

def handle_quiz(question_idx, user_answers, selected_answer, is_start):
    if not is_start and question_idx < len(quiz_data):
        current_q = quiz_data[question_idx]
        correct_key = f"answer_{current_q['correct_answer']}".lower()
        is_correct = selected_answer == current_q[correct_key]
        user_answers.append({
            "question": current_q["question"],
            "selected_answer": selected_answer,
            "correct_answer": current_q[correct_key],
            "is_correct": is_correct,
            "correct_reference": correct_key
        })
        question_idx += 1

    if question_idx >= len(quiz_data):
        correct_count = sum(1 for a in user_answers if a["is_correct"])
        grade = correct_count / len(user_answers)
        results_text = f"**Quiz Complete!**\n\nYour score: {grade:.1%}\nPassing score: {EXAM_PASSING_SCORE:.1%}\n"
        return [
            "", gr.update(choices=[], visible=False),
            f"{'✅ Passed!' if grade >= EXAM_PASSING_SCORE else '❌ Did not pass'}",
            question_idx, user_answers,
            gr.update(visible=False), gr.update(visible=False), gr.update(visible=True),
            results_text
        ]

    q = quiz_data[question_idx]
    return [
        f"## Question {question_idx + 1}\n### {q['question']}",
        gr.update(choices=[q["answer_a"], q["answer_b"], q["answer_c"], q["answer_d"]], value=None, visible=True),
        "Select an answer and click 'Next' to continue.",
        question_idx, user_answers,
        gr.update(visible=False), gr.update(visible=True), gr.update(visible=False), ""
    ]

def success_message(response):
    return f"{response}\n\n**Success!**"

with gr.Blocks() as demo:
    demo.title = f"Dataset Quiz for {EXAM_DATASET_ID}"

    question_idx = gr.State(value=0)
    user_answers = gr.State(value=[])
    user_token = gr.State(value=None)

    gr.Markdown(f"## Welcome to the {EXAM_DATASET_ID} Quiz")
    gr.Markdown("Log in first, then click 'Start' to begin. Answer each question, click 'Next', and finally click 'Submit'.")

    question_text = gr.Markdown("")
    radio_choices = gr.Radio(choices=[], label="Your Answer", scale=1.5, visible=False)
    status_text = gr.Markdown("")
    final_markdown = gr.Markdown("")

    login_btn = gr.LoginButton(visible=True)
    start_btn = gr.Button("Start ⏭️", visible=True)
    next_btn = gr.Button("Next ⏭️", visible=False)
    submit_btn = gr.Button("Submit ✅", visible=False)

    login_btn.click(
        fn=on_user_logged_in,
        inputs=None,
        outputs=[login_btn, start_btn, next_btn, submit_btn, question_text, radio_choices,
                 status_text, question_idx, user_answers, final_markdown, user_token]
    )

    start_btn.click(
        fn=handle_quiz,
        inputs=[question_idx, user_answers, gr.State(""), gr.State(True)],
        outputs=[question_text, radio_choices, status_text, question_idx, user_answers,
                 start_btn, next_btn, submit_btn, final_markdown]
    )

    next_btn.click(
        fn=handle_quiz,
        inputs=[question_idx, user_answers, radio_choices, gr.State(False)],
        outputs=[question_text, radio_choices, status_text, question_idx, user_answers,
                 start_btn, next_btn, submit_btn, final_markdown]
    )

    submit_btn.click(
        fn=push_results_to_hub,
        inputs=[user_answers, user_token],
        outputs=[final_markdown]
    )

if __name__ == "__main__":
    demo.launch()