xcpcio 0.64.5__tar.gz → 0.65.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of xcpcio might be problematic. Click here for more details.
- {xcpcio-0.64.5 → xcpcio-0.65.0}/PKG-INFO +1 -1
- {xcpcio-0.64.5 → xcpcio-0.65.0}/tests/test_contest.py +6 -6
- {xcpcio-0.64.5 → xcpcio-0.65.0}/tests/test_submission.py +6 -5
- {xcpcio-0.64.5 → xcpcio-0.65.0}/tests/test_team.py +6 -6
- {xcpcio-0.64.5 → xcpcio-0.65.0}/tests/test_types.py +20 -20
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/__version__.py +1 -1
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/types.py +60 -26
- {xcpcio-0.64.5 → xcpcio-0.65.0}/.gitignore +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/.python-version +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/README.md +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/pyproject.toml +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/scripts/generate_ccs_models.sh +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/tests/__init__.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/uv.lock +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/__init__.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/api/__init__.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/api/client.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/api/models.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/app/clics_archiver.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/app/clics_server.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/clics/__init__.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/clics/api_server/__init__.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/clics/api_server/app.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/clics/api_server/dependencies.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/clics/api_server/routes/__init__.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/clics/api_server/routes/access.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/clics/api_server/routes/accounts.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/clics/api_server/routes/awards.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/clics/api_server/routes/clarifications.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/clics/api_server/routes/contests.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/clics/api_server/routes/general.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/clics/api_server/routes/groups.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/clics/api_server/routes/judgement_types.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/clics/api_server/routes/judgements.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/clics/api_server/routes/languages.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/clics/api_server/routes/organizations.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/clics/api_server/routes/problems.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/clics/api_server/routes/runs.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/clics/api_server/routes/submissions.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/clics/api_server/routes/teams.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/clics/api_server/server.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/clics/api_server/services/__init__.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/clics/api_server/services/contest_service.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/clics/base/__init__.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/clics/base/types.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/clics/clics_api_client.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/clics/contest_archiver.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/clics/model/__init__.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/clics/model/model_2023_06/__init__.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/clics/model/model_2023_06/model.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/clics/reader/__init__.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/clics/reader/contest_package_reader.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/clics/reader/interface.py +0 -0
- {xcpcio-0.64.5 → xcpcio-0.65.0}/xcpcio/constants.py +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from xcpcio import constants
|
|
2
|
-
from xcpcio.types import
|
|
2
|
+
from xcpcio.types import BalloonColor, Contest, ContestOptions, Image
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
class TestContest:
|
|
@@ -89,8 +89,8 @@ class TestContest:
|
|
|
89
89
|
def test_contest_with_colors_and_images(self):
|
|
90
90
|
"""Test Contest with balloon colors, logo, and banner"""
|
|
91
91
|
colors = [
|
|
92
|
-
|
|
93
|
-
|
|
92
|
+
BalloonColor(color="#fff", background_color="rgba(255, 0, 0, 0.7)"),
|
|
93
|
+
BalloonColor(color="#000", background_color="rgba(0, 255, 0, 0.7)"),
|
|
94
94
|
]
|
|
95
95
|
logo = Image(url="https://example.com/logo.png", type="png")
|
|
96
96
|
banner = Image(url="https://example.com/banner.jpg", type="jpg")
|
|
@@ -119,7 +119,7 @@ class TestContest:
|
|
|
119
119
|
assert contest.balloon_color is None
|
|
120
120
|
|
|
121
121
|
# Add first color
|
|
122
|
-
red_color =
|
|
122
|
+
red_color = BalloonColor(color="#fff", background_color="red")
|
|
123
123
|
contest.append_balloon_color(red_color)
|
|
124
124
|
|
|
125
125
|
assert contest.balloon_color is not None
|
|
@@ -127,7 +127,7 @@ class TestContest:
|
|
|
127
127
|
assert contest.balloon_color[0] == red_color
|
|
128
128
|
|
|
129
129
|
# Add second color
|
|
130
|
-
blue_color =
|
|
130
|
+
blue_color = BalloonColor(color="#fff", background_color="blue")
|
|
131
131
|
contest.append_balloon_color(blue_color)
|
|
132
132
|
|
|
133
133
|
assert len(contest.balloon_color) == 2
|
|
@@ -165,7 +165,7 @@ class TestContest:
|
|
|
165
165
|
|
|
166
166
|
assert contest.balloon_color is not None
|
|
167
167
|
assert len(contest.balloon_color) == 3
|
|
168
|
-
assert all(isinstance(color,
|
|
168
|
+
assert all(isinstance(color, BalloonColor) for color in contest.balloon_color)
|
|
169
169
|
|
|
170
170
|
# Check first few default colors
|
|
171
171
|
assert contest.balloon_color[0].background_color == "rgba(189, 14, 14, 0.7)"
|
|
@@ -3,7 +3,7 @@ import json
|
|
|
3
3
|
import pytest
|
|
4
4
|
|
|
5
5
|
from xcpcio import constants
|
|
6
|
-
from xcpcio.types import
|
|
6
|
+
from xcpcio.types import SubmissionReaction, Submission, Submissions
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
class TestSubmission:
|
|
@@ -12,7 +12,8 @@ class TestSubmission:
|
|
|
12
12
|
def test_submission_creation_defaults(self):
|
|
13
13
|
"""Test Submission creation with default values"""
|
|
14
14
|
submission = Submission()
|
|
15
|
-
assert submission.id
|
|
15
|
+
assert submission.id is None
|
|
16
|
+
assert submission.submission_id is None
|
|
16
17
|
assert submission.team_id == ""
|
|
17
18
|
assert submission.problem_id == 0
|
|
18
19
|
assert submission.timestamp == 0
|
|
@@ -24,7 +25,7 @@ class TestSubmission:
|
|
|
24
25
|
|
|
25
26
|
def test_submission_creation_with_values(self):
|
|
26
27
|
"""Test Submission creation with provided values"""
|
|
27
|
-
reaction =
|
|
28
|
+
reaction = SubmissionReaction(url="https://reaction.com/video.mp4")
|
|
28
29
|
submission = Submission(
|
|
29
30
|
id="sub_001",
|
|
30
31
|
status=constants.SUBMISSION_STATUS_ACCEPTED,
|
|
@@ -79,7 +80,7 @@ class TestSubmission:
|
|
|
79
80
|
|
|
80
81
|
def test_submission_with_reaction_serialization(self):
|
|
81
82
|
"""Test Submission with Reaction serialization"""
|
|
82
|
-
reaction =
|
|
83
|
+
reaction = SubmissionReaction(url="https://example.com/reaction.mp4")
|
|
83
84
|
submission = Submission(
|
|
84
85
|
id="sub_003",
|
|
85
86
|
status=constants.SUBMISSION_STATUS_ACCEPTED,
|
|
@@ -125,7 +126,7 @@ class TestSubmissions:
|
|
|
125
126
|
timestamp=1234567891,
|
|
126
127
|
time=300,
|
|
127
128
|
language="C++",
|
|
128
|
-
reaction=
|
|
129
|
+
reaction=SubmissionReaction(url="https://reaction.com/video.mp4"),
|
|
129
130
|
),
|
|
130
131
|
Submission(
|
|
131
132
|
id="sub_003",
|
|
@@ -15,7 +15,7 @@ class TestTeam:
|
|
|
15
15
|
assert team.name == ""
|
|
16
16
|
assert team.organization == ""
|
|
17
17
|
assert team.members is None
|
|
18
|
-
assert team.
|
|
18
|
+
assert team.coaches is None
|
|
19
19
|
assert team.location is None
|
|
20
20
|
assert team.group == []
|
|
21
21
|
assert team.extra == {}
|
|
@@ -27,7 +27,7 @@ class TestTeam:
|
|
|
27
27
|
name="Test Team",
|
|
28
28
|
organization="Test University",
|
|
29
29
|
members=["Alice", "Bob", "Charlie"],
|
|
30
|
-
|
|
30
|
+
coaches="Dr. Smith",
|
|
31
31
|
location="Building A",
|
|
32
32
|
)
|
|
33
33
|
|
|
@@ -35,7 +35,7 @@ class TestTeam:
|
|
|
35
35
|
assert team.name == "Test Team"
|
|
36
36
|
assert team.organization == "Test University"
|
|
37
37
|
assert team.members == ["Alice", "Bob", "Charlie"]
|
|
38
|
-
assert team.
|
|
38
|
+
assert team.coaches == "Dr. Smith"
|
|
39
39
|
assert team.location == "Building A"
|
|
40
40
|
|
|
41
41
|
def test_group_management(self):
|
|
@@ -75,7 +75,7 @@ class TestTeamSerialization:
|
|
|
75
75
|
name="Alpha Team",
|
|
76
76
|
organization="University A",
|
|
77
77
|
members=["Alice", "Bob", "Charlie"],
|
|
78
|
-
|
|
78
|
+
coaches="Dr. Smith",
|
|
79
79
|
location="Building A",
|
|
80
80
|
group=["undergraduate", "local"],
|
|
81
81
|
extra={"room": "101", "contact": "alice@test.edu"},
|
|
@@ -90,7 +90,7 @@ class TestTeamSerialization:
|
|
|
90
90
|
assert team_dict["name"] == "Alpha Team"
|
|
91
91
|
assert team_dict["organization"] == "University A"
|
|
92
92
|
assert team_dict["members"] == ["Alice", "Bob", "Charlie"]
|
|
93
|
-
assert team_dict["
|
|
93
|
+
assert team_dict["coaches"] == "Dr. Smith"
|
|
94
94
|
assert team_dict["location"] == "Building A"
|
|
95
95
|
assert team_dict["group"] == ["undergraduate", "local"]
|
|
96
96
|
assert team_dict["extra"] == {"room": "101", "contact": "alice@test.edu"}
|
|
@@ -161,7 +161,7 @@ class TestTeamList:
|
|
|
161
161
|
name="Alpha Team",
|
|
162
162
|
organization="University A",
|
|
163
163
|
members=["Alice", "Bob"],
|
|
164
|
-
|
|
164
|
+
coaches="Coach A",
|
|
165
165
|
),
|
|
166
166
|
Team(
|
|
167
167
|
id="team002",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from xcpcio import constants
|
|
2
|
-
from xcpcio.types import
|
|
2
|
+
from xcpcio.types import BalloonColor, ContestOptions, Image, SubmissionReaction
|
|
3
3
|
|
|
4
4
|
|
|
5
5
|
class TestImage:
|
|
@@ -35,18 +35,18 @@ class TestImage:
|
|
|
35
35
|
assert reconstructed_image == image
|
|
36
36
|
|
|
37
37
|
|
|
38
|
-
class
|
|
39
|
-
"""Test cases for
|
|
38
|
+
class TestBalloonColor:
|
|
39
|
+
"""Test cases for BalloonColor Pydantic model"""
|
|
40
40
|
|
|
41
41
|
def test_color_creation(self):
|
|
42
|
-
"""Test
|
|
43
|
-
color =
|
|
42
|
+
"""Test BalloonColor creation"""
|
|
43
|
+
color = BalloonColor(color="#ffffff", background_color="#000000")
|
|
44
44
|
assert color.color == "#ffffff"
|
|
45
45
|
assert color.background_color == "#000000"
|
|
46
46
|
|
|
47
47
|
def test_color_serialization(self):
|
|
48
|
-
"""Test
|
|
49
|
-
color =
|
|
48
|
+
"""Test BalloonColor serialization and deserialization"""
|
|
49
|
+
color = BalloonColor(color="red", background_color="blue")
|
|
50
50
|
|
|
51
51
|
# Test model_dump
|
|
52
52
|
color_dict = color.model_dump()
|
|
@@ -55,7 +55,7 @@ class TestColor:
|
|
|
55
55
|
|
|
56
56
|
# Test JSON round-trip
|
|
57
57
|
color_json = color.model_dump_json()
|
|
58
|
-
reconstructed_color =
|
|
58
|
+
reconstructed_color = BalloonColor.model_validate_json(color_json)
|
|
59
59
|
assert reconstructed_color == color
|
|
60
60
|
|
|
61
61
|
|
|
@@ -96,22 +96,22 @@ class TestContestOptions:
|
|
|
96
96
|
assert reconstructed_options == options
|
|
97
97
|
|
|
98
98
|
|
|
99
|
-
class
|
|
100
|
-
"""Test cases for
|
|
99
|
+
class TestSubmissionReaction:
|
|
100
|
+
"""Test cases for SubmissionReaction Pydantic model"""
|
|
101
101
|
|
|
102
102
|
def test_reaction_empty(self):
|
|
103
|
-
"""Test
|
|
104
|
-
reaction =
|
|
103
|
+
"""Test SubmissionReaction with default values"""
|
|
104
|
+
reaction = SubmissionReaction()
|
|
105
105
|
assert reaction.url is None
|
|
106
106
|
|
|
107
107
|
def test_reaction_with_url(self):
|
|
108
|
-
"""Test
|
|
109
|
-
reaction =
|
|
108
|
+
"""Test SubmissionReaction with URL"""
|
|
109
|
+
reaction = SubmissionReaction(url="https://reaction.com/video.mp4")
|
|
110
110
|
assert reaction.url == "https://reaction.com/video.mp4"
|
|
111
111
|
|
|
112
112
|
def test_reaction_serialization(self):
|
|
113
|
-
"""Test
|
|
114
|
-
reaction =
|
|
113
|
+
"""Test SubmissionReaction serialization"""
|
|
114
|
+
reaction = SubmissionReaction(url="https://test.com/reaction.mp4")
|
|
115
115
|
|
|
116
116
|
# Test model_dump
|
|
117
117
|
reaction_dict = reaction.model_dump()
|
|
@@ -119,17 +119,17 @@ class TestReaction:
|
|
|
119
119
|
|
|
120
120
|
# Test JSON round-trip
|
|
121
121
|
reaction_json = reaction.model_dump_json()
|
|
122
|
-
reconstructed_reaction =
|
|
122
|
+
reconstructed_reaction = SubmissionReaction.model_validate_json(reaction_json)
|
|
123
123
|
assert reconstructed_reaction == reaction
|
|
124
124
|
|
|
125
125
|
def test_reaction_no_url_serialization(self):
|
|
126
|
-
"""Test
|
|
127
|
-
reaction =
|
|
126
|
+
"""Test SubmissionReaction serialization with no URL"""
|
|
127
|
+
reaction = SubmissionReaction()
|
|
128
128
|
|
|
129
129
|
reaction_dict = reaction.model_dump()
|
|
130
130
|
assert reaction_dict["url"] is None
|
|
131
131
|
|
|
132
132
|
# Test JSON round-trip
|
|
133
133
|
reaction_json = reaction.model_dump_json()
|
|
134
|
-
reconstructed_reaction =
|
|
134
|
+
reconstructed_reaction = SubmissionReaction.model_validate_json(reaction_json)
|
|
135
135
|
assert reconstructed_reaction == reaction
|
|
@@ -61,9 +61,28 @@ SubmissionStatus = Literal[
|
|
|
61
61
|
ImagePreset = Literal["ICPC", "CCPC", "HUNAN_CPC"]
|
|
62
62
|
MedalPreset = Literal["ccpc", "icpc"]
|
|
63
63
|
BannerMode = Literal["ONLY_BANNER", "ALL"]
|
|
64
|
+
Lang = Literal["en", "zh-CN"]
|
|
64
65
|
DateTimeISO8601String = str
|
|
65
66
|
|
|
66
67
|
|
|
68
|
+
class I18NStringSet(BaseModel):
|
|
69
|
+
fallback: Optional[str] = None
|
|
70
|
+
fallback_lang: Optional[Lang] = None
|
|
71
|
+
texts: Optional[Dict[Lang, str]] = None
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
Text = Union[str, I18NStringSet]
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
class Person(BaseModel):
|
|
78
|
+
name: Text
|
|
79
|
+
cf_id: Optional[str] = None
|
|
80
|
+
icpc_id: Optional[str] = None
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
Persons = List[Person]
|
|
84
|
+
|
|
85
|
+
|
|
67
86
|
class Image(BaseModel):
|
|
68
87
|
url: Optional[str] = None
|
|
69
88
|
base64: Optional[str] = None
|
|
@@ -71,20 +90,33 @@ class Image(BaseModel):
|
|
|
71
90
|
preset: Optional[ImagePreset] = None
|
|
72
91
|
|
|
73
92
|
|
|
74
|
-
class
|
|
93
|
+
class BalloonColor(BaseModel):
|
|
75
94
|
color: str
|
|
76
95
|
background_color: str
|
|
77
96
|
|
|
78
97
|
|
|
79
|
-
class
|
|
98
|
+
class Problem(BaseModel):
|
|
99
|
+
id: str
|
|
100
|
+
label: str
|
|
101
|
+
name: Optional[Text] = None
|
|
102
|
+
time_limit: Optional[str] = None
|
|
103
|
+
memory_limit: Optional[str] = None
|
|
104
|
+
balloon_color: Optional[BalloonColor] = None
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
Problems = List[Problem]
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
class SubmissionReaction(BaseModel):
|
|
80
111
|
url: Optional[str] = None
|
|
81
112
|
|
|
82
113
|
|
|
83
114
|
class Submission(BaseModel):
|
|
84
|
-
id: str =
|
|
115
|
+
id: Optional[str] = None
|
|
116
|
+
submission_id: Optional[str] = None
|
|
85
117
|
|
|
86
118
|
team_id: str = ""
|
|
87
|
-
problem_id: int = 0
|
|
119
|
+
problem_id: Union[int, str] = 0
|
|
88
120
|
timestamp: int = 0 # unit: seconds
|
|
89
121
|
status: SubmissionStatus = constants.SUBMISSION_STATUS_UNKNOWN
|
|
90
122
|
|
|
@@ -93,7 +125,7 @@ class Submission(BaseModel):
|
|
|
93
125
|
|
|
94
126
|
is_ignore: Optional[bool] = None
|
|
95
127
|
|
|
96
|
-
reaction: Optional[
|
|
128
|
+
reaction: Optional[SubmissionReaction] = None
|
|
97
129
|
|
|
98
130
|
|
|
99
131
|
class Submissions(RootModel[List[Submission]]):
|
|
@@ -102,14 +134,14 @@ class Submissions(RootModel[List[Submission]]):
|
|
|
102
134
|
|
|
103
135
|
class Team(BaseModel):
|
|
104
136
|
id: str = ""
|
|
105
|
-
name:
|
|
137
|
+
name: Text = ""
|
|
106
138
|
|
|
107
139
|
organization: str = ""
|
|
108
140
|
group: List[str] = Field(default_factory=list)
|
|
109
141
|
tag: List[str] = Field(default_factory=list)
|
|
110
142
|
|
|
111
|
-
|
|
112
|
-
members: Optional[List[
|
|
143
|
+
coaches: Optional[Union[Text, List[Text], Persons]] = None
|
|
144
|
+
members: Optional[Union[Text, List[Text], Persons]] = None
|
|
113
145
|
|
|
114
146
|
badge: Optional[Image] = None
|
|
115
147
|
|
|
@@ -139,7 +171,7 @@ class ContestOptions(BaseModel):
|
|
|
139
171
|
|
|
140
172
|
|
|
141
173
|
class Contest(BaseModel):
|
|
142
|
-
contest_name:
|
|
174
|
+
contest_name: Text = ""
|
|
143
175
|
|
|
144
176
|
start_time: Union[int, DateTimeISO8601String] = 0
|
|
145
177
|
end_time: Union[int, DateTimeISO8601String] = 0
|
|
@@ -149,15 +181,17 @@ class Contest(BaseModel):
|
|
|
149
181
|
frozen_time: int = 60 * 60 # unit: seconds
|
|
150
182
|
unfrozen_time: int = 0x3F3F3F3F3F3F3F3F
|
|
151
183
|
|
|
184
|
+
problems: Optional[Problems] = None
|
|
152
185
|
problem_quantity: int = 0
|
|
153
186
|
problem_id: List[str] = Field(default_factory=list)
|
|
187
|
+
balloon_color: Optional[List[BalloonColor]] = None
|
|
154
188
|
|
|
155
|
-
organization: str = "School"
|
|
156
189
|
status_time_display: Optional[Dict[str, bool]] = constants.FULL_STATUS_TIME_DISPLAY
|
|
157
190
|
|
|
158
191
|
badge: Optional[str] = None
|
|
192
|
+
organization: str = "School"
|
|
193
|
+
|
|
159
194
|
medal: Optional[Union[Dict[str, Dict[str, int]], MedalPreset]] = None
|
|
160
|
-
balloon_color: Optional[List[Color]] = None
|
|
161
195
|
|
|
162
196
|
group: Optional[Dict[str, str]] = None
|
|
163
197
|
tag: Optional[Dict[str, str]] = None
|
|
@@ -171,7 +205,7 @@ class Contest(BaseModel):
|
|
|
171
205
|
|
|
172
206
|
options: ContestOptions = Field(default_factory=ContestOptions)
|
|
173
207
|
|
|
174
|
-
def append_balloon_color(self, color:
|
|
208
|
+
def append_balloon_color(self, color: BalloonColor):
|
|
175
209
|
if self.balloon_color is None:
|
|
176
210
|
self.balloon_color = []
|
|
177
211
|
self.balloon_color.append(color)
|
|
@@ -183,20 +217,20 @@ class Contest(BaseModel):
|
|
|
183
217
|
|
|
184
218
|
def fill_balloon_color(self):
|
|
185
219
|
default_balloon_color_list = [
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
220
|
+
BalloonColor(background_color="rgba(189, 14, 14, 0.7)", color="#fff"),
|
|
221
|
+
BalloonColor(background_color="rgba(149, 31, 217, 0.7)", color="#fff"),
|
|
222
|
+
BalloonColor(background_color="rgba(16, 32, 96, 0.7)", color="#fff"),
|
|
223
|
+
BalloonColor(background_color="rgba(38, 185, 60, 0.7)", color="#000"),
|
|
224
|
+
BalloonColor(background_color="rgba(239, 217, 9, 0.7)", color="#000"),
|
|
225
|
+
BalloonColor(background_color="rgba(243, 88, 20, 0.7)", color="#fff"),
|
|
226
|
+
BalloonColor(background_color="rgba(12, 76, 138, 0.7)", color="#fff"),
|
|
227
|
+
BalloonColor(background_color="rgba(156, 155, 155, 0.7)", color="#000"),
|
|
228
|
+
BalloonColor(background_color="rgba(4, 154, 115, 0.7)", color="#000"),
|
|
229
|
+
BalloonColor(background_color="rgba(159, 19, 236, 0.7)", color="#fff"),
|
|
230
|
+
BalloonColor(background_color="rgba(42, 197, 202, 0.7)", color="#000"),
|
|
231
|
+
BalloonColor(background_color="rgba(142, 56, 54, 0.7)", color="#fff"),
|
|
232
|
+
BalloonColor(background_color="rgba(144, 238, 144, 0.7)", color="#000"),
|
|
233
|
+
BalloonColor(background_color="rgba(77, 57, 0, 0.7)", color="#fff"),
|
|
200
234
|
]
|
|
201
235
|
|
|
202
236
|
self.balloon_color = default_balloon_color_list[: self.problem_quantity]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|