Add game management features: create MusikGame model, implement game creation and detail views, and update group detail template

This commit is contained in:
Edgar P. Burkhart 2025-06-13 21:06:23 +02:00
parent 19e6eb32c8
commit f7baa91132
Signed by: edpibu
GPG key ID: 9833D3C5A25BD227
10 changed files with 275 additions and 2 deletions

View file

@ -1,3 +1,5 @@
import random
from django.contrib.auth.mixins import LoginRequiredMixin
from django.db.models import Count, Q
from django.http import JsonResponse
@ -88,3 +90,50 @@ class GroupRemoveMusicView(OwnerFilterMixin, SingleObjectMixin, View):
group = music.group
music.delete()
return redirect(group)
class GameCreateView(LoginRequiredMixin, CreateView):
model = models.MusikGame
form_class = forms.MusikGameForm
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs["group"] = self.kwargs["pk"]
return kwargs
def get_context_data(self, **kwargs):
data = super().get_context_data(**kwargs)
data["group"] = models.Group.objects.filter(owner=self.request.user).get(
pk=self.kwargs["pk"]
)
return data
def form_valid(self, form):
group = models.Group.objects.get(pk=self.kwargs["pk"])
form.instance.group = group
res = super().form_valid(form)
players = []
musics = []
for player in form.instance.players.all():
players += 2 * [player]
musics += random.sample(
list(
player.musicvideo_set.filter(group=group, blacklisted=False).all()
),
form.instance.n,
)
pm_list = list(zip(players, musics))
random.shuffle(pm_list)
for (player, music), order in zip(pm_list, range(len(pm_list))):
models.MusicGameOrder.objects.create(
game=form.instance, player=player, music_video=music, order=order
)
return res
class GameDetailView(LoginRequiredMixin, DetailView):
model = models.MusikGame
def get_queryset(self):
return super().get_queryset().filter(group__owner=self.request.user)