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 %}
|
{% 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>
|
||||||
|
|
|
@ -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)
|
|
||||||
)
|
|
||||||
|
|
|
@ -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))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue