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""" """ else: return """ """ 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()