Refactor form handling and improve group retrieval in game views
This commit is contained in:
parent
04b0a30e76
commit
4b331f7968
3 changed files with 34 additions and 23 deletions
|
@ -19,10 +19,13 @@ class MusikGameForm(forms.ModelForm):
|
|||
class Meta:
|
||||
model = models.MusikGame
|
||||
fields = ["players", "n"]
|
||||
widgets = {
|
||||
"players": forms.CheckboxSelectMultiple,
|
||||
}
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
group = models.Group.objects.get(pk=kwargs.pop("group", None))
|
||||
players = group.members.all() | models.User.objects.filter(id=group.owner.id)
|
||||
kwargs["initial"].setdefault("players", players)
|
||||
super().__init__(*args, **kwargs)
|
||||
self.fields["players"].queryset = (
|
||||
group.members.all() | models.User.objects.filter(id=group.owner.id)
|
||||
)
|
||||
self.fields["players"].queryset = players
|
||||
|
|
|
@ -8,7 +8,7 @@ from django.contrib.auth.models import User
|
|||
from django.contrib.messages.views import SuccessMessageMixin
|
||||
from django.db import IntegrityError
|
||||
from django.db.models import Count, Q
|
||||
from django.shortcuts import redirect
|
||||
from django.shortcuts import get_object_or_404, redirect
|
||||
from django.views import View
|
||||
from django.views.generic.detail import DetailView, SingleObjectMixin
|
||||
from django.views.generic.edit import CreateView, DeleteView, UpdateView
|
||||
|
@ -250,24 +250,30 @@ class GameCreateView(LoginRequiredMixin, CreateView):
|
|||
|
||||
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"]
|
||||
data["group"] = get_object_or_404(
|
||||
models.Group, owner=self.request.user, pk=self.kwargs["pk"]
|
||||
)
|
||||
return data
|
||||
|
||||
def form_valid(self, form):
|
||||
group = models.Group.objects.get(pk=self.kwargs["pk"])
|
||||
group = get_object_or_404(
|
||||
models.Group, owner=self.request.user, pk=self.kwargs["pk"]
|
||||
)
|
||||
form.instance.group = group
|
||||
res = super().form_valid(form)
|
||||
players = []
|
||||
musics = []
|
||||
n = form.instance.n
|
||||
for player in form.instance.players.all():
|
||||
players += form.instance.n * [player]
|
||||
music_set = player.musicvideo_set.filter(group=group, blacklisted=False)
|
||||
if music_set.count() < n:
|
||||
form.instance.delete()
|
||||
form.add_error("n", f"{player} n'a pas assez de musiques.")
|
||||
return super().form_invalid(form)
|
||||
players += n * [player]
|
||||
musics += random.sample(
|
||||
list(
|
||||
player.musicvideo_set.filter(group=group, blacklisted=False).all()
|
||||
),
|
||||
form.instance.n,
|
||||
list(music_set.all()),
|
||||
n,
|
||||
)
|
||||
|
||||
pm_list = list(zip(players, musics))
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue