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, GymnastTrainingRound ) 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", "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", } ), ) class GymnastTrainingRoundForm(forms.ModelForm): class Meta: model = GymnastTrainingRound fields = ( "gymnast_training", "training_round", "repetition", "rank", ) widgets = { "gymnast_training": forms.HiddenInput(), "training_round": forms.HiddenInput(), "repetition": forms.NumberInput(), "rank": forms.NumberInput(), }