File size: 4,569 Bytes
10e9b7d
a59ff5c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e80aab9
a59ff5c
 
e80aab9
a59ff5c
 
 
 
 
 
 
 
 
 
 
 
e80aab9
a59ff5c
 
 
 
e80aab9
a59ff5c
 
e80aab9
a59ff5c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e80aab9
 
a59ff5c
 
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
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()