diff --git a/gestioncof/petits_cours_forms.py b/gestioncof/petits_cours_forms.py new file mode 100644 index 00000000..dfb7a263 --- /dev/null +++ b/gestioncof/petits_cours_forms.py @@ -0,0 +1,54 @@ +# -*- coding: utf-8 -*- + +from captcha.fields import ReCaptchaField + +from django import forms +from django.forms import ModelForm +from django.forms.models import inlineformset_factory, BaseInlineFormSet +from django.contrib.auth.models import User + +from gestioncof.petits_cours_models import PetitCoursDemande, PetitCoursAbility + + +class BaseMatieresFormSet(BaseInlineFormSet): + def clean(self): + super(BaseMatieresFormSet, self).clean() + if any(self.errors): + # Don't bother validating the formset unless each form is + # valid on its own + return + matieres = [] + for i in range(0, self.total_form_count()): + form = self.forms[i] + if not form.cleaned_data: + continue + matiere = form.cleaned_data['matiere'] + niveau = form.cleaned_data['niveau'] + delete = form.cleaned_data['DELETE'] + if not delete and (matiere, niveau) in matieres: + raise forms.ValidationError( + "Vous ne pouvez pas vous inscrire deux fois pour la " + "même matiere avec le même niveau.") + matieres.append((matiere, niveau)) + + +class DemandeForm(ModelForm): + captcha = ReCaptchaField(attrs={'theme': 'clean', 'lang': 'fr'}) + + def __init__(self, *args, **kwargs): + super(DemandeForm, self).__init__(*args, **kwargs) + self.fields['matieres'].help_text = '' + + class Meta: + model = PetitCoursDemande + fields = ('name', 'email', 'phone', 'quand', 'freq', 'lieu', + 'matieres', 'agrege_requis', 'niveau', 'remarques') + widgets = {'matieres': forms.CheckboxSelectMultiple} + + +MatieresFormSet = inlineformset_factory( + User, + PetitCoursAbility, + fields=("matiere", "niveau", "agrege"), + formset=BaseMatieresFormSet +) diff --git a/gestioncof/petits_cours_views.py b/gestioncof/petits_cours_views.py index 68befaf7..ec32358d 100644 --- a/gestioncof/petits_cours_views.py +++ b/gestioncof/petits_cours_views.py @@ -6,9 +6,6 @@ from datetime import datetime from django.shortcuts import render, get_object_or_404, redirect from django.core import mail from django.core.mail import EmailMessage -from django.forms import ModelForm -from django import forms -from django.forms.models import inlineformset_factory, BaseInlineFormSet from django.contrib.auth.models import User from django.views.generic import ListView from django.utils.decorators import method_decorator @@ -22,11 +19,10 @@ from gestioncof.petits_cours_models import ( PetitCoursDemande, PetitCoursAttribution, PetitCoursAttributionCounter, PetitCoursAbility, PetitCoursSubject ) +from gestioncof.petits_cours_forms import DemandeForm, MatieresFormSet from gestioncof.decorators import buro_required from gestioncof.shared import lock_table, unlock_tables -from captcha.fields import ReCaptchaField - class DemandeListView(ListView): model = PetitCoursDemande @@ -288,37 +284,11 @@ def _traitement_post(request, demande): }) -class BaseMatieresFormSet(BaseInlineFormSet): - def clean(self): - super(BaseMatieresFormSet, self).clean() - if any(self.errors): - # Don't bother validating the formset unless each form is - # valid on its own - return - matieres = [] - for i in range(0, self.total_form_count()): - form = self.forms[i] - if not form.cleaned_data: - continue - matiere = form.cleaned_data['matiere'] - niveau = form.cleaned_data['niveau'] - delete = form.cleaned_data['DELETE'] - if not delete and (matiere, niveau) in matieres: - raise forms.ValidationError( - "Vous ne pouvez pas vous inscrire deux fois pour la " - "même matiere avec le même niveau.") - matieres.append((matiere, niveau)) - - @login_required def inscription(request): profile, created = CofProfile.objects.get_or_create(user=request.user) if not profile.is_cof: return redirect("cof-denied") - MatieresFormSet = inlineformset_factory(User, PetitCoursAbility, - fields=("matiere", "niveau", - "agrege",), - formset=BaseMatieresFormSet) success = False if request.method == "POST": formset = MatieresFormSet(request.POST, instance=request.user) @@ -348,20 +318,6 @@ def inscription(request): "remarques": profile.petits_cours_remarques}) -class DemandeForm(ModelForm): - captcha = ReCaptchaField(attrs={'theme': 'clean', 'lang': 'fr'}) - - def __init__(self, *args, **kwargs): - super(DemandeForm, self).__init__(*args, **kwargs) - self.fields['matieres'].help_text = '' - - class Meta: - model = PetitCoursDemande - fields = ('name', 'email', 'phone', 'quand', 'freq', 'lieu', - 'matieres', 'agrege_requis', 'niveau', 'remarques') - widgets = {'matieres': forms.CheckboxSelectMultiple} - - @csrf_exempt def demande(request): success = False