|
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 sys |
|
import pandas as pd |
|
import json |
|
import shutil |
|
|
|
api = HfApi() |
|
HF_TOKEN = os.environ.get("HF_TOKEN") |
|
|
|
|
|
DATASET_REPO_URL = f"https://wseo:{HF_TOKEN}@huggingface.co/datasets/pseudolab/huggingface-krew-hackathon2023" |
|
CERTIFIED_USERS_FILENAME = "certified.csv" |
|
|
|
ORGANIZATION = "pseudolab" |
|
|
|
|
|
def has_contributions(repo_type, hf_username, organization): |
|
""" |
|
Check if a user has contributions in the specified repository type. |
|
:param repo_type: A repo type supported by the Hub |
|
:param hf_username: HF Hub username |
|
:param organization: HF Hub organization |
|
""" |
|
repo_list = { |
|
'model': api.list_models, |
|
'dataset': api.list_datasets, |
|
'space': api.list_spaces |
|
} |
|
|
|
for repo in repo_list[repo_type](author=organization): |
|
commits = api.list_repo_commits(repo.id, repo_type=repo_type) |
|
if any(hf_username in commit.authors for commit in commits): |
|
return True |
|
return False |
|
|
|
|
|
def get_hub_footprint(hf_username, organization): |
|
""" |
|
Check the types of contributions a user has made. |
|
:param hf_username: HF Hub username |
|
:param organization: HF Hub organization |
|
""" |
|
has_models = has_contributions('model', hf_username, organization) |
|
has_datasets = has_contributions('dataset', hf_username, organization) |
|
has_spaces = has_contributions('space', hf_username, organization) |
|
|
|
return (has_models, has_datasets, has_spaces) |
|
|
|
|
|
def check_if_passed(hf_username): |
|
""" |
|
Check if given user contributed to hackathon |
|
:param hf_username: HF Hub username |
|
""" |
|
|
|
passed = False |
|
certificate_type = "" |
|
|
|
|
|
if all(get_hub_footprint(hf_username, ORGANIZATION)): |
|
passed = True |
|
certificate_type = "excellence" |
|
elif any(get_hub_footprint(hf_username, ORGANIZATION)): |
|
passed = True |
|
certificate_type = "completion" |
|
|
|
return passed, certificate_type |
|
|
|
|
|
def generate_certificate(certificate_template, first_name, last_name, hf_username): |
|
""" |
|
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 |
|
:param hf_username: Hugging Face Hub username entered by user |
|
""" |
|
|
|
im = Image.open(certificate_template) |
|
d = ImageDraw.Draw(im) |
|
|
|
name_font = ImageFont.truetype("HeiseiMinchoStdW7.otf", 60) |
|
username_font = ImageFont.truetype("HeiseiMinchoStdW7.otf", 18) |
|
|
|
name = str(first_name) + " " + str(last_name) |
|
print("NAME", name) |
|
|
|
|
|
|
|
|
|
|
|
|
|
d.text((538, 419), name, fill=(87,87,87), anchor="mm", font=name_font) |
|
|
|
|
|
|
|
|
|
|
|
d.text((815, 327), f"HKH23-{hf_username}", fill=(117,117,117), font=username_font) |
|
|
|
pdf = im.convert('RGB') |
|
pdf.save('certificate.pdf') |
|
|
|
return im, "./certificate.pdf" |
|
|
|
|
|
def create_initial_csv(path): |
|
"""Create an initial CSV file with headers if it doesn't exist.""" |
|
|
|
headers = ['hf_username', 'first_name', 'last_name', 'certificate_type', 'datetime', 'pdf_path'] |
|
|
|
df = pd.DataFrame(columns=headers) |
|
|
|
df.to_csv(path, index=False) |
|
|
|
|
|
def add_certified_user(hf_username, first_name, last_name, certificate_type): |
|
""" |
|
Add the certified user to the dataset and include their certificate PDF. |
|
""" |
|
print("ADD CERTIFIED USER") |
|
repo = Repository(local_dir="data", clone_from=DATASET_REPO_URL) |
|
repo.git_pull() |
|
|
|
csv_full_path = os.path.join("data", CERTIFIED_USERS_FILENAME) |
|
|
|
if not os.path.isfile(csv_full_path): |
|
create_initial_csv(csv_full_path) |
|
|
|
history = pd.read_csv(csv_full_path) |
|
|
|
|
|
check = history.loc[history['hf_username'] == hf_username] |
|
if not check.empty: |
|
history = history.drop(labels=check.index[0], axis=0) |
|
|
|
pdfs_repo_path = os.path.join("data", "pdfs") |
|
|
|
|
|
pdf_repo_filename = f"{hf_username}.pdf" |
|
pdf_repo_path_full = os.path.join(pdfs_repo_path, pdf_repo_filename) |
|
|
|
|
|
os.makedirs(pdfs_repo_path, exist_ok=True) |
|
|
|
shutil.copy('./certificate.pdf', pdf_repo_path_full) |
|
|
|
|
|
new_row = pd.DataFrame({ |
|
'hf_username': hf_username, |
|
'first_name': first_name, |
|
'last_name': last_name, |
|
'certificate_type': certificate_type, |
|
'datetime': time.time(), |
|
'pdf_path': pdf_repo_path_full[5:] |
|
}, index=[0]) |
|
|
|
history = pd.concat([new_row, history[:]]).reset_index(drop=True) |
|
|
|
|
|
history.to_csv(os.path.join("data", CERTIFIED_USERS_FILENAME), index=False) |
|
|
|
|
|
repo.git_add() |
|
repo.push_to_hub(commit_message="Update certified users list and add PDF") |
|
|
|
|
|
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 hf_username: Hugging Face Hub username entered by user |
|
: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, hf_username) |
|
|
|
add_certified_user(hf_username, first_name, last_name, certificate_type) |
|
|
|
message = """ |
|
Congratulations, you successfully completed the 2023 Hackathon π! \n |
|
Since you contributed to models, datasets, and spaces- 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 @wonhseo, @pseudolab and @huggingface) π€ |
|
""" |
|
elif passed and certificate_type == "completion": |
|
|
|
certificate, pdf = generate_certificate("./certificate-completion.png", first_name, last_name, hf_username) |
|
|
|
add_certified_user(hf_username, first_name, last_name, certificate_type) |
|
|
|
message = """ |
|
Congratulations, you successfully completed the 2023 Hackathon π! \n |
|
Since you contributed to at least one model, dataset, or space- 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 @wonhseo, @pseudolab and @huggingface) π€ \n |
|
You can try to get a Certificate of Excellence if you contribute to all types of repos, please don't hesitate to do so. |
|
""" |
|
else: |
|
|
|
certificate = Image.new("RGB", (100, 100), (255, 255, 255)) |
|
pdf = "./fail.pdf" |
|
|
|
message = """ |
|
You didn't pass the minimum of one contribution to get a certificate of completion. |
|
For more information about the certification process, refer to the hackathon page. |
|
If the results here differ from your contributions, make sure you moved your space to the pseudolab organization. |
|
""" |
|
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 2023 Hackathon Certificate π |
|
The certification process is completely free: |
|
- To get a *certificate of completion*: you need to **contribute to at least one model, dataset, or space**. |
|
- To get a *certificate of excellence*: you need to **contribute to models, datasets, and spaces**. *(Yes, all three!)* |
|
|
|
For more information about the certification process [check the hackathon page on certification](https://pseudo-lab.github.io/huggingface-hackathon23/submit.html#certification). |
|
|
|
Don't hesitate to share your certificate on Twitter (tag me [@wonhseo](https://twitter.com/wonhseo), [@pseudolab](https://twitter.com/pseudolab), and [@huggingface](https://twitter.com/huggingface)) and on LinkedIn. |
|
""") |
|
|
|
hf_username = gr.Textbox(placeholder="wseo", label="Your Hugging Face Username (case sensitive)") |
|
first_name = gr.Textbox(placeholder="Wonhyeong", label="Your First Name") |
|
last_name = gr.Textbox(placeholder="Seo", 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) |