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