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()
|