diff --git a/src/apps/api/serializers/competitions.py b/src/apps/api/serializers/competitions.py index b8f4c3285..f617fa6b9 100644 --- a/src/apps/api/serializers/competitions.py +++ b/src/apps/api/serializers/competitions.py @@ -267,7 +267,8 @@ class Meta: 'reward', 'contact_email', 'report', - 'whitelist_emails' + 'whitelist_emails', + 'forum_enabled' ) def validate_phases(self, phases): @@ -391,6 +392,7 @@ class Meta: 'contact_email', 'report', 'whitelist_emails', + 'forum_enabled' ) def get_leaderboards(self, instance): diff --git a/src/apps/competitions/admin.py b/src/apps/competitions/admin.py index d01967c0a..b991555da 100644 --- a/src/apps/competitions/admin.py +++ b/src/apps/competitions/admin.py @@ -5,7 +5,7 @@ class CompetitionAdmin(admin.ModelAdmin): search_fields = ['title', 'docker_image', 'created_by__username'] - list_display = ['title', 'created_by', 'is_featured'] + list_display = ['id', 'title', 'created_by', 'is_featured'] list_filter = ['is_featured'] diff --git a/src/apps/competitions/migrations/0053_competition_forum_enabled.py b/src/apps/competitions/migrations/0053_competition_forum_enabled.py new file mode 100644 index 000000000..6caa8279e --- /dev/null +++ b/src/apps/competitions/migrations/0053_competition_forum_enabled.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.28 on 2025-03-10 14:33 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('competitions', '0052_auto_20250129_1058'), + ] + + operations = [ + migrations.AddField( + model_name='competition', + name='forum_enabled', + field=models.BooleanField(default=True), + ), + ] diff --git a/src/apps/competitions/models.py b/src/apps/competitions/models.py index cd381b56b..c69ea56d8 100644 --- a/src/apps/competitions/models.py +++ b/src/apps/competitions/models.py @@ -87,6 +87,9 @@ class Competition(ChaHubSaveMixin, models.Model): # Count of participants in this competition (default = 1 because competition creator is also a participant) participants_count = models.PositiveIntegerField(default=1) + # If true, forum is enabled (default=True) + forum_enabled = models.BooleanField(default=True) + def __str__(self): return f"competition-{self.title}-{self.pk}-{self.competition_type}" diff --git a/src/apps/competitions/tasks.py b/src/apps/competitions/tasks.py index f56696940..412e49437 100644 --- a/src/apps/competitions/tasks.py +++ b/src/apps/competitions/tasks.py @@ -44,7 +44,8 @@ "queue", "description", "registration_auto_approve", - "enable_detailed_results" + "enable_detailed_results", + "forum_enabled" ] TASK_FIELDS = [ diff --git a/src/apps/competitions/unpackers/v2.py b/src/apps/competitions/unpackers/v2.py index b825e9ee2..85eddefcb 100644 --- a/src/apps/competitions/unpackers/v2.py +++ b/src/apps/competitions/unpackers/v2.py @@ -25,6 +25,7 @@ def __init__(self, *args, **kwargs): "fact_sheet": self.competition_yaml.get("fact_sheet", None), "reward": self.competition_yaml.get("reward", None), "contact_email": self.competition_yaml.get("contact_email", None), + "forum_enabled": self.competition_yaml.get("forum_enabled", True), "pages": [], "phases": [], "leaderboards": [], diff --git a/src/apps/forums/views.py b/src/apps/forums/views.py index d74d59509..5896ed8d5 100644 --- a/src/apps/forums/views.py +++ b/src/apps/forums/views.py @@ -26,6 +26,11 @@ class ForumBaseMixin(object): def dispatch(self, *args, **kwargs): # Get object early so we can access it in multiple places self.forum = get_object_or_404(Forum, pk=self.kwargs['forum_pk']) + + if not self.forum.competition.forum_enabled: + messages.error(self.request, "The forum for this competition is disabled.") + return redirect("competitions:detail", pk=self.forum.competition.pk) + if 'thread_pk' in self.kwargs: self.thread = get_object_or_404(Thread, pk=self.kwargs['thread_pk']) diff --git a/src/static/riot/competitions/detail/_tabs.tag b/src/static/riot/competitions/detail/_tabs.tag index 888ba735b..e1bb09770 100644 --- a/src/static/riot/competitions/detail/_tabs.tag +++ b/src/static/riot/competitions/detail/_tabs.tag @@ -7,7 +7,7 @@
Phases
My Submissions
Results
- Forum + Forum @@ -297,6 +313,7 @@ self.data["show_detailed_results_in_leaderboard"] = self.refs.show_detailed_results_in_leaderboard.checked self.data["auto_run_submissions"] = self.refs.auto_run_submissions.checked self.data["can_participants_make_submissions_public"] = self.refs.can_participants_make_submissions_public.checked + self.data["forum_enabled"] = self.refs.forum_enabled.checked self.data["make_programs_available"] = self.refs.make_programs_available.checked self.data["make_input_data_available"] = self.refs.make_input_data_available.checked self.data["docker_image"] = $(self.refs.docker_image).val() @@ -434,6 +451,7 @@ self.refs.show_detailed_results_in_leaderboard.checked = competition.show_detailed_results_in_leaderboard self.refs.auto_run_submissions.checked = competition.auto_run_submissions self.refs.can_participants_make_submissions_public.checked = competition.can_participants_make_submissions_public + self.refs.forum_enabled.checked = competition.forum_enabled self.refs.make_programs_available.checked = competition.make_programs_available self.refs.make_input_data_available.checked = competition.make_input_data_available $(self.refs.docker_image).val(competition.docker_image)