Refactor form handling and improve group retrieval in game views

This commit is contained in:
Edgar P. Burkhart 2025-06-14 15:46:43 +02:00
parent 04b0a30e76
commit 4b331f7968
Signed by: edpibu
GPG key ID: 9833D3C5A25BD227
3 changed files with 34 additions and 23 deletions

View file

@ -1,16 +1,18 @@
{% for error in form.non_field_errors %}<article class="message error">{{ error }}</article>{% endfor %} {% for error in form.non_field_errors %}<article class="message error">{{ error }}</article>{% endfor %}
<form method="post" {% if action %}action="{% url action %}"{% endif %}> <form method="post" {% if action %}action="{% url action %}"{% endif %}>
{% csrf_token %} {% csrf_token %}
<fieldset> {% for field in form %}
{% for field in form %} <fieldset>
<label> {% if field.id_for_label %}
{{ field.label }} <label for="{{ field.id_for_label }}">{{ field.label }}</label>
{{ field }} {% else %}
{% if field.errors %} <legend>{{ field.label }}</legend>
<small id="{{ field.errors.field_id }}_error" class="form-error">{{ field.errors|join:", " }}</small> {% endif %}
{% endif %} {{ field }}
</label> {% if field.errors %}
{% endfor %} <small id="{{ field.errors.field_id }}_error" class="form-error">{{ field.errors|join:", " }}</small>
</fieldset> {% endif %}
</fieldset>
{% endfor %}
<input type="submit" {% if submit %}value="{{ submit }}"{% endif %}> <input type="submit" {% if submit %}value="{{ submit }}"{% endif %}>
</form> </form>

View file

@ -19,10 +19,13 @@ class MusikGameForm(forms.ModelForm):
class Meta: class Meta:
model = models.MusikGame model = models.MusikGame
fields = ["players", "n"] fields = ["players", "n"]
widgets = {
"players": forms.CheckboxSelectMultiple,
}
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
group = models.Group.objects.get(pk=kwargs.pop("group", None)) 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) super().__init__(*args, **kwargs)
self.fields["players"].queryset = ( self.fields["players"].queryset = players
group.members.all() | models.User.objects.filter(id=group.owner.id)
)

View file

@ -8,7 +8,7 @@ from django.contrib.auth.models import User
from django.contrib.messages.views import SuccessMessageMixin from django.contrib.messages.views import SuccessMessageMixin
from django.db import IntegrityError from django.db import IntegrityError
from django.db.models import Count, Q 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 import View
from django.views.generic.detail import DetailView, SingleObjectMixin from django.views.generic.detail import DetailView, SingleObjectMixin
from django.views.generic.edit import CreateView, DeleteView, UpdateView from django.views.generic.edit import CreateView, DeleteView, UpdateView
@ -250,24 +250,30 @@ class GameCreateView(LoginRequiredMixin, CreateView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
data = super().get_context_data(**kwargs) data = super().get_context_data(**kwargs)
data["group"] = models.Group.objects.filter(owner=self.request.user).get( data["group"] = get_object_or_404(
pk=self.kwargs["pk"] models.Group, owner=self.request.user, pk=self.kwargs["pk"]
) )
return data return data
def form_valid(self, form): 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 form.instance.group = group
res = super().form_valid(form) res = super().form_valid(form)
players = [] players = []
musics = [] musics = []
n = form.instance.n
for player in form.instance.players.all(): 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( musics += random.sample(
list( list(music_set.all()),
player.musicvideo_set.filter(group=group, blacklisted=False).all() n,
),
form.instance.n,
) )
pm_list = list(zip(players, musics)) pm_list = list(zip(players, musics))