File size: 2,170 Bytes
63bdadc 3edbc93 63bdadc 9021dc4 63bdadc eb50e2e 3edbc93 50e75cf b2a1e67 92d0002 8f9985e eb50e2e 8f9985e 3edbc93 63bdadc 8f9985e 3edbc93 eb50e2e 8f9985e eb50e2e 8f9985e 63bdadc 813ce52 63bdadc 8f9985e 3edbc93 8f9985e b2a1e67 63bdadc 9021dc4 813ce52 63bdadc 9021dc4 63bdadc 92d0002 459ba9d 8f9985e 63bdadc 8f9985e 63bdadc eb50e2e 63bdadc 8f9985e 63bdadc 3edbc93 63bdadc 3edbc93 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
from pathlib import Path
import tempfile
from typing import BinaryIO
import json
import gradio as gr
from datetime import datetime
import uuid
from constants import API, SUBMISSIONS_REPO
from validation import validate_csv_file
def make_submission(
submitted_file: BinaryIO,
user_state,
anonymous_state,
submission_type: str = "GDPa1",
):
if user_state is None:
raise gr.Error("You must submit your username to submit a file.")
if submitted_file is None:
raise gr.Error("Please upload a CSV file before submitting.")
file_path = submitted_file.name
if not file_path:
raise gr.Error("Uploaded file object does not have a valid file path.")
path_obj = Path(file_path)
if path_obj.suffix.lower() != ".csv":
raise gr.Error("File must be a CSV file. Please upload a .csv file.")
timestamp = datetime.utcnow().isoformat()
submission_id = str(uuid.uuid4())
with path_obj.open("rb") as f_in:
file_content = f_in.read().decode("utf-8")
validate_csv_file(file_content, submission_type)
# write to dataset
filename = f"{submission_id}.json"
# Note: This may be represented as Parquet in the future, so the schema needs to stay consistent
record = {
"submission_id": submission_id,
"submission_filename": filename,
"submission_time": timestamp,
"evaluated": False,
"user": user_state,
"anonymous": anonymous_state,
"csv_content": file_content,
}
with tempfile.NamedTemporaryFile(mode="w", suffix=".json", delete=False) as tmp:
json.dump(record, tmp, indent=2)
tmp.flush()
tmp_name = tmp.name
API.upload_file(
path_or_fileobj=tmp_name,
path_in_repo=filename,
repo_id=SUBMISSIONS_REPO,
repo_type="dataset",
commit_message=f"Add submission for {user_state} at {timestamp}",
)
Path(tmp_name).unlink()
return "✅ Your submission has been received! Sit tight and your scores will appear on the leaderboard shortly."
|