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."