Update game answer handling and UI for completed games

This commit is contained in:
Edgar P. Burkhart 2025-06-15 13:59:22 +02:00
parent 303538bf48
commit 3d585e1e14
Signed by: edpibu
GPG key ID: 9833D3C5A25BD227
4 changed files with 29 additions and 10 deletions

View file

@ -57,4 +57,5 @@ class AnswerForm(forms.Form):
if (ma := music.musicgameanswer_set.filter(player=user).first())
and ma.answer
else "",
disabled=game.over,
)

View file

@ -21,6 +21,6 @@
{% endfor %}
</tbody>
</table>
<button type="submit">Valider mes réponses</button>
{% if not musikgame.over %}<button type="submit">Valider mes réponses</button>{% endif %}
</form>
{% endblock content %}

View file

@ -17,7 +17,11 @@
href="{% yt_playlist musikgame %}"
role="button"
{% if musikgame.playlist_loading %}aria-busy="true"{% endif %}><i class="ri-youtube-fill"></i> Playlist</a>
{% if not musikgame.over %}
{% if musikgame.over %}
<a href="{% url "game_answer" musikgame.pk %}"
role="button"
class="secondary"><i class="ri-play-list-2-fill"></i> Mes réponses</a>
{% else %}
<a href="{% url "game_answer" musikgame.pk %}" role="button"><i class="ri-play-list-2-fill"></i> Répondre</a>
{% endif %}
</fieldset>

View file

@ -434,7 +434,7 @@ class GameAnswerView(LoginRequiredMixin, DetailView):
template_name = "game/musikgame_answer.html"
def get_queryset(self):
return super().get_queryset().filter(over=False, players=self.request.user)
return super().get_queryset().filter(players=self.request.user)
def get_context_data(self, **kwargs):
return super().get_context_data(**kwargs) | {
@ -443,6 +443,8 @@ class GameAnswerView(LoginRequiredMixin, DetailView):
def post(self, request, pk):
game = self.get_object()
if game.over:
raise PermissionDenied()
for music in game.musicgameorder_set.all():
answer = request.POST.get(f"answer-{music.order}")
if answer:
@ -469,16 +471,28 @@ class GameEndView(LoginRequiredMixin, SingleObjectMixin, View):
raise PermissionDenied()
game.over = True
value = {}
for go in game.musicgameorder_set.all():
value[go.pk] = 1000 / (
1
+ (
(go.musicgameanswer_set.filter(game__player=F("answer")).count())
- 1 / game.players.count()
)
** 2
)
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 = sum(
[
value[ga.game.pk]
for ga in player.musicgameanswer_set.filter(game__game=game)
.exclude(game__player=player)
.filter(game__player=F("answer"))
]
)
score -= (
50
500
* player.musicgameanswer_set.filter(game__game=game)
.filter(game__player=player)
.exclude(game__player=F("answer"))