diff --git a/base/static/css/main.css b/base/static/css/main.css index 90e5032..219394c 100644 --- a/base/static/css/main.css +++ b/base/static/css/main.css @@ -117,6 +117,9 @@ h6, i.i { margin-right: .5em; } +i.hl { + color: var(--pico-primary); +} footer { text-align: center; diff --git a/game/migrations/0019_alter_musikgame_options_musikgame_over.py b/game/migrations/0019_alter_musikgame_options_musikgame_over.py new file mode 100644 index 0000000..f5e4489 --- /dev/null +++ b/game/migrations/0019_alter_musikgame_options_musikgame_over.py @@ -0,0 +1,21 @@ +# Generated by Django 5.2.3 on 2025-06-15 10:44 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("game", "0018_musicgameanswer"), + ] + + operations = [ + migrations.AlterModelOptions( + name="musikgame", + options={"ordering": ["-over", "-date"]}, + ), + migrations.AddField( + model_name="musikgame", + name="over", + field=models.BooleanField(default=False), + ), + ] diff --git a/game/migrations/0020_alter_musikgame_options.py b/game/migrations/0020_alter_musikgame_options.py new file mode 100644 index 0000000..cd933d9 --- /dev/null +++ b/game/migrations/0020_alter_musikgame_options.py @@ -0,0 +1,16 @@ +# 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/models.py b/game/models.py index 6f4e672..a4e1f91 100644 --- a/game/models.py +++ b/game/models.py @@ -74,10 +74,14 @@ class MusikGame(models.Model): players = models.ManyToManyField(User, verbose_name="Joueurs") playlist = models.CharField(blank=True, verbose_name="Playlist YouTube") playlist_loading = models.BooleanField(default=False) + over = models.BooleanField(default=False) def get_absolute_url(self): return reverse("game_detail", kwargs={"pk": self.pk}) + class Meta: + ordering = ["over", "-date"] + @receiver(post_save, sender=MusikGame) def generateYoutubePlaylist(sender, instance, created, **kwargs): diff --git a/game/templates/game/group_detail.html b/game/templates/game/group_detail.html index d523f29..3812b6e 100644 --- a/game/templates/game/group_detail.html +++ b/game/templates/game/group_detail.html @@ -10,52 +10,7 @@ {{ group.name }} {% include "game/include/group_buttons.html" %} - {% if group.musikgame_set.exists %} -

- Parties -

-
- {% csrf_token %} - - - {% if group.owner == user %}{% endif %} - - - - - - {% for game in group.musikgame_set.all %} - - {% if group.owner == user %} - - {% endif %} - - - - - {% endfor %} - -
Date - Playlists - Joueurs
- - - {{ game.date }} - - {% if game.playlist %} - Playlist - {% endif %} - {{ game.players.all|join:", " }}
- {% if group.owner == user %} - - {% endif %} -
- {% endif %} + {% include "game/include/group_games.html" %} {% include "game/include/group_members.html" %}

Mes musiques {{ musics.count }} diff --git a/game/templates/game/include/group_games.html b/game/templates/game/include/group_games.html new file mode 100644 index 0000000..09ad49a --- /dev/null +++ b/game/templates/game/include/group_games.html @@ -0,0 +1,57 @@ +{% load form youtube %} +{% if group.musikgame_set.exists %} +

+ Parties +

+
+ {% csrf_token %} + + + {% if group.owner == user %}{% endif %} + + + + + + + {% for game in group.musikgame_set.all %} + + {% if group.owner == user %} + + {% endif %} + + + + + + {% endfor %} + +
+ + Date + Playlists + Joueurs
+ + + {% if game.over %} + + {% else %} + + {% endif %} + + {{ game.date }} + + {% if game.playlist %} + Playlist + {% endif %} + {{ game.players.all|join:", " }}
+ {% if group.owner == user %} + + {% endif %} +
+{% endif %} diff --git a/game/templates/game/musikgame_detail.html b/game/templates/game/musikgame_detail.html index 77f424c..0d84cda 100644 --- a/game/templates/game/musikgame_detail.html +++ b/game/templates/game/musikgame_detail.html @@ -2,18 +2,33 @@ {% load youtube %} {% block content %}

- {{ musikgame.date }} + {% if musikgame.over %} + + {% else %} + + {% endif %} + {{ musikgame.date }}

{% if musikgame.playlist or musikgame.playlist_loading %} -

- Playlist - Répondre -

+
+ {% csrf_token %} +
+ Playlist + {% if not musikgame.over %} + Répondre + {% endif %} +
+ {% if is_leader and not musikgame.over %} +
+ +
+ {% endif %} +
{% endif %}

Joueurs @@ -34,38 +49,40 @@ {% endfor %} -

- Résultats -

-
- - Résultats - - - - - - - - - - - {% for music in musikgame.musicgameorder_set.all %} + {% if musikgame.over %} +

+ Résultats +

+
+ + Résultats + +
- - - Musique - - Joueur -
+ - - - + + + - {% endfor %} - -
{{ music.order }} - {{ music.music_video.title }} - {{ music.player }} + + + Musique + + Joueur +
-
+ + + {% for music in musikgame.musicgameorder_set.all %} + + {{ music.order }} + + {{ music.music_video.title }} + + {{ music.player }} + + {% endfor %} + + + + {% endif %} {% endblock content %} diff --git a/game/urls.py b/game/urls.py index 15b8d3e..927dc79 100644 --- a/game/urls.py +++ b/game/urls.py @@ -68,4 +68,5 @@ urlpatterns = [ views.GameAnswerView.as_view(), name="game_answer", ), + path("group/game//end/", views.GameEndView.as_view(), name="game_end"), ] diff --git a/game/views.py b/game/views.py index 3ebb49b..1e1cae0 100644 --- a/game/views.py +++ b/game/views.py @@ -344,6 +344,12 @@ class GameDetailView(LoginRequiredMixin, DetailView): .distinct() ) + def get_context_data(self, **kwargs): + data = super().get_context_data(**kwargs) + data["is_leader"] = data["musikgame"].group.is_leader(self.request.user) + data["is_owner"] = data["musikgame"].group.is_owner(self.request.user) + return data + class YoutubeCallbackView(LoginRequiredMixin, View): def get(self, request): @@ -428,7 +434,7 @@ class GameAnswerView(LoginRequiredMixin, DetailView): template_name = "game/musikgame_answer.html" def get_queryset(self): - return super().get_queryset().filter(players=self.request.user) + return super().get_queryset().filter(over=False, players=self.request.user) def get_context_data(self, **kwargs): return super().get_context_data(**kwargs) | { @@ -452,3 +458,15 @@ class GameAnswerView(LoginRequiredMixin, DetailView): defaults={"answer": None}, ) return redirect("game_answer", pk) + + +class GameEndView(LoginRequiredMixin, SingleObjectMixin, View): + model = models.MusikGame + + def post(self, request, pk): + game = self.get_object() + if not game.group.is_leader(request.user): + raise PermissionDenied() + game.over = True + game.save() + return redirect("game_detail", pk)