From 3521e1ddb8294be094317b4ff522122b52def350 Mon Sep 17 00:00:00 2001 From: Ihsan Ullah Date: Thu, 28 Mar 2024 17:18:47 +0500 Subject: [PATCH 1/5] competition model updated --- src/apps/competitions/models.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/apps/competitions/models.py b/src/apps/competitions/models.py index 03d8b65fc..98a67471f 100644 --- a/src/apps/competitions/models.py +++ b/src/apps/competitions/models.py @@ -69,6 +69,9 @@ class Competition(ChaHubSaveMixin, models.Model): # if false, submissions run will be intiiated by organizer auto_run_submissions = models.BooleanField(default=True) + # If true, participants see the make their submissions public + can_participant_make_submission_public = models.BooleanField(default=True) + def __str__(self): return f"competition-{self.title}-{self.pk}-{self.competition_type}" From a82566712f49098bdb2afa452f6ae1f2174a0444 Mon Sep 17 00:00:00 2001 From: Ihsan Ullah Date: Thu, 28 Mar 2024 19:27:09 +0500 Subject: [PATCH 2/5] competition settings to allow participant to make submission public/private --- src/apps/api/serializers/competitions.py | 2 + src/apps/api/serializers/submissions.py | 8 +- src/apps/api/views/submissions.py | 4 +- ...an_participants_make_submissions_public.py | 18 +++ src/apps/competitions/models.py | 2 +- src/apps/competitions/unpackers/v2.py | 1 + .../detail/submission_manager.tag | 6 +- .../editor/_competition_details.tag | 105 +++++++++++++----- 8 files changed, 110 insertions(+), 36 deletions(-) create mode 100644 src/apps/competitions/migrations/0047_competition_can_participants_make_submissions_public.py diff --git a/src/apps/api/serializers/competitions.py b/src/apps/api/serializers/competitions.py index 9b622b3dc..22f02af8a 100644 --- a/src/apps/api/serializers/competitions.py +++ b/src/apps/api/serializers/competitions.py @@ -255,6 +255,7 @@ class Meta: 'queue', 'enable_detailed_results', 'auto_run_submissions', + 'can_participants_make_submissions_public', 'make_programs_available', 'make_input_data_available', 'docker_image', @@ -374,6 +375,7 @@ class Meta: 'queue', 'enable_detailed_results', 'auto_run_submissions', + 'can_participants_make_submissions_public', 'make_programs_available', 'make_input_data_available', 'docker_image', diff --git a/src/apps/api/serializers/submissions.py b/src/apps/api/serializers/submissions.py index 33fe9241e..05191e8e3 100644 --- a/src/apps/api/serializers/submissions.py +++ b/src/apps/api/serializers/submissions.py @@ -42,6 +42,7 @@ class SubmissionSerializer(serializers.ModelSerializer): task = TaskSerializer() created_when = serializers.DateTimeField(format="%Y-%m-%d %H:%M") auto_run = serializers.SerializerMethodField(read_only=True) + can_make_submissions_public = serializers.SerializerMethodField(read_only=True) class Meta: model = Submission @@ -67,7 +68,8 @@ class Meta: 'leaderboard', 'on_leaderboard', 'task', - 'auto_run' + 'auto_run', + 'can_make_submissions_public', ) read_only_fields = ( 'pk', @@ -85,6 +87,10 @@ def get_auto_run(self, instance): # returns this submission's competition auto_run_submissions Flag return instance.phase.competition.auto_run_submissions + def get_can_make_submissions_public(self, instance): + # returns this submission's competition can_participants_make_submissions_public Flag + return instance.phase.competition.can_participants_make_submissions_public + class SubmissionLeaderBoardSerializer(serializers.ModelSerializer): scores = SubmissionScoreSerializer(many=True) diff --git a/src/apps/api/views/submissions.py b/src/apps/api/views/submissions.py index d0c0defb7..8e63abc17 100644 --- a/src/apps/api/views/submissions.py +++ b/src/apps/api/views/submissions.py @@ -359,8 +359,10 @@ def get_detail_result(self, request, pk): @action(detail=True, methods=('GET',)) def toggle_public(self, request, pk): submission = super().get_object() + if not submission.phase.competition.can_participants_make_submissions_public: + raise PermissionDenied("You do not have permission to make this submissions public/private") if not self.has_admin_permission(request.user, submission): - raise PermissionDenied(f'You do not have permission to publish this submissions') + raise PermissionDenied("You do not have permission to publish this submissions") is_public = not submission.is_public submission.data.is_public = is_public submission.data.save(send=False) diff --git a/src/apps/competitions/migrations/0047_competition_can_participants_make_submissions_public.py b/src/apps/competitions/migrations/0047_competition_can_participants_make_submissions_public.py new file mode 100644 index 000000000..2b750fa02 --- /dev/null +++ b/src/apps/competitions/migrations/0047_competition_can_participants_make_submissions_public.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.17 on 2024-03-28 13:00 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('competitions', '0046_merge_20240222_1916'), + ] + + operations = [ + migrations.AddField( + model_name='competition', + name='can_participants_make_submissions_public', + field=models.BooleanField(default=True), + ), + ] diff --git a/src/apps/competitions/models.py b/src/apps/competitions/models.py index 98a67471f..198138117 100644 --- a/src/apps/competitions/models.py +++ b/src/apps/competitions/models.py @@ -70,7 +70,7 @@ class Competition(ChaHubSaveMixin, models.Model): auto_run_submissions = models.BooleanField(default=True) # If true, participants see the make their submissions public - can_participant_make_submission_public = models.BooleanField(default=True) + can_participants_make_submissions_public = models.BooleanField(default=True) def __str__(self): return f"competition-{self.title}-{self.pk}-{self.competition_type}" diff --git a/src/apps/competitions/unpackers/v2.py b/src/apps/competitions/unpackers/v2.py index 8de2a42ad..5d897b70d 100644 --- a/src/apps/competitions/unpackers/v2.py +++ b/src/apps/competitions/unpackers/v2.py @@ -15,6 +15,7 @@ def __init__(self, *args, **kwargs): "docker_image": self.competition_yaml.get('docker_image', 'codalab/codalab-legacy:py37'), "enable_detailed_results": self.competition_yaml.get('enable_detailed_results', False), "auto_run_submissions": self.competition_yaml.get('auto_run_submissions', True), + "can_participants_make_submissions_public": self.competition_yaml.get('can_participants_make_submissions_public', True), "make_programs_available": self.competition_yaml.get('make_programs_available', False), "make_input_data_available": self.competition_yaml.get('make_input_data_available', False), "description": self.competition_yaml.get("description", ""), diff --git a/src/static/riot/competitions/detail/submission_manager.tag b/src/static/riot/competitions/detail/submission_manager.tag index 5cfa0c7f5..8d528b28f 100644 --- a/src/static/riot/competitions/detail/submission_manager.tag +++ b/src/static/riot/competitions/detail/submission_manager.tag @@ -138,14 +138,14 @@ - - @@ -437,7 +437,7 @@ self.update_submissions() }) .fail(resp => { - toastr.error('Error updating submission') + toastr.error(resp.responseJSON.detail) }) } } diff --git a/src/static/riot/competitions/editor/_competition_details.tag b/src/static/riot/competitions/editor/_competition_details.tag index c068f9810..f2c505b18 100644 --- a/src/static/riot/competitions/editor/_competition_details.tag +++ b/src/static/riot/competitions/editor/_competition_details.tag @@ -1,10 +1,13 @@
+ +
+
@@ -22,10 +25,56 @@
+ +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
@@ -82,6 +131,8 @@
+ +
+ +
- - -
-
- - -
-
- - -
-
+
@@ -136,7 +170,10 @@
+ +
+
@@ -149,18 +186,24 @@
+ +
- - -
-
- - -
-
- - + +
+ + +
+ + + + +
+ +