import gradio as gr from huggingface_hub import HfApi, hf_hub_download, Repository from huggingface_hub.repocard import metadata_load from gradio_client import Client from PIL import Image, ImageDraw, ImageFont from datetime import date import time import os import pandas as pd import json api = HfApi() HF_TOKEN = os.environ.get("HF_TOKEN") # Private dataset repo containing the list of already certified users DATASET_REPO_URL = "https://huggingface.co/datasets/MariaK/audio-course" CERTIFIED_USERS_FILENAME = "usernames.csv" # Private space to check if a user has passed. SPACE_ID = "MariaK/Check-Audio-Course-Progress" def check_if_passed(username): """ Check if given user passed enough assignments :param username: User HF username """ passed = False certificate_type = "" client = Client(SPACE_ID, hf_token=HF_TOKEN) result = client.predict(username, fn_index=0) with open(result) as json_data: data = json.load(json_data) df = pd.DataFrame(data['data']) if len(df[df.iloc[:,0] == '✅']) == 4: passed = True certificate_type = "excellence" elif len(df[df.iloc[:,0] == '✅']) == 3: passed = True certificate_type = "completion" return passed, certificate_type def generate_certificate(certificate_template, first_name, last_name): """ Generates certificate from the template :param certificate_template: type of the certificate to generate :param first_name: first name entered by user :param last_name: last name entered by user """ im = Image.open(certificate_template) d = ImageDraw.Draw(im) name_font = ImageFont.truetype("Quattrocento-Regular.ttf", 100) date_font = ImageFont.truetype("Quattrocento-Regular.ttf", 48) name = str(first_name) + " " + str(last_name) print("NAME", name) # Debug line name #d.line(((200, 740), (1800, 740)), "gray") #d.line(((1000, 0), (1000, 1400)), "gray") # Name d.text((1000, 740), name, fill="black", anchor="mm", font=name_font) # Debug line date #d.line(((1500, 0), (1500, 1400)), "gray") # Date of certification 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" def add_certified_user(hf_username, first_name, last_name, certificate_type): """ Add the certified user to the database """ print("ADD CERTIFIED USER") repo = Repository(local_dir="usernames", clone_from=DATASET_REPO_URL, use_auth_token=HF_TOKEN) repo.git_pull() history = pd.read_csv(os.path.join("usernames", CERTIFIED_USERS_FILENAME)) # Check if this hf_username is already in our dataset: check = history.loc[history['hf_username'] == hf_username] if not check.empty: history = history.drop(labels=check.index[0], axis=0) new_row = pd.DataFrame({'hf_username': hf_username, 'first_name': first_name, 'last_name': last_name, 'certificate_type': certificate_type, 'datetime': time.time()}, index=[0]) history = pd.concat([new_row, history[:]]).reset_index(drop=True) history.to_csv(os.path.join("usernames", CERTIFIED_USERS_FILENAME), index=False) repo.push_to_hub(commit_message="Update certified users list") def create_certificate(passed, certificate_type, hf_username, first_name, last_name): """ Generates certificate, adds message, saves username of the certified user :param passed: boolean whether the user passed enough assignments :param certificate_type: type of the certificate - completion or excellence :param first_name: first name entered by user :param last_name: last name entered by user """ if passed and certificate_type == "excellence": # Generate a certificate of certificate, pdf = generate_certificate("./certificate-excellence.png", first_name, last_name) # Add this user to our database add_certified_user(hf_username, first_name, last_name, certificate_type) # Add a message message = """ Congratulations, you successfully completed the Hugging Face Audio Course 🎉! \n Since you pass 100% of the hands-on you get a Certificate of Excellence 🎓. \n You can download your certificate below ⬇️ \n Don't hesitate to share your certificate image below on Twitter and Linkedin (you can tag me @mariakhalusova and @huggingface) 🤗 """ elif passed and certificate_type == "completion": # Generate a certificate of completion certificate, pdf = generate_certificate("./certificate-completion.png", first_name, last_name) # Add this user to our database add_certified_user(hf_username, first_name, last_name, certificate_type) # Add a message message = """ Congratulations, you successfully completed the Hugging Face Audio Course 🎉! \n Since you pass 3 out of 4 of the hands-on you get a Certificate of Completion 🎓. \n You can download your certificate below ⬇️ \n Don't hesitate to share your certificate image below on Twitter and Linkedin (you can tag me @mariakhalusova and @huggingface) 🤗 \n You can try to get a Certificate of Excellence if you pass 100% of the hands-on, don't hesitate to check which unit you didn't pass and update these models. """ else: # Not passed yet certificate = Image.new("RGB", (100, 100), (255, 255, 255)) pdf = "./fail.pdf" # Add a message message = """ You didn't pass the minimum of 3 out of 4 of the hands-on to get a certificate of completion. For more information about the certification process check the course page on certification. Use the self-evaluation space to see which assignments have not been completed. If the results here differ from your results in the self-evaluation space, make sure that your model's metrics automatically uploaded by Trainer have not been manually altered. """ return certificate, message, pdf def certification(hf_username, first_name, last_name): passed, certificate_type = check_if_passed(hf_username) certificate, message, pdf = create_certificate(passed, certificate_type, hf_username, first_name, last_name) print("MESSAGE", message) if passed: visible = True else: visible = False return message, pdf, certificate, output_row.update(visible=visible) with gr.Blocks() as demo: gr.Markdown(f""" # Get your Hugging Face Audio Course Certificate 🎓 The certification process is completely free: - To get a *certificate of completion*: you need to **pass 3 out of 4 hands-on assignments**. - To get a *certificate of excellence*: you need to **pass 4 out of 4 hands-on assignments**. For more information about the certification process [check the course page on certification](https://huggingface.co/learn/audio-course/chapter8/certification). Don't hesitate to share your certificate on Twitter (tag me @mariakhalusova and @huggingface) and on LinkedIn. """) hf_username = gr.Textbox(placeholder="MariaK", label="Your Hugging Face Username (case sensitive)") first_name = gr.Textbox(placeholder="Jane", label="Your First Name") last_name = gr.Textbox(placeholder="Doe", label="Your Last Name") check_progress_button = gr.Button(value="Check if I pass and get the certificate") output_text = gr.components.Textbox() with gr.Row(visible=True) as output_row: output_pdf = gr.File() output_img = gr.components.Image(type="pil") check_progress_button.click(fn=certification, inputs=[hf_username, first_name, last_name], outputs=[output_text, output_pdf, output_img, output_row]) demo.launch(debug=True)