diff --git a/base/templates/base/form.html b/base/templates/base/form.html index 979daa3..cedaca0 100644 --- a/base/templates/base/form.html +++ b/base/templates/base/form.html @@ -1,16 +1,18 @@ {% for error in form.non_field_errors %}
{{ error }}
{% endfor %}
{% csrf_token %} -
- {% for field in form %} - - {% endfor %} -
+ {% for field in form %} +
+ {% if field.id_for_label %} + + {% else %} + {{ field.label }} + {% endif %} + {{ field }} + {% if field.errors %} + {{ field.errors|join:", " }} + {% endif %} +
+ {% endfor %}
diff --git a/game/forms.py b/game/forms.py index 24d2b38..99a18cf 100644 --- a/game/forms.py +++ b/game/forms.py @@ -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 diff --git a/game/views.py b/game/views.py index 09bad7d..41a05ed 100644 --- a/game/views.py +++ b/game/views.py @@ -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))