simonduerr's picture
Update app.py
a35298e verified
import os
import json
import requests
import time
from github import Github, GithubIntegration
import gradio as gr
app_id = '307916'
owner='duerrsimon'
repo_name='bioicons'
app_key = os.environ.get('GITHUB_TOKEN')
licenses = ['mit', 'cc-by-3.0', 'cc-0', 'cc-by-4.0', 'bsd', 'cc-by-sa-3.0', 'cc-by-sa-4.0']
categories = ["Machine_Learning", "Genetics", "Chemistry", "Scientific_graphs", "Cell_membrane", "Microbiology", "Oncology", "Molecular_modelling", "Intracellular_components", "Cell_types", "Cell_lines", "Plants_Algae", "Chemo-_and_Bioinformatics", "Cell_culture", "Tissues", "Computer_hardware", "Nucleic_acids", "General_items", "Safety_symbols", "Receptors_channels", "Human_physiology", "Animals", "Lab_apparatus", "Blood_Immunology", "Viruses", "Parasites"]
def create_branch(site, branch_name):
return site.create_git_ref(
'refs/heads/{branch_name}'.format(**locals()),
site.get_branch('main').commit.sha
)
def create_pull_request(site,branch_name, github_user):
if github_user!="":
message = f"submitted by: @{github_user}."
else:
message ="No github account provided."
return site.create_pull(
title="New icons submitted via web",
body= message,
base="main",
head=branch_name
)
def remove_special_chars(author):
author = author.replace(" ", "-")
author = author.replace(".", "-")
author = author.replace("(", "-")
author = author.replace(")", "-")
author = author.replace(":", "-")
author = author.replace(";", "-")
author = author.replace(",", "-")
author = author.replace("!", "-")
author = author.replace("?", "-")
author = author.replace("=", "-")
author = author.replace("+", "-")
author = author.replace("/", "-")
return author
def process_and_create_pull(icon_files,category, new_cateogry_check, new_category, license, creator_name, creator_url, copyright, github_user):
git_integration = GithubIntegration(
app_id,
app_key,
)
api = Github(
login_or_token=git_integration.get_access_token(
git_integration.get_repo_installation(owner, repo_name).id
).token
)
site = api.get_repo('duerrsimon/bioicons')
if copyright:
if new_cateogry_check:
category = remove_special_chars(new_category)
hash = '{0:010x}'.format(int(time.time() * 256))[:8]
branch_name = f"new-icons-{hash}"
create_branch(site,branch_name)
authors = requests.get("https://bioicons.com/icons/authors.json").json()
#remove whitespace and other special characters
author = remove_special_chars(creator_name)
if author not in authors.keys():
index_file = site.get_contents('static/icons/authors.json')
authors[author]=creator_url
updated_content = json.dumps(authors, indent=4)
site.update_file(
path='static/icons/authors.json',
message='Insert author',
content=updated_content,
sha=index_file.sha,
branch=branch_name
)
#all_files = []
#contents = site.get_contents("static/icons/{license}/{category}/{author}/")
#print(contents)
#while contents:
# file_content = contents.pop(0)
# if file_content.type == "dir":
# contents.extend(site.get_contents(file_content.path))
# else:
# file = file_content
# all_files.append(str(file).replace('ContentFile(path="','').replace('")',''))
#print("files in directory:", all_files)
for file in icon_files:
#get file content from filesystem
with open(file.name, 'r') as fp:
file_content = fp.read()
filename = os.path.basename(file.name).replace(" ", "_")
git_file = f'static/icons/{license}/{category}/{author}/{filename}'
try:
site.create_file(
path=git_file,
message=f'create {filename}',
content=file_content,
branch=branch_name
)
except Exception as e:
print(e, git_file, "already may exist, trying updating")
contents = site.get_contents(git_file)
site.update_file(
path=git_file,
message=f'update {filename}',
content=file_content,
sha=contents.sha,
branch=branch_name
)
pull = create_pull_request(site,branch_name, github_user)
return f"""<link href="https://cdnjs.cloudflare.com/ajax/libs/flowbite/1.6.4/flowbite.min.css" rel="stylesheet" />
<div class="flex p-4 mb-4 text-sm text-green-800 rounded-lg bg-green-200 " role="alert">
<span class="sr-only">Success</span>
<div>
<span class="font-medium">Thank you!</span> Your pull request for the submitted illustrations has been submitted on GitHub. You can track your submission on Github at <br> <a class="text-green-400 text-lg hover:underline" target="_blank" href="{pull.html_url}">{pull.html_url}</a>.
</div>
</div>
"""
else:
return """<link href="https://cdnjs.cloudflare.com/ajax/libs/flowbite/1.6.4/flowbite.min.css" rel="stylesheet" />
<div class="flex p-4 mb-4 text-sm text-red-800 rounded-lg bg-red-200 dark:bg-gray-800 dark:text-red-400" role="alert">
<svg aria-hidden="true" class="flex-shrink-0 inline w-5 h-5 mr-3" fill="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z" />
</svg>
<span class="sr-only">Info</span>
<div>
<span class="font-medium">Copyright error.</span> You need to certify that the illustrations have a suitable license and that copyright allows to share it on Bioicons.
</div>
</div>
"""
def shownewcategory(new_category, check):
if check:
return gr.Textbox(visible=True)
return gr.Textbox(visible=False)
with gr.Blocks() as demo:
with gr.Row():
creator_name = gr.Textbox(label="Creator")
creator_url = gr.Textbox(label="Creator URL", placeholder="Link to personal website,Twitter,Mastodon, GitHub")
github_user = gr.Textbox(label="Your GitHub Username", placeholder="GitHub username is used to communicate with you")
icon_files = gr.File(label="Icon files", file_types=["svg"], file_count="multiple")
with gr.Row():
category = gr.Dropdown(label="Category", choices=categories)
new_category_check = gr.Checkbox(info="New category?", label="Desired category not listed?")
new_category = gr.Textbox(label="New category", visible=False)
new_category_check.change(fn=shownewcategory, inputs=[new_category,new_category_check], outputs=new_category)
license = gr.Dropdown(label="License", choices=licenses)
copyright = gr.Checkbox(info="Copyright", label="I certify that I own the copyright of the submitted illustrations or have appropriately credited the original creator as required by the license of the illustration.")
btn = gr.Button(value="Submit illustrations")
output = gr.HTML(label="Output", value="")
btn.click(process_and_create_pull, inputs=[icon_files,category, new_category_check, new_category, license, creator_name, creator_url, copyright, github_user], outputs=output, api_name="bioicons-submit")
demo.launch()