File size: 4,568 Bytes
4195ac0
44daadf
4195ac0
bcb4808
4195ac0
0a7c017
35b9d7e
732c892
 
 
4195ac0
5bb2ded
4195ac0
 
2ee56f9
4195ac0
5bb2ded
4195ac0
 
 
 
 
5bb2ded
4195ac0
 
6e9feb9
4195ac0
 
5bb2ded
660c675
a13afb6
 
 
 
 
 
 
4195ac0
 
660c675
a13afb6
4195ac0
a13afb6
 
 
 
 
4195ac0
d9d8e75
4195ac0
35b9d7e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5bb2ded
 
d9d8e75
5bb2ded
4195ac0
 
5bb2ded
4195ac0
 
 
77dd101
4195ac0
 
 
5bb2ded
9b1ede4
4195ac0
570b457
660c675
570b457
4195ac0
48db6cb
5bb2ded
48db6cb
 
29dd10e
 
48db6cb
 
 
 
 
 
 
 
0640418
48db6cb
5bb2ded
4195ac0
e084787
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
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
import gradio as gr
from datasets import load_dataset, Dataset
from datetime import datetime
from datetime import date
import io
import os
from PIL import Image, ImageDraw, ImageFont
from huggingface_hub import login

login(token=os.environ["HUGGINGFACE_TOKEN"])

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

# 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")
    print(username)
    return any(row["username"] == username for row in cert_data)

# Function to add certificate entry
def add_certificate_entry(username, name, score):
    # Load current dataset
    ds = load_dataset(CERTIFICATES_DATASET, split="train", download_mode="force_redownload")
    
    # Remove any existing entry with the same username
    filtered_rows = [row for row in ds if row["username"] != username]

    # Append the updated/new entry
    new_entry = {
        "username": username,
        "score": score,
        "timestamp": datetime.now().isoformat()
    }
    filtered_rows.append(new_entry)

    # Rebuild dataset and push
    updated_ds = Dataset.from_list(filtered_rows)
    updated_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, None

    score = user_score["score"]

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

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

# Gradio interface    
with gr.Blocks() as demo:
    gr.Markdown("# 🎓 Agents Course - Get Your Final Certificate")
    gr.Markdown("Welcome! Follow the steps below to receive your official certificate:")
    gr.Markdown("⚠️ **Note**: Due to high demand, you might experience occasional bugs. If something doesn't work, please try again after a moment!")
    
    with gr.Group():
        gr.Markdown("## ✅ How it works")
        gr.Markdown("""
        1. **Sign in** with your Hugging Face account using the button below.  
        2. **Enter your full name** (this will appear on the certificate).  
        3. Click **'Get My Certificate'** to check your score and download your certificate.
        """)
    gr.Markdown("---")
    gr.Markdown("📝 **Note**: You must have completed [Unit 4](https://huggingface.co/learn/agents-course/unit4/introduction) and your Agent must have scored **above 30** to get your certificate.")

    gr.LoginButton()
    with gr.Row():
        name_input = gr.Text(label="Enter your name (this will appear on the certificate)")
    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()