From ec5a3b63295132283f06ed7b4d1b1d330d0683ff Mon Sep 17 00:00:00 2001 From: Ihsan Ullah Date: Fri, 2 Jun 2023 13:14:04 +0500 Subject: [PATCH 1/7] created_by is now a clickable link to user profile --- src/static/riot/datasets/management.tag | 2 +- src/static/riot/submissions/resource_submissions.tag | 2 +- src/static/riot/tasks/management.tag | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/static/riot/datasets/management.tag b/src/static/riot/datasets/management.tag index 3f802592e..281eff368 100644 --- a/src/static/riot/datasets/management.tag +++ b/src/static/riot/datasets/management.tag @@ -116,7 +116,7 @@ {selected_row.key} - {selected_row.created_by} + {selected_row.created_by} {pretty_date(selected_row.created_when)} {_.startCase(selected_row.type)} {_.startCase(selected_row.is_public)} diff --git a/src/static/riot/submissions/resource_submissions.tag b/src/static/riot/submissions/resource_submissions.tag index 719676109..fa14093a0 100644 --- a/src/static/riot/submissions/resource_submissions.tag +++ b/src/static/riot/submissions/resource_submissions.tag @@ -112,7 +112,7 @@ { selected_row.competition.title } - {selected_row.created_by} + {selected_row.created_by} {pretty_date(selected_row.created_when)} {_.startCase(selected_row.type)} {_.startCase(selected_row.is_public)} diff --git a/src/static/riot/tasks/management.tag b/src/static/riot/tasks/management.tag index b262d5fd7..abe2e365e 100644 --- a/src/static/riot/tasks/management.tag +++ b/src/static/riot/tasks/management.tag @@ -96,7 +96,7 @@

{selected_task.description}

-
Created By: {selected_task.created_by}
+
Created By: {selected_task.created_by}
Key: {selected_task.key}
Has Been Validated From f55e5ccd15027a29a6068e46ae23cf977e231446 Mon Sep 17 00:00:00 2001 From: Benjamin Bearce Date: Tue, 6 Jun 2023 12:06:57 -0400 Subject: [PATCH 2/7] manual_comp_create_queue (#912) Fix the queue error when creating a competition manually with the editor --- src/apps/api/serializers/competitions.py | 4 ++++ src/apps/api/views/competitions.py | 8 ++++---- .../riot/competitions/editor/_competition_details.tag | 2 +- src/static/riot/competitions/editor/_phases.tag | 6 ++++-- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/apps/api/serializers/competitions.py b/src/apps/api/serializers/competitions.py index c18eff0a7..0314d831d 100644 --- a/src/apps/api/serializers/competitions.py +++ b/src/apps/api/serializers/competitions.py @@ -171,6 +171,10 @@ class CompetitionUpdateSerializer(CompetitionSerializer): queue = None +class CompetitionCreateSerializer(CompetitionSerializer): + queue = None + + class CompetitionDetailSerializer(serializers.ModelSerializer): created_by = serializers.CharField(source='created_by.username', read_only=True) pages = PageSerializer(many=True) diff --git a/src/apps/api/views/competitions.py b/src/apps/api/views/competitions.py index 12a40cf6e..d27a3fe5e 100644 --- a/src/apps/api/views/competitions.py +++ b/src/apps/api/views/competitions.py @@ -23,9 +23,9 @@ from api.pagination import LargePagination from api.renderers import ZipRenderer from rest_framework.viewsets import ModelViewSet -from api.serializers.competitions import CompetitionSerializer, CompetitionSerializerSimple, PhaseSerializer, \ +from api.serializers.competitions import CompetitionSerializerSimple, PhaseSerializer, \ CompetitionCreationTaskStatusSerializer, CompetitionDetailSerializer, CompetitionParticipantSerializer, \ - FrontPageCompetitionsSerializer, PhaseResultsSerializer, CompetitionUpdateSerializer + FrontPageCompetitionsSerializer, PhaseResultsSerializer, CompetitionUpdateSerializer, CompetitionCreateSerializer from api.serializers.leaderboards import LeaderboardPhaseSerializer, LeaderboardSerializer from competitions.emails import send_participation_requested_emails, send_participation_accepted_emails, \ send_participation_denied_emails, send_direct_participant_email @@ -146,7 +146,8 @@ def get_serializer_class(self): elif self.request.method == 'PATCH': return CompetitionUpdateSerializer else: - return CompetitionSerializer + # Really just CompetitionSerializer with queue = None + return CompetitionCreateSerializer def create(self, request, *args, **kwargs): """Mostly a copy of the underlying base create, however we return some additional data @@ -158,7 +159,6 @@ def create(self, request, *args, **kwargs): # TODO - This is Temporary. Need to change Leaderboard to Phase connect to M2M and handle this correctly. # save leaderboard individually, then pass pk to each phase - print(f"{request.data['leaderboards']}") data = request.data if 'leaderboards' in data: leaderboard_data = data['leaderboards'][0] diff --git a/src/static/riot/competitions/editor/_competition_details.tag b/src/static/riot/competitions/editor/_competition_details.tag index a91445998..419fddec7 100644 --- a/src/static/riot/competitions/editor/_competition_details.tag +++ b/src/static/riot/competitions/editor/_competition_details.tag @@ -88,7 +88,7 @@
- +
diff --git a/src/static/riot/competitions/editor/_phases.tag b/src/static/riot/competitions/editor/_phases.tag index 532f49500..e2dc437c1 100644 --- a/src/static/riot/competitions/editor/_phases.tag +++ b/src/static/riot/competitions/editor/_phases.tag @@ -267,8 +267,10 @@ self.has_initialized_calendars = true } - $(self.refs.calendar_start).calendar('set date', self.phases[self.selected_phase_index].start) - $(self.refs.calendar_end).calendar('set date', self.phases[self.selected_phase_index].end) + if(!(self.selected_phase_index === undefined)){ + $(self.refs.calendar_start).calendar('set date', self.phases[self.selected_phase_index].start) + $(self.refs.calendar_end).calendar('set date', self.phases[self.selected_phase_index].end) + } } self.close_modal = function () { From 3dde7ea4dd687a77a55781ef8beb2aab008ce808 Mon Sep 17 00:00:00 2001 From: Ihsan Ullah Date: Fri, 9 Jun 2023 14:08:42 +0500 Subject: [PATCH 3/7] Public competitions page: hide unwanted buttons --- src/static/riot/competitions/public-list.tag | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/static/riot/competitions/public-list.tag b/src/static/riot/competitions/public-list.tag index 66c087599..20d77b2eb 100644 --- a/src/static/riot/competitions/public-list.tag +++ b/src/static/riot/competitions/public-list.tag @@ -1,6 +1,6 @@

Public Competitions

-
+
{ current_page } of {Math.ceil(competitions.count/competitions.page_size)} @@ -32,7 +32,7 @@
-
+
{ current_page } of {Math.ceil(competitions.count/competitions.page_size)} From 40cfabad8ef932cc133ed7e43aa238b5eb40aae1 Mon Sep 17 00:00:00 2001 From: Ihsan Ullah Date: Fri, 9 Jun 2023 22:59:51 +0500 Subject: [PATCH 4/7] dataset model updated --- .../migrations/0007_auto_20230609_1738.py | 19 +++++++++++++++++++ src/apps/datasets/models.py | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 src/apps/datasets/migrations/0007_auto_20230609_1738.py diff --git a/src/apps/datasets/migrations/0007_auto_20230609_1738.py b/src/apps/datasets/migrations/0007_auto_20230609_1738.py new file mode 100644 index 000000000..f54d966c8 --- /dev/null +++ b/src/apps/datasets/migrations/0007_auto_20230609_1738.py @@ -0,0 +1,19 @@ +# Generated by Django 2.2.17 on 2023-06-09 17:38 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('datasets', '0006_auto_20230528_0829'), + ] + + operations = [ + migrations.AlterField( + model_name='data', + name='competition', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='submission', to='competitions.Competition'), + ), + ] diff --git a/src/apps/datasets/models.py b/src/apps/datasets/models.py index 3d97e8b45..48d50f3f3 100644 --- a/src/apps/datasets/models.py +++ b/src/apps/datasets/models.py @@ -58,7 +58,7 @@ class Data(ChaHubSaveMixin, models.Model): # are NOT marked True, since they are not created by unpacking! was_created_by_competition = models.BooleanField(default=False) - competition = models.ForeignKey(Competition, on_delete=models.PROTECT, null=True, related_name='submission') + competition = models.ForeignKey(Competition, on_delete=models.CASCADE, null=True, related_name='submission') file_name = models.CharField(max_length=64, default="") def get_download_url(self): From 4392e796b58493a65b7e84712a5953871b94f140 Mon Sep 17 00:00:00 2001 From: didayolo Date: Sat, 10 Jun 2023 01:09:20 +0200 Subject: [PATCH 5/7] Remove beta mention --- src/templates/pages/home.html | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/templates/pages/home.html b/src/templates/pages/home.html index 12c322157..1d7cef45f 100644 --- a/src/templates/pages/home.html +++ b/src/templates/pages/home.html @@ -9,7 +9,7 @@
-

BETA

+
{% endblock %} @@ -23,10 +23,8 @@

BETA

+

Welcome to Codabench!

-
-

Welcome to Codabench Beta !

-
From 2989444f0b3d4171a37264e37ea7b31c07f24323 Mon Sep 17 00:00:00 2001 From: Ihsan Ullah Date: Mon, 12 Jun 2023 17:42:58 +0500 Subject: [PATCH 6/7] competition delete test added (#928) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * competition delete test added * Delete competition test * Update test_competitions.py --------- Co-authored-by: Adrien Pavão --- src/apps/api/tests/test_competitions.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/apps/api/tests/test_competitions.py b/src/apps/api/tests/test_competitions.py index 7617dfbd2..989f668f4 100644 --- a/src/apps/api/tests/test_competitions.py +++ b/src/apps/api/tests/test_competitions.py @@ -8,7 +8,7 @@ from rest_framework.test import APITestCase from api.serializers.competitions import CompetitionSerializer -from competitions.models import CompetitionParticipant, Submission +from competitions.models import CompetitionParticipant, Submission, Competition from factories import UserFactory, CompetitionFactory, CompetitionParticipantFactory, PhaseFactory, LeaderboardFactory, \ ColumnFactory, SubmissionFactory, SubmissionScoreFactory, TaskFactory @@ -75,6 +75,13 @@ def test_adding_organizer_accepts_them_if_they_were_existing_participant(self): status=CompetitionParticipant.APPROVED ).count() == 1 + def test_delete_own_competition(self): + self.client.login(username='creator', password='creator') + url = reverse('competition-detail', kwargs={"pk": self.comp.pk}) + resp = self.client.delete(url) + assert resp.status_code == 204 + assert not Competition.objects.filter(pk=self.comp.pk).exists() + class PhaseMigrationTests(APITestCase): def setUp(self): From 57215d112f9be52d5de70fe64b8c25fad9f2416b Mon Sep 17 00:00:00 2001 From: Ihsan Ullah Date: Tue, 13 Jun 2023 00:23:38 +0500 Subject: [PATCH 7/7] default value added for rank --- src/apps/competitions/unpackers/v1.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/apps/competitions/unpackers/v1.py b/src/apps/competitions/unpackers/v1.py index ed7c6dc85..449569667 100644 --- a/src/apps/competitions/unpackers/v1.py +++ b/src/apps/competitions/unpackers/v1.py @@ -143,7 +143,8 @@ def _unpack_leaderboards(self): except KeyError: raise CompetitionUnpackingException('Could not find leaderboards declared on the competition leaderboard') try: - columns = sorted([{'title': k, **v} for k, v in leaderboard['columns'].items()], key=lambda c: c['rank']) + # use rank = 1 if rank is not defined in .yaml file + columns = sorted([{'title': k, **v} for k, v in leaderboard['columns'].items()], key=lambda c: c.get('rank', 1)) except KeyError: raise CompetitionUnpackingException('Could not find columns declared on the competition leaderboard')