Skip to content

Commit d0c9eec

Browse files
authored
Add and deprecate fields (#4502)
1 parent 108509e commit d0c9eec

6 files changed

Lines changed: 649 additions & 49 deletions
Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
# Generated by Django 4.2.24 on 2025-10-22 15:54
2+
3+
from django.db import migrations, models
4+
5+
import grandchallenge.core.validators
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
(
12+
"challenges",
13+
"0061_alter_challenge_banner_alter_challenge_logo_and_more",
14+
),
15+
]
16+
17+
operations = [
18+
migrations.AddField(
19+
model_name="challengerequest",
20+
name="algorithm_maximum_settable_memory_gb_for_tasks",
21+
field=models.JSONField(
22+
default=list,
23+
help_text="Maximum amount of main memory (DRAM) that participants will be allowed to assign to algorithm inference jobs for submission.",
24+
),
25+
),
26+
migrations.AddField(
27+
model_name="challengerequest",
28+
name="algorithm_selectable_gpu_type_choices_for_tasks",
29+
field=models.JSONField(
30+
default=list,
31+
help_text='The GPU type choices that participants will be able to select for their algorithm inference jobs, for each task. Options are ["", "A100", "A10G", "V100", "K80", "T4"].',
32+
validators=[
33+
grandchallenge.core.validators.JSONValidator(
34+
schema={
35+
"$schema": "http://json-schema.org/draft-07/schema",
36+
"items": {
37+
"items": {
38+
"enum": [
39+
"",
40+
"A100",
41+
"A10G",
42+
"V100",
43+
"K80",
44+
"T4",
45+
],
46+
"type": "string",
47+
},
48+
"type": "array",
49+
"uniqueItems": True,
50+
},
51+
"title": "The Selectable GPU Types Schema",
52+
"type": "array",
53+
}
54+
)
55+
],
56+
),
57+
),
58+
migrations.AddField(
59+
model_name="challengerequest",
60+
name="average_size_test_case_mb_for_tasks",
61+
field=models.JSONField(
62+
default=list,
63+
help_text="Average size of a test image in MB, for each task.",
64+
validators=[
65+
grandchallenge.core.validators.JSONValidator(
66+
schema={
67+
"$schema": "http://json-schema.org/draft-07/schema",
68+
"items": {
69+
"maximum": 10000,
70+
"minimum": 1,
71+
"type": "integer",
72+
},
73+
"type": "array",
74+
}
75+
)
76+
],
77+
),
78+
),
79+
migrations.AddField(
80+
model_name="challengerequest",
81+
name="inference_time_average_minutes_for_tasks",
82+
field=models.JSONField(
83+
default=list,
84+
help_text="Average run time per algorithm job in minutes, for each task.",
85+
validators=[
86+
grandchallenge.core.validators.JSONValidator(
87+
schema={
88+
"$schema": "http://json-schema.org/draft-07/schema",
89+
"items": {
90+
"maximum": 60,
91+
"minimum": 5,
92+
"type": "integer",
93+
},
94+
"type": "array",
95+
}
96+
)
97+
],
98+
),
99+
),
100+
migrations.AddField(
101+
model_name="challengerequest",
102+
name="number_of_submissions_per_team_for_phases",
103+
field=models.JSONField(
104+
default=list,
105+
help_text="Number of submissions per team for each phase",
106+
validators=[
107+
grandchallenge.core.validators.JSONValidator(
108+
schema={
109+
"$schema": "http://json-schema.org/draft-07/schema",
110+
"items": {"minimum": 1, "type": "integer"},
111+
"type": "array",
112+
}
113+
)
114+
],
115+
),
116+
),
117+
migrations.AddField(
118+
model_name="challengerequest",
119+
name="number_of_teams_for_phases",
120+
field=models.JSONField(
121+
default=list,
122+
help_text="Number of teams for each phase",
123+
validators=[
124+
grandchallenge.core.validators.JSONValidator(
125+
schema={
126+
"$schema": "http://json-schema.org/draft-07/schema",
127+
"items": {"minimum": 1, "type": "integer"},
128+
"type": "array",
129+
}
130+
)
131+
],
132+
),
133+
),
134+
migrations.AddField(
135+
model_name="challengerequest",
136+
name="number_of_test_cases_for_phases",
137+
field=models.JSONField(
138+
default=list,
139+
help_text="Number of test images for each phase.",
140+
validators=[
141+
grandchallenge.core.validators.JSONValidator(
142+
schema={
143+
"$schema": "http://json-schema.org/draft-07/schema",
144+
"items": {"minimum": 1, "type": "integer"},
145+
"type": "array",
146+
}
147+
)
148+
],
149+
),
150+
),
151+
migrations.AddField(
152+
model_name="challengerequest",
153+
name="task_id_for_phases",
154+
field=models.JSONField(
155+
default=list,
156+
help_text="Indicate which phase belongs to which task, e.g. [1, 1, 2, 2] means the first two phases below to task 1, the last two phases below to task 2.",
157+
validators=[
158+
grandchallenge.core.validators.JSONValidator(
159+
schema={
160+
"$schema": "http://json-schema.org/draft-07/schema",
161+
"items": {"type": "integer"},
162+
"type": "array",
163+
}
164+
)
165+
],
166+
),
167+
),
168+
migrations.AddField(
169+
model_name="challengerequest",
170+
name="task_ids",
171+
field=models.JSONField(
172+
default=list,
173+
help_text="List the task id's, e.g. [1, 2, 3].",
174+
validators=[
175+
grandchallenge.core.validators.JSONValidator(
176+
schema={
177+
"$schema": "http://json-schema.org/draft-07/schema",
178+
"items": {"type": "integer"},
179+
"type": "array",
180+
"uniqueItems": True,
181+
}
182+
)
183+
],
184+
),
185+
),
186+
]
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
# Generated by Django 4.2.23 on 2025-08-20 14:20
2+
3+
from django.db import migrations
4+
5+
6+
def copy_data_to_new_budget_fields(apps, schema_editor): # noqa: C901
7+
ChallengeRequest = apps.get_model( # noqa: N806
8+
"challenges", "ChallengeRequest"
9+
)
10+
11+
for cr in ChallengeRequest.objects.all():
12+
if not cr.algorithm_selectable_gpu_type_choices_for_tasks:
13+
cr.algorithm_selectable_gpu_type_choices_for_tasks = [
14+
cr.algorithm_selectable_gpu_type_choices
15+
] * cr.number_of_tasks
16+
if not cr.algorithm_maximum_settable_memory_gb_for_tasks:
17+
cr.algorithm_maximum_settable_memory_gb_for_tasks = [
18+
cr.algorithm_maximum_settable_memory_gb
19+
] * cr.number_of_tasks
20+
if not cr.average_size_test_case_mb_for_tasks:
21+
cr.average_size_test_case_mb_for_tasks = [
22+
cr.average_size_of_test_image_in_mb
23+
] * cr.number_of_tasks
24+
if not cr.inference_time_average_minutes_for_tasks:
25+
cr.inference_time_average_minutes_for_tasks = [
26+
cr.inference_time_limit_in_minutes
27+
] * cr.number_of_tasks
28+
if not cr.task_ids:
29+
cr.task_ids = list(range(1, cr.number_of_tasks + 1))
30+
if not cr.task_id_for_phases:
31+
cr.task_id_for_phases = [
32+
task_id for task_id in cr.task_ids for _ in range(2)
33+
]
34+
if not cr.number_of_teams_for_phases:
35+
cr.number_of_teams_for_phases = (
36+
[cr.expected_number_of_teams] * 2 * cr.number_of_tasks
37+
)
38+
if not cr.number_of_submissions_per_team_for_phases:
39+
cr.number_of_submissions_per_team_for_phases = [
40+
cr.phase_1_number_of_submissions_per_team,
41+
cr.phase_2_number_of_submissions_per_team,
42+
] * cr.number_of_tasks
43+
if not cr.number_of_test_cases_for_phases:
44+
cr.number_of_test_cases_for_phases = [
45+
cr.phase_1_number_of_test_images,
46+
cr.phase_2_number_of_test_images,
47+
] * cr.number_of_tasks
48+
cr.save()
49+
50+
51+
class Migration(migrations.Migration):
52+
53+
dependencies = [
54+
(
55+
"challenges",
56+
"0062_challengerequest_algorithm_maximum_settable_memory_gb_for_tasks_and_more",
57+
),
58+
]
59+
60+
operations = [
61+
migrations.RunPython(copy_data_to_new_budget_fields, elidable=True)
62+
]
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
# Generated by Django 4.2.24 on 2025-10-22 15:56
2+
3+
import django.core.validators
4+
from django.db import migrations, models
5+
6+
import grandchallenge.components.schemas
7+
import grandchallenge.core.validators
8+
9+
10+
class Migration(migrations.Migration):
11+
12+
dependencies = [
13+
("challenges", "0063_auto_20250820_1420"),
14+
]
15+
16+
operations = [
17+
migrations.AlterField(
18+
model_name="challengerequest",
19+
name="algorithm_maximum_settable_memory_gb",
20+
field=models.PositiveSmallIntegerField(
21+
default=32,
22+
help_text="Maximum amount of main memory (DRAM) that participants will be allowed to assign to algorithm inference jobs for submission.",
23+
null=True,
24+
),
25+
),
26+
migrations.AlterField(
27+
model_name="challengerequest",
28+
name="algorithm_selectable_gpu_type_choices",
29+
field=models.JSONField(
30+
default=grandchallenge.components.schemas.get_default_gpu_type_choices,
31+
help_text='The GPU type choices that participants will be able to select for their algorithm inference jobs. Options are ["", "A100", "A10G", "V100", "K80", "T4"].',
32+
null=True,
33+
validators=[
34+
grandchallenge.core.validators.JSONValidator(
35+
schema={
36+
"$schema": "http://json-schema.org/draft-07/schema",
37+
"items": {
38+
"enum": [
39+
"",
40+
"A100",
41+
"A10G",
42+
"V100",
43+
"K80",
44+
"T4",
45+
],
46+
"type": "string",
47+
},
48+
"title": "The Selectable GPU Types Schema",
49+
"type": "array",
50+
"uniqueItems": True,
51+
}
52+
)
53+
],
54+
),
55+
),
56+
migrations.AlterField(
57+
model_name="challengerequest",
58+
name="average_number_of_containers_per_team",
59+
field=models.PositiveIntegerField(
60+
default=5,
61+
help_text="Average number of algorithm containers per team.",
62+
null=True,
63+
validators=[
64+
django.core.validators.MinValueValidator(limit_value=1)
65+
],
66+
),
67+
),
68+
migrations.AlterField(
69+
model_name="challengerequest",
70+
name="average_size_of_test_image_in_mb",
71+
field=models.PositiveIntegerField(
72+
help_text="Average size of a test image in MB.",
73+
null=True,
74+
validators=[
75+
django.core.validators.MinValueValidator(limit_value=1),
76+
django.core.validators.MaxValueValidator(
77+
limit_value=10000
78+
),
79+
],
80+
),
81+
),
82+
migrations.AlterField(
83+
model_name="challengerequest",
84+
name="expected_number_of_teams",
85+
field=models.PositiveIntegerField(
86+
help_text="How many teams do you expect to participate in your challenge?",
87+
null=True,
88+
validators=[
89+
django.core.validators.MinValueValidator(limit_value=1)
90+
],
91+
),
92+
),
93+
migrations.AlterField(
94+
model_name="challengerequest",
95+
name="inference_time_limit_in_minutes",
96+
field=models.PositiveIntegerField(
97+
help_text="Average run time per algorithm job in minutes.",
98+
null=True,
99+
validators=[
100+
django.core.validators.MinValueValidator(limit_value=5),
101+
django.core.validators.MaxValueValidator(limit_value=60),
102+
],
103+
),
104+
),
105+
migrations.AlterField(
106+
model_name="challengerequest",
107+
name="number_of_tasks",
108+
field=models.PositiveIntegerField(
109+
default=1,
110+
help_text="If your challenge has multiple tasks, we multiply the phase 1 and 2 cost estimates by the number of tasks.",
111+
null=True,
112+
validators=[
113+
django.core.validators.MinValueValidator(limit_value=1)
114+
],
115+
),
116+
),
117+
migrations.AlterField(
118+
model_name="challengerequest",
119+
name="phase_1_number_of_submissions_per_team",
120+
field=models.PositiveIntegerField(
121+
help_text="How many submissions do you expect per team in this phase?",
122+
null=True,
123+
),
124+
),
125+
migrations.AlterField(
126+
model_name="challengerequest",
127+
name="phase_1_number_of_test_images",
128+
field=models.PositiveIntegerField(
129+
help_text="Number of test images for this phase.", null=True
130+
),
131+
),
132+
migrations.AlterField(
133+
model_name="challengerequest",
134+
name="phase_2_number_of_submissions_per_team",
135+
field=models.PositiveIntegerField(
136+
help_text="How many submissions do you expect per team in this phase?",
137+
null=True,
138+
),
139+
),
140+
migrations.AlterField(
141+
model_name="challengerequest",
142+
name="phase_2_number_of_test_images",
143+
field=models.PositiveIntegerField(
144+
help_text="Number of test images for this phase.", null=True
145+
),
146+
),
147+
]

0 commit comments

Comments
 (0)