| from datetime import datetime | |
| from functools import partial | |
| import gradio as gr | |
| from . import AUTOTRAIN_BACKEND_API, AUTOTRAIN_TOKEN, AUTOTRAIN_USERNAME, COMPETITION_ID, competition_info | |
| from .errors import PastDeadlineError, SubmissionError, SubmissionLimitError | |
| from .leaderboard import Leaderboard | |
| from .submissions import Submissions | |
| from .text import ( | |
| NO_SUBMISSIONS, | |
| SUBMISSION_LIMIT_REACHED, | |
| SUBMISSION_SELECTION_TEXT, | |
| SUBMISSION_SUCCESS, | |
| SUBMISSION_TEXT, | |
| ) | |
| leaderboard = Leaderboard( | |
| end_date=competition_info.end_date, | |
| eval_higher_is_better=competition_info.eval_higher_is_better, | |
| max_selected_submissions=competition_info.selection_limit, | |
| competition_id=COMPETITION_ID, | |
| autotrain_token=AUTOTRAIN_TOKEN, | |
| ) | |
| submissions = Submissions( | |
| competition_id=competition_info.competition_id, | |
| submission_limit=competition_info.submission_limit, | |
| end_date=competition_info.end_date, | |
| autotrain_username=AUTOTRAIN_USERNAME, | |
| autotrain_token=AUTOTRAIN_TOKEN, | |
| autotrain_backend_api=AUTOTRAIN_BACKEND_API, | |
| ) | |
| def _new_submission(user_token, submission_file): | |
| try: | |
| remaining_subs = submissions.new_submission(user_token, submission_file) | |
| return SUBMISSION_SUCCESS.format(remaining_subs) | |
| except SubmissionLimitError: | |
| return SUBMISSION_LIMIT_REACHED | |
| except SubmissionError: | |
| return "Something went wrong. Please try again later." | |
| def _my_submissions(user_token): | |
| df = submissions.my_submissions(user_token) | |
| if len(df) == 0: | |
| return [ | |
| gr.Markdown.update(visible=True, value=NO_SUBMISSIONS), | |
| gr.DataFrame.update(visible=False), | |
| gr.TextArea.update(visible=False), | |
| gr.Button.update(visible=False), | |
| ] | |
| selected_submission_ids = df[df["selected"] == True]["submission_id"].values.tolist() | |
| if len(selected_submission_ids) > 0: | |
| return [ | |
| gr.Markdown.update(visible=True), | |
| gr.DataFrame.update(visible=True, value=df), | |
| gr.TextArea.update(visible=True, value="\n".join(selected_submission_ids), interactive=True), | |
| gr.Button.update(visible=True), | |
| ] | |
| return [ | |
| gr.Markdown.update(visible=False), | |
| gr.DataFrame.update(visible=True, value=df), | |
| gr.TextArea.update(visible=True, interactive=True), | |
| gr.Button.update(visible=True), | |
| ] | |
| def _update_selected_submissions(user_token, submission_ids): | |
| submission_ids = submission_ids.split("\n") | |
| submission_ids = [sid.strip() for sid in submission_ids] | |
| submission_ids = [sid for sid in submission_ids if len(sid) > 0] | |
| if len(submission_ids) > competition_info.selection_limit: | |
| raise ValueError( | |
| f"You can select only {competition_info.selection_limit} submissions. You selected {len(submission_ids)} submissions." | |
| ) | |
| try: | |
| submissions.update_selected_submissions(user_token, submission_ids) | |
| except PastDeadlineError: | |
| return [ | |
| gr.Markdown.update(visible=True, value="You can no longer select submissions after the deadline."), | |
| gr.DataFrame.update(visible=False), | |
| gr.TextArea.update(visible=False), | |
| gr.Button.update(visible=False), | |
| ] | |
| return _my_submissions(user_token) | |
| def _fetch_leaderboard(private): | |
| if private: | |
| current_date_time = datetime.now() | |
| if current_date_time < competition_info.end_date: | |
| return [ | |
| gr.DataFrame.update(visible=False), | |
| gr.Markdown.update( | |
| visible=True, value="Private Leaderboard will be available after the competition ends" | |
| ), | |
| ] | |
| df = leaderboard.fetch(private=private) | |
| num_teams = len(df) | |
| return [ | |
| gr.DataFrame.update(visible=True, value=df), | |
| gr.Markdown.update(visible=True, value=f"Number of teams: {num_teams}"), | |
| ] | |
| with gr.Blocks() as demo: | |
| with gr.Tabs() as tab_container: | |
| with gr.TabItem("Overview", id="overview"): | |
| gr.Markdown(f"# Welcome to {competition_info.competition_name}! π") | |
| gr.Markdown(f"{competition_info.competition_description}") | |
| gr.Markdown("## Dataset") | |
| gr.Markdown(f"{competition_info.dataset_description}") | |
| with gr.TabItem("Public Leaderboard", id="public_leaderboard") as public_leaderboard: | |
| output_text_public = gr.Markdown() | |
| output_df_public = gr.DataFrame( | |
| row_count=(50, "dynamic"), overflow_row_behaviour="paginate", visible=False | |
| ) | |
| with gr.TabItem("Private Leaderboard", id="private_leaderboard") as private_leaderboard: | |
| output_text_private = gr.Markdown() | |
| output_df_private = gr.DataFrame( | |
| row_count=(50, "dynamic"), overflow_row_behaviour="paginate", visible=False | |
| ) | |
| with gr.TabItem("New Submission", id="new_submission"): | |
| gr.Markdown(SUBMISSION_TEXT.format(competition_info.submission_limit)) | |
| user_token = gr.Textbox( | |
| max_lines=1, value="", label="Please enter your Hugging Face token", type="password" | |
| ) | |
| uploaded_file = gr.File() | |
| output_text = gr.Markdown(visible=True, show_label=False) | |
| new_sub_button = gr.Button("Upload Submission") | |
| new_sub_button.click( | |
| fn=_new_submission, | |
| inputs=[user_token, uploaded_file], | |
| outputs=[output_text], | |
| ) | |
| with gr.TabItem("My Submissions", id="my_submissions"): | |
| gr.Markdown(SUBMISSION_SELECTION_TEXT.format(competition_info.selection_limit)) | |
| user_token = gr.Textbox( | |
| max_lines=1, value="", label="Please enter your Hugging Face token", type="password" | |
| ) | |
| output_text = gr.Markdown(visible=True, show_label=False) | |
| output_df = gr.DataFrame(visible=False) | |
| selected_submissions = gr.TextArea( | |
| visible=False, | |
| label="Selected Submissions (one submission id per line)", | |
| max_lines=competition_info.selection_limit, | |
| lines=competition_info.selection_limit, | |
| ) | |
| update_selected_submissions = gr.Button("Update Selected Submissions", visible=False) | |
| my_subs_button = gr.Button("Fetch Submissions") | |
| my_subs_button.click( | |
| fn=_my_submissions, | |
| inputs=[user_token], | |
| outputs=[output_text, output_df, selected_submissions, update_selected_submissions], | |
| ) | |
| update_selected_submissions.click( | |
| fn=_update_selected_submissions, | |
| inputs=[user_token, selected_submissions], | |
| outputs=[output_text, output_df, selected_submissions, update_selected_submissions], | |
| ) | |
| fetch_lb_partial = partial(_fetch_leaderboard, private=False) | |
| public_leaderboard.select(fetch_lb_partial, inputs=[], outputs=[output_df_public, output_text_public]) | |
| fetch_lb_partial_private = partial(_fetch_leaderboard, private=True) | |
| private_leaderboard.select( | |
| fetch_lb_partial_private, inputs=[], outputs=[output_df_private, output_text_private] | |
| ) | |