diff --git a/bullet/bullet_admin/forms/category.py b/bullet/bullet_admin/forms/category.py index 802b6e64..fac8c635 100644 --- a/bullet/bullet_admin/forms/category.py +++ b/bullet/bullet_admin/forms/category.py @@ -9,6 +9,7 @@ class Meta: fields = [ "identifier", "order", + "first_problem", "problems_per_team", "max_members_per_team", "max_teams_per_school", diff --git a/bullet/bullet_admin/forms/competition.py b/bullet/bullet_admin/forms/competition.py index 769b386e..d88b8127 100644 --- a/bullet/bullet_admin/forms/competition.py +++ b/bullet/bullet_admin/forms/competition.py @@ -16,6 +16,7 @@ class Meta: "competition_start", "competition_duration", "results_freeze", + "problem_count", "is_cancelled", ] diff --git a/bullet/bullet_admin/templatetags/badmin.py b/bullet/bullet_admin/templatetags/badmin.py index b446e371..9176554c 100644 --- a/bullet/bullet_admin/templatetags/badmin.py +++ b/bullet/bullet_admin/templatetags/badmin.py @@ -109,7 +109,7 @@ def admin_sidebar(context): ) if branch_role.is_admin: items.append( - ("fa-gear", "Edit Competition", reverse("badmin:competition_edit")) + ("fa-gear", "Edit competition", reverse("badmin:competition_edit")) ) items.append( ("fa-people-group", "Categories", reverse("badmin:category_list")) @@ -126,9 +126,6 @@ def admin_sidebar(context): ) ) if branch_role.is_admin: - items.append( - ("fa-book", "Problem settings", reverse("badmin:problems_generate")) - ) items.append( ( "fa-fast-forward", diff --git a/bullet/bullet_admin/views/category.py b/bullet/bullet_admin/views/category.py index b35f070f..771adf64 100644 --- a/bullet/bullet_admin/views/category.py +++ b/bullet/bullet_admin/views/category.py @@ -39,6 +39,7 @@ class CategoryListView(GenericList, ListView): fields = [ "identifier", "order", + "first_problem", "problems_per_team", "max_members_per_team", "max_teams_per_school", diff --git a/bullet/competitions/migrations/0034_category_first_problem_competition_problem_count.py b/bullet/competitions/migrations/0034_category_first_problem_competition_problem_count.py new file mode 100644 index 00000000..80ec0dcd --- /dev/null +++ b/bullet/competitions/migrations/0034_category_first_problem_competition_problem_count.py @@ -0,0 +1,22 @@ +# Generated by Django 5.1.5 on 2025-01-23 19:32 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("competitions", "0033_venue_is_isolated"), + ] + + operations = [ + migrations.AddField( + model_name="category", + name="first_problem", + field=models.PositiveIntegerField(default=1), + ), + migrations.AddField( + model_name="competition", + name="problem_count", + field=models.PositiveIntegerField(default=0), + ), + ] diff --git a/bullet/competitions/migrations/0035_auto_20250123_1932.py b/bullet/competitions/migrations/0035_auto_20250123_1932.py new file mode 100644 index 00000000..54da172e --- /dev/null +++ b/bullet/competitions/migrations/0035_auto_20250123_1932.py @@ -0,0 +1,31 @@ +# Generated by Django 5.1.5 on 2025-01-23 19:32 + + +from django.db import migrations + + +def populate_problem_numbers(apps, schema_editor): + Competition = apps.get_model("competitions", "Competition") + Category = apps.get_model("competitions", "Category") + Problem = apps.get_model("problems", "Problem") + + for competition in Competition.objects.all(): + competition.problem_count = Problem.objects.filter( + competition=competition + ).count() + competition.save() + + categories = Category.objects.all().prefetch_related("problems") + for category in categories: + problem = category.problems.order_by("number").first() + if problem: + category.first_problem = problem.number + category.save() + + +class Migration(migrations.Migration): + dependencies = [ + ("competitions", "0034_category_first_problem_competition_problem_count"), + ] + + operations = [migrations.RunPython(populate_problem_numbers)] diff --git a/bullet/competitions/models/competitions.py b/bullet/competitions/models/competitions.py index ea9a4de6..823b5686 100644 --- a/bullet/competitions/models/competitions.py +++ b/bullet/competitions/models/competitions.py @@ -91,6 +91,7 @@ class Competition(models.Model): help_text="How long before the competition end should we freeze the results.", ) results_public = models.BooleanField(default=False) + problem_count = models.PositiveIntegerField(default=0) is_cancelled = models.BooleanField(default=False) @@ -178,6 +179,8 @@ class Category(models.Model): max_teams_second_round = models.PositiveIntegerField() max_members_per_team = models.PositiveIntegerField() + first_problem = models.PositiveIntegerField(default=1) + class Meta: constraints = ( UniqueConstraint( @@ -209,13 +212,6 @@ def max_teams_per_school_at(self, time=None): return self.max_teams_second_round return self.max_teams_per_school - @property - def first_problem(self): - first = self.problems.order_by("number").first() - if not first: - return None - return first.number - class Wildcard(models.Model): competition = models.ForeignKey(