| | 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") |
| |
|
| | |
| | DATASET_REPO_URL = "https://huggingface.co/datasets/MariaK/audio-course" |
| | CERTIFIED_USERS_FILENAME = "usernames.csv" |
| |
|
| | |
| | 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) |
| | |
| | |
| | |
| | |
| | |
| | |
| | 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" |
| |
|
| |
|
| | 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 = 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": |
| | |
| | certificate, pdf = generate_certificate("./certificate-excellence.png", first_name, last_name) |
| | |
| | add_certified_user(hf_username, first_name, last_name, certificate_type) |
| | |
| | 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": |
| | |
| | certificate, pdf = generate_certificate("./certificate-completion.png", first_name, last_name) |
| | |
| | add_certified_user(hf_username, first_name, last_name, certificate_type) |
| | |
| | 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: |
| | |
| | certificate = Image.new("RGB", (100, 100), (255, 255, 255)) |
| | pdf = "./fail.pdf" |
| | |
| | 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, refer to Unit 8 of the course. To see what hands-on you still need to complete, use the self-evaluation space linked in the description above. |
| | 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). |
| | |
| | To check which assignments you still need to complete, use the [self-evaluation space](https://huggingface.co/spaces/MariaK/Check-my-progress-Audio-Course). |
| | |
| | Don't hesitate to share your certificate on Twitter (tag me [@mariakhalusova](https://twitter.com/mariaKhalusova) and [@huggingface](https://twitter.com/huggingface)) and on LinkedIn. |
| | """) |
| | |
| | hf_username = gr.Textbox(placeholder="MariaK", label="Your Hugging Face Username (case sensitive)") |
| | first_name = gr.Textbox(placeholder="Maria", label="Your First Name") |
| | last_name = gr.Textbox(placeholder="Khalusova", 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) |