From 303538bf487fa29a2756a5f4e93be8dc95425653 Mon Sep 17 00:00:00 2001 From: "Edgar P. Burkhart" Date: Sun, 15 Jun 2025 13:34:37 +0200 Subject: [PATCH] Add MusicGameResults model and score calculation logic in GameEndView --- base/static/css/main.css | 6 ++ .../0020_alter_musikgame_options.py | 16 ------ ...lter_musikgame_options_musicgameresults.py | 55 +++++++++++++++++++ .../0021_alter_musicgameresults_score.py | 17 ++++++ game/models.py | 12 ++++ game/templates/game/musikgame_detail.html | 6 +- game/views.py | 22 +++++++- 7 files changed, 116 insertions(+), 18 deletions(-) delete mode 100644 game/migrations/0020_alter_musikgame_options.py create mode 100644 game/migrations/0020_alter_musikgame_options_musicgameresults.py create mode 100644 game/migrations/0021_alter_musicgameresults_score.py diff --git a/base/static/css/main.css b/base/static/css/main.css index f1133eb..80a38b2 100644 --- a/base/static/css/main.css +++ b/base/static/css/main.css @@ -160,4 +160,10 @@ table select { color: var(--pico-color-sand-300); } } + + .score { + font-weight: 900; + color: var(--pico-color-zinc-500); + margin-left: .5em; + } } diff --git a/game/migrations/0020_alter_musikgame_options.py b/game/migrations/0020_alter_musikgame_options.py deleted file mode 100644 index cd933d9..0000000 --- a/game/migrations/0020_alter_musikgame_options.py +++ /dev/null @@ -1,16 +0,0 @@ -# Generated by Django 5.2.3 on 2025-06-15 10:59 - -from django.db import migrations - - -class Migration(migrations.Migration): - dependencies = [ - ("game", "0019_alter_musikgame_options_musikgame_over"), - ] - - operations = [ - migrations.AlterModelOptions( - name="musikgame", - options={"ordering": ["over", "-date"]}, - ), - ] diff --git a/game/migrations/0020_alter_musikgame_options_musicgameresults.py b/game/migrations/0020_alter_musikgame_options_musicgameresults.py new file mode 100644 index 0000000..3af5916 --- /dev/null +++ b/game/migrations/0020_alter_musikgame_options_musicgameresults.py @@ -0,0 +1,55 @@ +# Generated by Django 5.2.3 on 2025-06-15 11:23 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("game", "0019_alter_musikgame_options_musikgame_over"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AlterModelOptions( + name="musikgame", + options={"ordering": ["over", "-date"]}, + ), + migrations.CreateModel( + name="MusicGameResults", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("score", models.PositiveIntegerField(default=0)), + ( + "game", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, to="game.musikgame" + ), + ), + ( + "player", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to=settings.AUTH_USER_MODEL, + ), + ), + ], + options={ + "ordering": ["-score"], + "constraints": [ + models.UniqueConstraint( + fields=("game", "player"), name="unique_result" + ) + ], + }, + ), + ] diff --git a/game/migrations/0021_alter_musicgameresults_score.py b/game/migrations/0021_alter_musicgameresults_score.py new file mode 100644 index 0000000..3166d4d --- /dev/null +++ b/game/migrations/0021_alter_musicgameresults_score.py @@ -0,0 +1,17 @@ +# Generated by Django 5.2.3 on 2025-06-15 11:33 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("game", "0020_alter_musikgame_options_musicgameresults"), + ] + + operations = [ + migrations.AlterField( + model_name="musicgameresults", + name="score", + field=models.IntegerField(default=0), + ), + ] diff --git a/game/models.py b/game/models.py index a4e1f91..bf57c6e 100644 --- a/game/models.py +++ b/game/models.py @@ -129,3 +129,15 @@ class MusicGameAnswer(models.Model): models.UniqueConstraint(fields=("game", "player"), name="unique_answer"), ] ordering = ["game"] + + +class MusicGameResults(models.Model): + game = models.ForeignKey(MusikGame, on_delete=models.CASCADE) + player = models.ForeignKey(User, on_delete=models.CASCADE) + score = models.IntegerField(default=0) + + class Meta: + constraints = [ + models.UniqueConstraint(fields=("game", "player"), name="unique_result") + ] + ordering = ["-score"] diff --git a/game/templates/game/musikgame_detail.html b/game/templates/game/musikgame_detail.html index f4720ef..5bf75d5 100644 --- a/game/templates/game/musikgame_detail.html +++ b/game/templates/game/musikgame_detail.html @@ -35,7 +35,11 @@ {% if musikgame.over %}
    - {% for player in musikgame.players.all %}
  1. {{ player.username }}
  2. {% endfor %} + {% for player in musikgame.musicgameresults_set.all %} +
  3. + {{ player.player.username }} {{ player.score }} +
  4. + {% endfor %}
{% else %}

{{ musikgame.players.all|join:", " }}

diff --git a/game/views.py b/game/views.py index 1e1cae0..b381b61 100644 --- a/game/views.py +++ b/game/views.py @@ -9,7 +9,7 @@ from django.contrib.auth.models import User from django.contrib.messages.views import SuccessMessageMixin from django.core.exceptions import PermissionDenied from django.db import IntegrityError -from django.db.models import Count, Q +from django.db.models import Count, F, Q from django.shortcuts import get_object_or_404, redirect from django.views import View from django.views.generic import TemplateView @@ -468,5 +468,25 @@ class GameEndView(LoginRequiredMixin, SingleObjectMixin, View): if not game.group.is_leader(request.user): raise PermissionDenied() game.over = True + + for player in game.players.all(): + score = ( + 100 + * player.musicgameanswer_set.filter(game__game=game) + .exclude(game__player=player) + .filter(game__player=F("answer")) + .count() + ) + score -= ( + 50 + * player.musicgameanswer_set.filter(game__game=game) + .filter(game__player=player) + .exclude(game__player=F("answer")) + .count() + ) + models.MusicGameResults.objects.create( + game=game, player=player, score=score + ) + game.save() return redirect("game_detail", pk)