diff --git a/src/apps/api/serializers/competitions.py b/src/apps/api/serializers/competitions.py index d77ec97a8..d35fed024 100644 --- a/src/apps/api/serializers/competitions.py +++ b/src/apps/api/serializers/competitions.py @@ -43,6 +43,7 @@ class Meta: 'max_submissions_per_person', 'auto_migrate_to_this_phase', 'hide_output', + 'hide_prediction_output', 'hide_score_output', 'leaderboard', 'public_data', @@ -125,6 +126,7 @@ class Meta: 'max_submissions_per_person', 'auto_migrate_to_this_phase', 'hide_output', + 'hide_prediction_output', 'hide_score_output', # no leaderboard 'public_data', diff --git a/src/apps/api/serializers/submissions.py b/src/apps/api/serializers/submissions.py index 7298d34f1..6def18976 100644 --- a/src/apps/api/serializers/submissions.py +++ b/src/apps/api/serializers/submissions.py @@ -261,7 +261,7 @@ def get_data_file(self, instance): def get_prediction_result(self, instance): if instance.prediction_result.name: - if instance.phase.hide_output and not instance.phase.competition.user_has_admin_permission(self.context['request'].user): + if (instance.phase.hide_output or instance.phase.hide_prediction_output) and not instance.phase.competition.user_has_admin_permission(self.context['request'].user): return None return make_url_sassy(instance.prediction_result.name) diff --git a/src/apps/api/views/competitions.py b/src/apps/api/views/competitions.py index f9603f535..f5d464761 100644 --- a/src/apps/api/views/competitions.py +++ b/src/apps/api/views/competitions.py @@ -275,6 +275,7 @@ def update(self, request, *args, **kwargs): name=phase["name"], description=phase["description"], hide_output=phase["hide_output"], + hide_prediction_output=phase["hide_prediction_output"], hide_score_output=phase["hide_score_output"], competition=Competition.objects.get(id=data['id']) ) diff --git a/src/apps/competitions/migrations/0058_phase_hide_prediction_output.py b/src/apps/competitions/migrations/0058_phase_hide_prediction_output.py new file mode 100644 index 000000000..0c241ca2b --- /dev/null +++ b/src/apps/competitions/migrations/0058_phase_hide_prediction_output.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.28 on 2025-05-14 19:37 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('competitions', '0057_phase_hide_score_output'), + ] + + operations = [ + migrations.AddField( + model_name='phase', + name='hide_prediction_output', + field=models.BooleanField(default=False), + ), + ] diff --git a/src/apps/competitions/models.py b/src/apps/competitions/models.py index bda72df13..d8ce83dad 100644 --- a/src/apps/competitions/models.py +++ b/src/apps/competitions/models.py @@ -342,6 +342,7 @@ class Phase(ChaHubSaveMixin, models.Model): auto_migrate_to_this_phase = models.BooleanField(default=False) has_been_migrated = models.BooleanField(default=False) hide_output = models.BooleanField(default=False) + hide_prediction_output = models.BooleanField(default=False) hide_score_output = models.BooleanField(default=False) has_max_submissions = models.BooleanField(default=True) diff --git a/src/apps/competitions/tasks.py b/src/apps/competitions/tasks.py index 419a13f23..9b685d1d7 100644 --- a/src/apps/competitions/tasks.py +++ b/src/apps/competitions/tasks.py @@ -82,6 +82,7 @@ 'execution_time_limit', 'auto_migrate_to_this_phase', 'hide_output', + 'hide_prediction_output', 'hide_score_output', ] PHASE_FILES = [ diff --git a/src/apps/competitions/tests/unpacker_test_data.py b/src/apps/competitions/tests/unpacker_test_data.py index c93597671..b2ee7e075 100644 --- a/src/apps/competitions/tests/unpacker_test_data.py +++ b/src/apps/competitions/tests/unpacker_test_data.py @@ -214,6 +214,7 @@ 'tasks': [0], 'status': 'Previous', 'hide_output': False, + 'hide_prediction_output': False, 'hide_score_output': False, }, { @@ -233,6 +234,7 @@ 'status': 'Current', 'is_final_phase': True, 'hide_output': False, + 'hide_prediction_output': False, 'hide_score_output': False, } ] diff --git a/src/apps/competitions/unpackers/v1.py b/src/apps/competitions/unpackers/v1.py index d780c2e5d..535e9e2d5 100644 --- a/src/apps/competitions/unpackers/v1.py +++ b/src/apps/competitions/unpackers/v1.py @@ -89,6 +89,7 @@ def _unpack_phases(self): 'max_submissions_per_person': phase.get('max_submissions', 100), 'auto_migrate_to_this_phase': phase.get('auto_migration', False), 'hide_output': phase.get('hide_output', False), + 'hide_prediction_output': phase.get('hide_prediction_output', False), 'hide_score_output': phase.get('hide_score_output', False), } execution_time_limit = phase.get('execution_time_limit') diff --git a/src/apps/competitions/unpackers/v2.py b/src/apps/competitions/unpackers/v2.py index 72a8b6abc..508479eba 100644 --- a/src/apps/competitions/unpackers/v2.py +++ b/src/apps/competitions/unpackers/v2.py @@ -198,6 +198,7 @@ def _unpack_phases(self): 'max_submissions_per_person': phase_data.get('max_submissions', 100), 'auto_migrate_to_this_phase': phase_data.get('auto_migrate_to_this_phase', False), 'hide_output': phase_data.get('hide_output', False), + 'hide_prediction_output': phase_data.get('hide_prediction_output', False), 'hide_score_output': phase_data.get('hide_score_output', False), } try: diff --git a/src/static/riot/competitions/detail/submission_modal.tag b/src/static/riot/competitions/detail/submission_modal.tag index 3df256fba..0961c0b0b 100644 --- a/src/static/riot/competitions/detail/submission_modal.tag +++ b/src/static/riot/competitions/detail/submission_modal.tag @@ -22,7 +22,7 @@