File size: 3,202 Bytes
4195ac0
d9d8e75
4195ac0
 
35b9d7e
4195ac0
5bb2ded
4195ac0
 
5bb2ded
4195ac0
5bb2ded
4195ac0
 
 
 
 
5bb2ded
4195ac0
 
 
 
5bb2ded
4195ac0
 
 
 
 
 
 
5bb2ded
 
4195ac0
d9d8e75
4195ac0
35b9d7e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5bb2ded
 
d9d8e75
5bb2ded
4195ac0
 
5bb2ded
4195ac0
 
 
 
 
 
 
5bb2ded
 
4195ac0
 
 
 
 
 
 
5bb2ded
 
4195ac0
5bb2ded
4195ac0
 
 
 
35b9d7e
 
4195ac0
 
 
f9b68ce
35b9d7e
4195ac0
 
5bb2ded
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
import gradio as gr
from datasets import load_dataset
from datetime import datetime
import io
from PIL import Image, ImageDraw, ImageFont

# Constants
SCORES_DATASET = "agents-course/unit4-students-scores"
CERTIFICATES_DATASET = "agents-course/course-certificates-of-excellence"
THRESHOLD_SCORE = 45

# Function to check user score
def check_user_score(username):
    score_data = load_dataset(SCORES_DATASET, split="train", download_mode="force_redownload")
    matches = [row for row in score_data if row["username"] == username]
    return matches[0] if matches else None

# Function to check if certificate entry exists
def has_certificate_entry(username):
    cert_data = load_dataset(CERTIFICATES_DATASET, split="train", download_mode="force_redownload")
    return any(row["username"] == username for row in cert_data)

# Function to add certificate entry
def add_certificate_entry(username, name):
    new_entry = {
        "username": username,
        "name": name,
        "date": datetime.now().strftime("%Y-%m-%d"),
    }
    ds = load_dataset(CERTIFICATES_DATASET, split="train")
    ds = ds.add_item(new_entry)
    ds.push_to_hub(CERTIFICATES_DATASET)

# Function to generate certificate PDF
def generate_certificate(name, score):
    """Generate certificate image and PDF."""
    certificate_path = os.path.join(
        os.path.dirname(__file__), "templates", "certificate.png"
    )
    im = Image.open(certificate_path)
    d = ImageDraw.Draw(im)

    name_font = ImageFont.truetype("Quattrocento-Regular.ttf", 100)
    date_font = ImageFont.truetype("Quattrocento-Regular.ttf", 48)

    name = name.title()
    d.text((1000, 740), name, fill="black", anchor="mm", font=name_font)

    d.text((1480, 1170), str(date.today()), fill="black", anchor="mm", font=date_font)

    pdf = im.convert("RGB")
    pdf.save("certificate.pdf")

    return im, "certificate.pdf"

# Main function to handle certificate generation
def handle_certificate(name, profile: gr.OAuthProfile):
    if profile is None:
        return "You must be logged in with your Hugging Face account.", None

    username = profile.username
    user_score = check_user_score(username)

    if not user_score:
        return "You need to complete Unit 4 first.", None

    score = user_score["score"]

    if score < THRESHOLD_SCORE:
        return f"Your score is {score}. You need at least {THRESHOLD_SCORE} to pass.", None

    if not has_certificate_entry(username):
        add_certificate_entry(username, name)

    certificate = generate_certificate(name, score)
    return "Congratulations! Here's your certificate:", certificate

# Gradio interface
with gr.Blocks() as demo:
    gr.Markdown("# 🎓 Unit 4 Certificate Generator")
    gr.LoginButton()
    with gr.Row():
        name_input = gr.Text(label="Enter your name")
    generate_btn = gr.Button("Get my certificate")
    output_text = gr.Textbox(label="Result")
    cert_image = gr.Image(label="Your Certificate")
    cert_file = gr.File(label="Download Certificate (PDF)", file_types=[".pdf"])

    generate_btn.click(
        fn=handle_certificate,
        inputs=[name_input],
        outputs=[output_text, cert_image, cert_file]
    )

demo.launch()