simonduerr's picture
Update app.py
a35298e verified
raw
history blame contribute delete
No virus
7.79 kB
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()