Quiz / app.py
sudhir2016's picture
Create app.py
7d4cb09 verified
raw
history blame
5.87 kB
import gradio as gr
import uuid, os, tempfile, hashlib
from reportlab.lib.pagesizes import A5, landscape
from reportlab.pdfgen import canvas
from reportlab.lib.units import mm
from reportlab.lib.colors import HexColor
from datetime import datetime
# Certificate generation function (included for a self-contained script)
def generate_certificate(name, score, total, instructor="Sudhir Gupta"):
unique_id = str(uuid.uuid4())
filename = f"cert_{unique_id}.pdf"
filepath = os.path.join(tempfile.gettempdir(), filename)
c = canvas.Canvas(filepath, pagesize=landscape(A5))
width, height = landscape(A5)
c.setFillColor(HexColor("#fffdf6"))
c.rect(0, 0, width, height, stroke=0, fill=1)
c.setStrokeColor(HexColor("#001858"))
c.setLineWidth(3)
margin = 10 * mm
c.rect(margin, margin, width - 2 * margin, height - 2 * margin)
c.setFillColor(HexColor("#001858"))
c.setFont("Helvetica-Bold", 24)
c.drawCentredString(width / 2, height - 60, "Certificate of Completion")
c.setFont("Helvetica", 14)
c.drawCentredString(width / 2, height - 100, "This is awarded to")
c.setFont("Helvetica-Bold", 18)
c.drawCentredString(width / 2, height - 130, name)
c.setFont("Helvetica", 14)
c.drawCentredString(width / 2, height - 160, "For successfully completing the quiz - Our Solar System")
c.setFont("Helvetica", 12)
c.drawCentredString(width / 2, height - 185, f"Score: {score} / {total}")
c.setFont("Helvetica-Oblique", 10)
c.drawString(margin + 10, margin + 20, f"Instructor: {instructor}")
date_str = datetime.now().strftime("%d %B %Y")
c.setFont("Helvetica", 10)
c.drawRightString(width - margin - 10, margin + 20, f"Issued on: {date_str}")
c.save()
return filepath
# Quiz data (answers are hashed)
quiz_type = "Multiple Choice"
questions = [{'question': 'What is the name of the star at the center of our solar system?', 'options': ['The Moon', 'The Sun', 'Mars', 'The Milky Way'], 'answer_hash': 'f99f996daf45ff7005d515a01538d792c7449aa121b7469b8f52d426f3185613'}, {'question': 'Which planet is known as the "Red Planet"?', 'options': ['Jupiter', 'Venus', 'Saturn', 'Mars'], 'answer_hash': 'd158be41db87d7055fa9548fe9c0e3cb685983fedb4f2d648d7a25c046d72d9d'}, {'question': 'What are the large beautiful rings of Saturn made of?', 'options': ['Solid rock', 'Dust and gas', 'Ice and rock', 'Liquid water'], 'answer_hash': 'c14f48114ce9363f80b4e33f8c523c25e2422a14d68c976832a75e47b2d12a1c'}, {'question': 'Which is the largest planet in our solar system?', 'options': ['Jupiter', 'Earth', 'Mercury', 'Saturn'], 'answer_hash': '1e9cc37678c0112d7a394909256c2a5998a6e57e2b0d82209900e1456e51b7eb'}, {'question': 'How many planets are in our solar system?', 'options': ['7', '8', '9', '10'], 'answer_hash': '2c624232cdd221771294dfbb310aca000a0df6ac8b66b696d90ef06fdefb64a3'}, {'question': 'Which planet is closest to the Sun?', 'options': ['Venus', 'Mercury', 'Earth', 'Mars'], 'answer_hash': 'b769a6983b42d565e79bb4f3f534623453f301d39784e57804a649a67ea05327'}, {'question': 'What is the name of the natural satellite that orbits the Earth?', 'options': ['Phobos', 'The Sun', 'The Moon', 'A comet'], 'answer_hash': '7bcd0f182d906d8e5c1dfbe656720d51d545da8f491f35da2c627badb29731cf'}, {'question': 'Which planet is known for its beautiful rings?', 'options': ['Saturn', 'Uranus', 'Neptune', 'Jupiter'], 'answer_hash': 'b988b5837c24ad1987f31266e0246b0fdaaf7948714cfa2a9f7757c52977ff14'}, {'question': 'What is the name of the third planet from the Sun?', 'options': ['Mercury', 'Mars', 'Earth', 'Jupiter'], 'answer_hash': '7b74b418a352d67108173c20c1b16b4b726bad8606be65711ff924dbf9a40670'}, {'question': 'The path a planet takes around the Sun is called an:', 'options': ['Axis', 'Rotation', 'Orbit', 'Revolution'], 'answer_hash': '4fa1a13ac468ac495f3390e859d76d5e8ef49806815b45a21de7711bcc624194'}]
def eval_quiz(name, *answers):
"""
Evaluates the student's answers and generates a certificate only if the score is 80% or higher.
"""
if not name.strip():
name = "Anonymous"
score = 0
for i, ans in enumerate(answers):
if ans and hashlib.sha256(str(ans).lower().strip().encode()).hexdigest() == questions[i]["answer_hash"]:
score += 1
total_questions = len(questions)
passing_threshold = 0.8
result_message = f"Hi {name}, your score is: {score} / {total_questions}."
cert_path = None # Default to no certificate
# Check if the score meets the passing threshold
if total_questions > 0 and (score / total_questions) >= passing_threshold:
cert_path = generate_certificate(name, score, total_questions, instructor="Sudhir Gupta")
result_message += " Congratulations, you passed and earned a certificate!"
else:
result_message += " A score of 80% is required to receive a certificate."
return result_message, cert_path
# Gradio interface for the student
with gr.Blocks(theme=gr.themes.Soft()) as app:
gr.Markdown("## Our Solar System")
with gr.Row():
name = gr.Textbox(label="Enter Your Full Name to Generate Certificate", placeholder="e.g., Ada Lovelace")
answer_inputs = []
for q in questions:
gr.Markdown("**Question:** " + q['question'])
if quiz_type == "Multiple Choice":
answer_inputs.append(gr.Radio(choices=q["options"], label="Select your answer"))
else:
answer_inputs.append(gr.Textbox(label="Type your answer"))
submit_btn = gr.Button("Submit Quiz")
with gr.Row():
result_output = gr.Textbox(label="Your Result")
certificate_output = gr.File(label="Download Your Certificate")
submit_btn.click(
fn=eval_quiz,
inputs=[name] + answer_inputs,
outputs=[result_output, certificate_output]
)
app.launch(debug=True)