diff --git a/src/apps/api/serializers/submissions.py b/src/apps/api/serializers/submissions.py index 35800f300..ef3cdf39b 100644 --- a/src/apps/api/serializers/submissions.py +++ b/src/apps/api/serializers/submissions.py @@ -115,6 +115,8 @@ class SubmissionCreationSerializer(DefaultUserCreateMixin, serializers.ModelSeri tasks = serializers.PrimaryKeyRelatedField(queryset=Task.objects.all(), required=False, write_only=True, many=True) phase = serializers.PrimaryKeyRelatedField(queryset=Phase.objects.all(), required=True) queue = serializers.PrimaryKeyRelatedField(queryset=Queue.objects.all(), required=False, allow_null=True) + created_when = serializers.DateTimeField(format="%Y-%m-%d %H:%M", required=False) + scores = SubmissionScoreSerializer(many=True, required=False) class Meta: model = Submission @@ -132,7 +134,9 @@ class Meta: 'tasks', 'fact_sheet_answers', 'organization', - 'queue' + 'queue', + 'created_when', + 'scores' ) extra_kwargs = { 'secret': {"write_only": True}, diff --git a/src/apps/api/views/competitions.py b/src/apps/api/views/competitions.py index e1b74758f..945c4f2e3 100644 --- a/src/apps/api/views/competitions.py +++ b/src/apps/api/views/competitions.py @@ -493,9 +493,12 @@ def create_dump(self, request, pk=None): if not competition.user_has_admin_permission(request.user): raise PermissionDenied("You don't have access") + # get keys_instead_of_files from request data + keys_instead_of_files = request.data.get('keys_instead_of_files', False) + # arg 1: pk: competition primary key - # arg 2: False: keys_instead_of_files (if false: files will be dowloaded in dumps, if true: only keys) - create_competition_dump.delay(pk, False) + # arg 2: keys_instead_of_files (if false: files will be dowloaded in dumps, if true: only keys) + create_competition_dump.delay(pk, keys_instead_of_files) serializer = CompetitionCreationTaskStatusSerializer({"status": "Success. Competition dump is being created."}) return Response(serializer.data, status=201) diff --git a/src/apps/competitions/migrations/0037_auto_20230826_0859.py b/src/apps/competitions/migrations/0037_auto_20230826_0859.py new file mode 100644 index 000000000..afe2d8e92 --- /dev/null +++ b/src/apps/competitions/migrations/0037_auto_20230826_0859.py @@ -0,0 +1,23 @@ +# Generated by Django 2.2.17 on 2023-08-26 08:59 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('competitions', '0036_submission_queue'), + ] + + operations = [ + migrations.AlterField( + model_name='phase', + name='max_submissions_per_day', + field=models.PositiveIntegerField(blank=True, default=5, null=True), + ), + migrations.AlterField( + model_name='phase', + name='max_submissions_per_person', + field=models.PositiveIntegerField(blank=True, default=100, null=True), + ), + ] diff --git a/src/apps/competitions/models.py b/src/apps/competitions/models.py index f1b17412a..9eb843f17 100644 --- a/src/apps/competitions/models.py +++ b/src/apps/competitions/models.py @@ -279,8 +279,8 @@ class Phase(ChaHubSaveMixin, models.Model): hide_output = models.BooleanField(default=False) has_max_submissions = models.BooleanField(default=False) - max_submissions_per_day = models.PositiveIntegerField(null=True, blank=True) - max_submissions_per_person = models.PositiveIntegerField(null=True, blank=True) + max_submissions_per_day = models.PositiveIntegerField(default=5, null=True, blank=True) + max_submissions_per_person = models.PositiveIntegerField(default=100, null=True, blank=True) tasks = models.ManyToManyField('tasks.Task', blank=True, related_name='phases', through='PhaseTaskInstance') diff --git a/src/apps/competitions/tasks.py b/src/apps/competitions/tasks.py index 0a6c38ac8..87ad0d316 100644 --- a/src/apps/competitions/tasks.py +++ b/src/apps/competitions/tasks.py @@ -494,11 +494,16 @@ def create_competition_dump(competition_pk, keys_instead_of_files=False): temp_task_data = { 'index': index } + for field in TASK_FIELDS: data = getattr(task, field, "") + # If keys_instead of files is not true and field is key, then skip this filed + if not keys_instead_of_files and field == 'key': + continue if field == 'key': data = str(data) temp_task_data[field] = data + for file_type in PHASE_FILES: if hasattr(task, file_type): temp_dataset = getattr(task, file_type) diff --git a/src/apps/competitions/tests/unpacker_test_data.py b/src/apps/competitions/tests/unpacker_test_data.py index 0d7aa3630..db69ec6dd 100644 --- a/src/apps/competitions/tests/unpacker_test_data.py +++ b/src/apps/competitions/tests/unpacker_test_data.py @@ -20,6 +20,7 @@ "start_date": "2019-01-01", "execution_time_limit": 500, "max_submissions_per_day": 5, + "max_submissions_per_person": 100, "ingestion_program": "ingestion_program.zip", "input_data": "evaluation_data.zip", "scoring_program": "scoring_program.zip", @@ -32,6 +33,7 @@ "start_date": "2019-09-30", "execution_time_limit": 300, "max_submissions_per_day": 5, + "max_submissions_per_person": 100, "auto_migration": True, "ingestion_program": "ingestion_program.zip", "input_data": "evaluation_data.zip", @@ -105,6 +107,7 @@ "description": "Development phase", "execution_time_limit": 500, "max_submissions_per_day": 5, + "max_submissions_per_person": 100, "start": "2019-01-01", "end": "2019-09-29", "tasks": [0] @@ -114,6 +117,7 @@ "description": "Final phase", "execution_time_limit": 300, "max_submissions_per_day": 5, + "max_submissions_per_person": 100, "auto_migrate_to_this_phase": True, "start": "2019-09-30", "tasks": [1] @@ -201,7 +205,7 @@ 'description': 'Development phase', 'execution_time_limit': 500, 'max_submissions_per_day': 5, - 'max_submissions_per_person': None, + 'max_submissions_per_person': 100, 'auto_migrate_to_this_phase': False, 'has_max_submissions': True, 'end': datetime.datetime(2019, 9, 29, 0, 0, tzinfo=timezone.now().tzinfo), @@ -217,7 +221,7 @@ 'description': 'Final phase', 'execution_time_limit': 300, 'max_submissions_per_day': 5, - 'max_submissions_per_person': None, + 'max_submissions_per_person': 100, 'auto_migrate_to_this_phase': True, 'has_max_submissions': True, 'end': None, diff --git a/src/apps/competitions/unpackers/v1.py b/src/apps/competitions/unpackers/v1.py index 63a808629..a2dd694c4 100644 --- a/src/apps/competitions/unpackers/v1.py +++ b/src/apps/competitions/unpackers/v1.py @@ -80,8 +80,8 @@ def _unpack_phases(self): 'start': get_datetime(phase['start_date']), 'name': phase['label'], 'description': phase.get('description'), - 'max_submissions_per_day': phase.get('max_submissions_per_day'), - 'max_submissions_per_person': phase.get('max_submissions'), + 'max_submissions_per_day': phase.get('max_submissions_per_day', 5), + 'max_submissions_per_person': phase.get('max_submissions', 100), 'auto_migrate_to_this_phase': phase.get('auto_migration', 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 bce1e3bf5..6c335e9ea 100644 --- a/src/apps/competitions/unpackers/v2.py +++ b/src/apps/competitions/unpackers/v2.py @@ -188,8 +188,8 @@ def _unpack_phases(self): "description": phase_data.get('description'), "start": get_datetime(phase_data.get('start')), "end": get_datetime(phase_data.get('end')), - 'max_submissions_per_day': phase_data.get('max_submissions_per_day'), - 'max_submissions_per_person': phase_data.get('max_submissions'), + 'max_submissions_per_day': phase_data.get('max_submissions_per_day', 5), + '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), } diff --git a/src/static/js/ours/client.js b/src/static/js/ours/client.js index f76648d2d..166db1bfa 100644 --- a/src/static/js/ours/client.js +++ b/src/static/js/ours/client.js @@ -70,8 +70,8 @@ CODALAB.api = { get_competition_files: pk => { return CODALAB.api.request('GET', `${URLS.API}competitions/${pk}/get_files/`) }, - create_competition_dump: function (pk) { - return CODALAB.api.request('POST', `${URLS.API}competitions/${pk}/create_dump/`) + create_competition_dump: function (pk, keys_instead_of_files) { + return CODALAB.api.request('POST', `${URLS.API}competitions/${pk}/create_dump/`, {keys_instead_of_files: keys_instead_of_files}) }, /*--------------------------------------------------------------------- Submissions diff --git a/src/static/riot/competitions/detail/_header.tag b/src/static/riot/competitions/detail/_header.tag index 7b1314c40..87d4fe870 100644 --- a/src/static/riot/competitions/detail/_header.tag +++ b/src/static/riot/competitions/detail/_header.tag @@ -99,9 +99,27 @@
+
+ +
+
+
+
+
@@ -327,6 +338,13 @@ }); }) + if(self.competition_has_no_terms_page()){ + const rendered_content = renderMarkdownWithLatex(self.competition.terms) + $(`#page_term`)[0].innerHTML = "" + rendered_content.forEach(node => { + $(`#page_term`)[0].appendChild(node.cloneNode(true)); // Append each node + }); + } _.forEach(self.competition.phases, (phase, index) => { // Render phase description const rendered_content = renderMarkdownWithLatex(phase.description) @@ -341,6 +359,18 @@ }, 500) }) + self.competition_has_no_terms_page = function () { + var no_term_page = true + if(self.competition.pages){ + self.competition.pages.forEach(function (page) { + if (page.title === "Terms") { + no_term_page = false + } + }) + } + return no_term_page + } + CODALAB.events.on('phase_selected', function (selected_phase) { self.selected_phase = selected_phase self.update() diff --git a/src/static/riot/tasks/management.tag b/src/static/riot/tasks/management.tag index d9013d630..5a613b66a 100644 --- a/src/static/riot/tasks/management.tag +++ b/src/static/riot/tasks/management.tag @@ -23,13 +23,13 @@ - + - - + + -
Shared With Uploaded... PublicDelete?Actions
{ task.name }
{ task.name }
@@ -44,9 +44,12 @@
+ + @@ -84,7 +87,7 @@
- + - + + + +