From ecb8eb37a69cb717abb5cb9373c9c6dc3871b396 Mon Sep 17 00:00:00 2001 From: FarmerJohnsBessie Date: Thu, 1 Aug 2024 16:50:46 -0700 Subject: [PATCH] added status for tournament participation and added finish tournament stuff --- .../0033_tournamentparticipation_status.py | 19 +++++++++++++++++++ api/models.py | 1 + api/serializers.py | 13 +++++++++++++ api/tournaments_views.py | 18 +++++++++++------- api/urls.py | 2 +- 5 files changed, 45 insertions(+), 8 deletions(-) create mode 100644 api/migrations/0033_tournamentparticipation_status.py diff --git a/api/migrations/0033_tournamentparticipation_status.py b/api/migrations/0033_tournamentparticipation_status.py new file mode 100644 index 00000000..b64e9ebf --- /dev/null +++ b/api/migrations/0033_tournamentparticipation_status.py @@ -0,0 +1,19 @@ +# Generated by Django 5.0.4 on 2024-08-01 23:50 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0032_tournamentparticipation_last_correct_submission'), + ] + + operations = [ + migrations.AddField( + model_name='tournamentparticipation', + name='status', + field=models.CharField(choices=[('Active', 'Active'), ('Completed', 'Completed')], default='Active', max_length=10), + preserve_default=False, + ), + ] diff --git a/api/models.py b/api/models.py index 8a773e08..b67ede39 100644 --- a/api/models.py +++ b/api/models.py @@ -251,6 +251,7 @@ class TournamentParticipation(models.Model): end_time = models.DateTimeField(null=True, blank=True) score = models.IntegerField(default=0) last_correct_submission = models.DurationField(null=True, blank=True) + status = models.CharField(max_length=10, choices=[('Active', 'Active'), ('Completed', 'Completed')]) def __str__(self): return f"{self.user.username} in {self.tournament.name}" diff --git a/api/serializers.py b/api/serializers.py index ac5e1bf8..8e827930 100644 --- a/api/serializers.py +++ b/api/serializers.py @@ -144,3 +144,16 @@ class TournamentQuestionSerializer(serializers.ModelSerializer): class Meta: model = TournamentQuestion fields = ['id', 'participation', 'question', 'status', 'time_taken'] + + +class TPSubmitAnswerSerializer(serializers.ModelSerializer): + tournament_questions = serializers.SerializerMethodField() + user = UserSerializer() + class Meta: + model = TournamentParticipation + fields = ['id', 'user', 'score', 'last_correct_submission', 'tournament_questions'] + + def get_tournament_questions(self, obj): + # Retrieve and order the questions by ID + questions = obj.tournamentquestion_set.all().order_by('id') + return TournamentQuestionSerializer(questions, many=True).data diff --git a/api/tournaments_views.py b/api/tournaments_views.py index 8fa88f01..d83974e3 100644 --- a/api/tournaments_views.py +++ b/api/tournaments_views.py @@ -7,7 +7,7 @@ from api.models import Tournament, TournamentParticipation, Question, TournamentQuestion, Profile from api.serializers import TournamentSerializer, TournamentParticipationSerializer, TournamentQuestionSerializer, \ - ProfileSerializer + ProfileSerializer, TPSubmitAnswerSerializer @api_view(['GET', 'POST']) @@ -56,7 +56,8 @@ def join_tournament(request, pk): user=user, tournament=tournament, start_time=timezone.now(), - end_time=timezone.now() + duration + end_time=timezone.now() + duration, + status='Active' ) questions = tournament.questions.all() @@ -97,8 +98,9 @@ def get_tournament_questions(request, pk): @permission_classes([IsAuthenticated]) def tournament_leaderboard(request, pk): tournament = get_object_or_404(Tournament, pk=pk) - participations = TournamentParticipation.objects.filter(tournament=tournament).order_by('-score') - serializer = TournamentParticipationSerializer(participations, many=True) + participations = TournamentParticipation.objects.filter(tournament=tournament).order_by('-score', + 'last_correct_submission') + serializer = TPSubmitAnswerSerializer(participations, many=True) return Response(serializer.data) @@ -129,7 +131,7 @@ def submit_answer(request, pk): # Update the score of the user if is_correct: participation.score += 1 - participation.last_correct_submission = timezone.now()-participation.start_time + participation.last_correct_submission = timezone.now() - participation.start_time participation.save() serializer = TournamentQuestionSerializer(tournament_question) @@ -139,8 +141,10 @@ def submit_answer(request, pk): @api_view(['POST']) @permission_classes([IsAuthenticated]) def finish_participation(request, pk): - participation = get_object_or_404(TournamentParticipation, pk=pk) - participation.end_time = timezone.now() + tournament = get_object_or_404(Tournament, pk=pk) + user = request.user + participation = get_object_or_404(TournamentParticipation, user=user, tournament=tournament) + participation.status = 'Completed' participation.save() serializer = TournamentParticipationSerializer(participation) return Response(serializer.data) diff --git a/api/urls.py b/api/urls.py index aaa75246..a0d2e750 100644 --- a/api/urls.py +++ b/api/urls.py @@ -59,7 +59,7 @@ path('tournaments//questions/', tournaments_views.get_tournament_questions, name='get-tournament-questions'), path('tournaments//leaderboard/', tournaments_views.tournament_leaderboard, name='tournament-leaderboard'), path('tournaments//submit-answer/', tournaments_views.submit_answer, name='submit-answer'), - path('participations//finish/', tournaments_views.finish_participation, name='finish-participation'), + path('tournaments//finish/', tournaments_views.finish_participation, name='finish-participation'), path('token/', TokenObtainPairView.as_view(), name='token_obtain_pair'), path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),