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 %}
<form method="post" {% if action %}action="{% url action %}"{% endif %}>
{% csrf_token %}
<fieldset>
{% for field in form %}
<label>
{{ field.label }}
{{ field }}
{% if field.errors %}
<small id="{{ field.errors.field_id }}_error" class="form-error">{{ field.errors|join:", " }}</small>
{% endif %}
</label>
{% endfor %}
</fieldset>
{% for field in form %}
<fieldset>
{% if field.id_for_label %}
<label for="{{ field.id_for_label }}">{{ field.label }}</label>
{% else %}
<legend>{{ field.label }}</legend>
{% endif %}
{{ field }}
{% if field.errors %}
<small id="{{ field.errors.field_id }}_error" class="form-error">{{ field.errors|join:", " }}</small>
{% endif %}
</fieldset>
{% endfor %}
<input type="submit" {% if submit %}value="{{ submit }}"{% endif %}>
</form>

View file

@ -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

View file

@ -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))