Skip to content

Commit 2ffb989

Browse files
authored
feat: move problem numbers into category and competition objects (#990)
1 parent 209ead8 commit 2ffb989

File tree

7 files changed

+60
-11
lines changed

7 files changed

+60
-11
lines changed

bullet/bullet_admin/forms/category.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ class Meta:
99
fields = [
1010
"identifier",
1111
"order",
12+
"first_problem",
1213
"problems_per_team",
1314
"max_members_per_team",
1415
"max_teams_per_school",

bullet/bullet_admin/forms/competition.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ class Meta:
1616
"competition_start",
1717
"competition_duration",
1818
"results_freeze",
19+
"problem_count",
1920
"is_cancelled",
2021
]
2122

bullet/bullet_admin/templatetags/badmin.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ def admin_sidebar(context):
109109
)
110110
if branch_role.is_admin:
111111
items.append(
112-
("fa-gear", "Edit Competition", reverse("badmin:competition_edit"))
112+
("fa-gear", "Edit competition", reverse("badmin:competition_edit"))
113113
)
114114
items.append(
115115
("fa-people-group", "Categories", reverse("badmin:category_list"))
@@ -126,9 +126,6 @@ def admin_sidebar(context):
126126
)
127127
)
128128
if branch_role.is_admin:
129-
items.append(
130-
("fa-book", "Problem settings", reverse("badmin:problems_generate"))
131-
)
132129
items.append(
133130
(
134131
"fa-fast-forward",

bullet/bullet_admin/views/category.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ class CategoryListView(GenericList, ListView):
3939
fields = [
4040
"identifier",
4141
"order",
42+
"first_problem",
4243
"problems_per_team",
4344
"max_members_per_team",
4445
"max_teams_per_school",
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Generated by Django 5.1.5 on 2025-01-23 19:32
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
dependencies = [
8+
("competitions", "0033_venue_is_isolated"),
9+
]
10+
11+
operations = [
12+
migrations.AddField(
13+
model_name="category",
14+
name="first_problem",
15+
field=models.PositiveIntegerField(default=1),
16+
),
17+
migrations.AddField(
18+
model_name="competition",
19+
name="problem_count",
20+
field=models.PositiveIntegerField(default=0),
21+
),
22+
]
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# Generated by Django 5.1.5 on 2025-01-23 19:32
2+
3+
4+
from django.db import migrations
5+
6+
7+
def populate_problem_numbers(apps, schema_editor):
8+
Competition = apps.get_model("competitions", "Competition")
9+
Category = apps.get_model("competitions", "Category")
10+
Problem = apps.get_model("problems", "Problem")
11+
12+
for competition in Competition.objects.all():
13+
competition.problem_count = Problem.objects.filter(
14+
competition=competition
15+
).count()
16+
competition.save()
17+
18+
categories = Category.objects.all().prefetch_related("problems")
19+
for category in categories:
20+
problem = category.problems.order_by("number").first()
21+
if problem:
22+
category.first_problem = problem.number
23+
category.save()
24+
25+
26+
class Migration(migrations.Migration):
27+
dependencies = [
28+
("competitions", "0034_category_first_problem_competition_problem_count"),
29+
]
30+
31+
operations = [migrations.RunPython(populate_problem_numbers)]

bullet/competitions/models/competitions.py

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ class Competition(models.Model):
9191
help_text="How long before the competition end should we freeze the results.",
9292
)
9393
results_public = models.BooleanField(default=False)
94+
problem_count = models.PositiveIntegerField(default=0)
9495

9596
is_cancelled = models.BooleanField(default=False)
9697

@@ -178,6 +179,8 @@ class Category(models.Model):
178179
max_teams_second_round = models.PositiveIntegerField()
179180
max_members_per_team = models.PositiveIntegerField()
180181

182+
first_problem = models.PositiveIntegerField(default=1)
183+
181184
class Meta:
182185
constraints = (
183186
UniqueConstraint(
@@ -209,13 +212,6 @@ def max_teams_per_school_at(self, time=None):
209212
return self.max_teams_second_round
210213
return self.max_teams_per_school
211214

212-
@property
213-
def first_problem(self):
214-
first = self.problems.order_by("number").first()
215-
if not first:
216-
return None
217-
return first.number
218-
219215

220216
class Wildcard(models.Model):
221217
competition = models.ForeignKey(

0 commit comments

Comments
 (0)