232 lines
7.3 KiB
Python
232 lines
7.3 KiB
Python
import re
|
|
from datetime import date
|
|
from django import forms
|
|
from django.core.exceptions import ValidationError
|
|
from django.contrib.admin.widgets import FilteredSelectMultiple
|
|
|
|
from .models import (
|
|
Educative,
|
|
Skill,
|
|
Routine,
|
|
RoutineSkill,
|
|
TrainingRound,
|
|
GymnastTraining,
|
|
)
|
|
|
|
from .validators import is_valid_routine_type, is_valid_subset, is_valid_regexp
|
|
|
|
|
|
class SkillForm(forms.ModelForm):
|
|
class Meta:
|
|
model = Skill
|
|
fields = ("informations",)
|
|
widgets = {
|
|
"informations": forms.Textarea(
|
|
attrs={
|
|
"class": "form-control",
|
|
"placeholder": "Informations about the skill : attention point, methodology, biomecanics, …", # pylint: disable=line-too-long
|
|
}
|
|
),
|
|
}
|
|
|
|
|
|
class CombinationForm(forms.ModelForm):
|
|
class Meta:
|
|
model = Routine
|
|
fields = (
|
|
"long_label",
|
|
"short_label",
|
|
"difficulty",
|
|
"level",
|
|
"is_active",
|
|
"is_routine",
|
|
"is_competitive",
|
|
"informations",
|
|
)
|
|
widgets = {
|
|
"long_label": forms.TextInput(
|
|
attrs={"class": "form-control", "placeholder": "Routine's long name"}
|
|
),
|
|
"short_label": forms.TextInput(
|
|
attrs={"class": "form-control", "placeholder": "Routine's short name"}
|
|
),
|
|
"informations": forms.Textarea(
|
|
attrs={
|
|
"class": "form-control",
|
|
"placeholder": "Informations about the psychological state of mind : context (why, where, …), possible consequencies, …", # pylint: disable=line-too-long
|
|
}
|
|
),
|
|
"difficulty": forms.HiddenInput(),
|
|
"level": forms.HiddenInput(),
|
|
"is_active": forms.HiddenInput(),
|
|
}
|
|
|
|
|
|
class CombinationSkillForm(forms.ModelForm):
|
|
class Meta:
|
|
model = RoutineSkill
|
|
fields = (
|
|
"routine",
|
|
"skill",
|
|
"rank",
|
|
)
|
|
widgets = {
|
|
"routine": forms.HiddenInput(),
|
|
"skill": forms.HiddenInput(),
|
|
"rank": forms.NumberInput(),
|
|
}
|
|
|
|
|
|
class TrainingRoundForm(forms.ModelForm):
|
|
|
|
educatives = forms.ModelMultipleChoiceField(
|
|
required=False,
|
|
queryset=Educative.objects.all(),
|
|
widget=FilteredSelectMultiple("Educatives", is_stacked=False),
|
|
# widget=customFilteredSelectMultiple(verbose_name='test2',is_stacked=False)
|
|
)
|
|
|
|
class Media:
|
|
css = {
|
|
"all": ["admin/css/widgets.css"],
|
|
}
|
|
js = ["/admin/jsi18n/"]
|
|
|
|
class Meta:
|
|
model = TrainingRound
|
|
fields = ("label", "regexp", "educatives", "informations")
|
|
|
|
widgets = {
|
|
"label": forms.TextInput(
|
|
attrs={
|
|
"class": "form-control",
|
|
"placeholder": "Label (not mandatory)",
|
|
"maxlength": 30,
|
|
}
|
|
),
|
|
"regexp": forms.TextInput(attrs={"class": "form-control"}),
|
|
"informations": forms.Textarea(
|
|
attrs={
|
|
"class": "form-control",
|
|
"placeholder": "Informations about the passe…", # pylint: disable=line-too-long
|
|
}
|
|
),
|
|
}
|
|
|
|
def clean_regexp(self):
|
|
"""Vérifie que la regexp entrée par l'utilisateur est valide."""
|
|
print(self.cleaned_data)
|
|
regexp = self.cleaned_data["regexp"]
|
|
if not is_valid_regexp(regexp):
|
|
raise ValidationError("Entered regexp not valid.")
|
|
|
|
return regexp
|
|
|
|
def clean(self):
|
|
"""Vérifie le contenu des champs `educatives` par rapport à la valeur de `regexp`. Si
|
|
`regexp` est définie par :
|
|
- valeurs de ROUTINE_TYPE_CHOICE il faut que Educatives soit VIDE
|
|
- avec [x-y]
|
|
- [x-y] " Educatives soit NON VIDE
|
|
- WC " il y ait 2+ Educatives
|
|
- x| " il y ait 1! Educatives
|
|
"""
|
|
cleaned_data = super().clean()
|
|
regexp = cleaned_data["regexp"]
|
|
|
|
if not regexp:
|
|
arguments = regexp.split(" ")
|
|
educatives = cleaned_data["educatives"]
|
|
|
|
if is_valid_routine_type(arguments[0]) and educatives:
|
|
raise ValidationError(
|
|
"Educatives must be empty with the entered Regexp."
|
|
)
|
|
|
|
if is_valid_subset(arguments[0]) and educatives is None:
|
|
raise ValidationError(
|
|
"Educatives can't be empty with the entered Regexp."
|
|
)
|
|
|
|
if re.match(r"[1-9]+\|", arguments[0]) and len(educatives) != 1:
|
|
raise ValidationError(
|
|
"One and only one Educatives allowed with the entered Regexp."
|
|
)
|
|
|
|
if arguments[0] == "WC" and (educatives is None or len(educatives) < 2):
|
|
raise ValidationError(
|
|
"At least two Educatives with the entered Regexp."
|
|
)
|
|
|
|
return cleaned_data
|
|
|
|
# def save_model(self, request, obj, form, change):
|
|
# obj.save()
|
|
# for educative in form.cleaned_data["educatives"]:
|
|
# print(educative)
|
|
# book = Book.objects.get(pk=bk.id)
|
|
# book.quantity -= 1
|
|
# if book.quantity == 0:
|
|
# book.sold = True;
|
|
# book.save()
|
|
|
|
class GymnastTrainingForm(forms.ModelForm):
|
|
|
|
# trainingrounds = forms.ModelMultipleChoiceField(
|
|
# required=False,
|
|
# queryset=Educative.objects.all(),
|
|
# widget=FilteredSelectMultiple("TrainingRound", is_stacked=False),
|
|
# # widget=customFilteredSelectMultiple(verbose_name='test2',is_stacked=False)
|
|
# )
|
|
|
|
# class Media:
|
|
# css = {
|
|
# "all": ["admin/css/widgets.css"],
|
|
# }
|
|
# js = ["/admin/jsi18n/"]
|
|
|
|
class Meta:
|
|
model = GymnastTraining
|
|
fields = (
|
|
"date",
|
|
"label",
|
|
"gymnast",
|
|
# "trainingrounds",
|
|
"informations",
|
|
)
|
|
|
|
widgets = {
|
|
"gymnast": forms.HiddenInput(),
|
|
"date": forms.DateInput(
|
|
attrs={
|
|
"class": "form-control datepicker",
|
|
"placeholder": date.today().strftime("%Y-%m-%d"),
|
|
"value": date.today().strftime("%Y-%m-%d"),
|
|
}
|
|
),
|
|
"label": forms.TextInput(
|
|
attrs={
|
|
"class": "form-control",
|
|
"placeholder": "Label (not mandatory)",
|
|
"maxlength": 30,
|
|
}
|
|
),
|
|
"informations": forms.Textarea(
|
|
attrs={
|
|
"class": "form-control",
|
|
"placeholder": "Informations about the passe…", # pylint: disable=line-too-long
|
|
}
|
|
),
|
|
}
|
|
|
|
gymnast_related = forms.CharField(
|
|
required=False,
|
|
widget=forms.TextInput(
|
|
attrs={
|
|
"class": "form-control",
|
|
"placeholder": "Searching…",
|
|
"data-ref": "#id_gymnast",
|
|
}
|
|
),
|
|
)
|