burtenshaw
generalize application for any course
75075b9
raw
history blame
5.84 kB
import os
import requests
from io import BytesIO
from datetime import date
import gradio as gr
from PIL import Image, ImageDraw, ImageFont
from huggingface_hub import whoami
from criteria import check_certification as check_certification_criteria
from org import join_finishers_org
def download_profile_picture(profile_url: str):
"""Download profile picture from URL."""
response = requests.get(profile_url)
return Image.open(BytesIO(response.content))
def generate_certificate(
certificate_path: str, first_name: str, last_name: str, profile_url: str
):
"""Generate certificate image and PDF."""
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 = f"{first_name} {last_name}"
# Capitalize first letter of each name
name = name.title()
# Add name
d.text((1000, 740), name, fill="black", anchor="mm", font=name_font)
# Add profile picture just below the name
profile_img = download_profile_picture(profile_url)
profile_img = profile_img.resize((100, 100))
im.paste(im=profile_img, box=(350, 700))
# Add date
d.text((1480, 1170), str(date.today()), fill="black", anchor="mm", font=date_font)
# Save PDF
pdf = im.convert("RGB")
pdf.save("certificate.pdf")
return im, "./certificate.pdf"
def get_user_info(oauth_token):
"""Get user info from HF token."""
if oauth_token is None:
return None, None, None, None
try:
user_info = whoami(oauth_token.token)
username = user_info["name"]
name_parts = user_info["fullname"].split(" ", 1)
first_name = name_parts[0]
last_name = name_parts[1] if len(name_parts) > 1 else ""
profile_url = user_info["avatarUrl"]
return username, first_name, last_name, profile_url
except:
return None, None, None, None
def create_linkedin_button(username: str) -> str:
"""Create LinkedIn 'Add to Profile' button HTML."""
current_year = date.today().year
current_month = date.today().month
# URL encode the certificate URL
cert_url = "https://huggingface.co./agents-course-finishers"
linkedin_params = {
"startTask": "CERTIFICATION_NAME",
"name": "Hugging Face Course Certificate",
# "organizationId": "40479", # Hugging Face's LinkedIn Organization ID
"organizationName": "Hugging Face",
"issueYear": str(current_year),
"issueMonth": str(current_month),
"certUrl": cert_url,
"certId": username, # Using username as cert ID
}
# Build the LinkedIn button URL
base_url = "https://www.linkedin.com/profile/add?"
params = "&".join(
f"{k}={requests.utils.quote(v)}" for k, v in linkedin_params.items()
)
button_url = base_url + params
return f"""
<a href="{button_url}" target="_blank" style="display: block; margin-top: 20px; text-align: center;">
<img src="https://download.linkedin.com/desktop/add2profile/buttons/en_US.png"
alt="LinkedIn Add to Profile button">
</a>
"""
def check_certification(token: gr.OAuthToken | None):
"""Check certification status for logged-in user."""
if token is None:
gr.Warning("Please log in to Hugging Face before checking certification!")
return None, None, None, gr.Row.update(visible=False)
username, first_name, last_name, profile_url = get_user_info(token)
if not username:
return (
"Please login with your Hugging Face account to check certification status",
None,
None,
gr.Row.update(visible=False),
)
# Check certification criteria
result = check_certification_criteria(username)
# Generate certificate if passed
if result.passed and result.certificate_path:
certificate_img, pdf_path = generate_certificate(
certificate_path=result.certificate_path,
first_name=first_name,
last_name=last_name,
profile_url=profile_url,
)
# Add LinkedIn button for passed certificates
linkedin_button = create_linkedin_button(username)
result_message = f"{result.message}\n\n{linkedin_button}"
else:
certificate_img = None
pdf_path = None
result_message = result.message
return (
gr.update(visible=True, value=result_message, label="Grade"),
gr.update(visible=result.passed, value=pdf_path, label="Download Certificate"),
gr.update(visible=result.passed, value=certificate_img, label="Certificate"),
)
def create_gradio_interface():
"""Create Gradio web interface with OAuth login."""
with gr.Blocks() as demo:
gr.Markdown("""
# Get your Hugging Face Course Certificate 🎓
The certification process is completely free.
To receive your certificate, you need to **pass 80% of the quiz**.
There's **no deadlines, the course is self-paced**.
Don't hesitate to share your certificate on Twitter
(tag @huggingface) and on Linkedin.
""")
# Add login button
gr.LoginButton()
check_progress_button = gr.Button(value="Check My Progress")
output_text = gr.Markdown(visible=False, sanitize_html=False)
output_img = gr.Image(type="pil", visible=False)
output_pdf = gr.File(visible=False)
check_progress_button.click(
fn=check_certification,
outputs=[output_text, output_pdf, output_img],
).then(
fn=join_finishers_org,
)
return demo
if __name__ == "__main__":
demo = create_gradio_interface()
demo.launch(debug=True)