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