From 1ffda1a5c4ce2409b93589f1048a95c1c56e5fed Mon Sep 17 00:00:00 2001 From: Ludovic Stephan Date: Mon, 14 Sep 2020 11:40:21 +0200 Subject: [PATCH] Better uniqueness checks --- .../migrations/0017_petitscours_uniqueness.py | 19 ++++++++++++++ petitscours/forms.py | 26 +------------------ petitscours/models.py | 1 + 3 files changed, 21 insertions(+), 25 deletions(-) create mode 100644 gestioncof/migrations/0017_petitscours_uniqueness.py diff --git a/gestioncof/migrations/0017_petitscours_uniqueness.py b/gestioncof/migrations/0017_petitscours_uniqueness.py new file mode 100644 index 00000000..32b66a94 --- /dev/null +++ b/gestioncof/migrations/0017_petitscours_uniqueness.py @@ -0,0 +1,19 @@ +# Generated by Django 2.2.12 on 2020-09-14 09:39 + +from django.conf import settings +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("gestioncof", "0016_unique_clippers"), + ] + + operations = [ + migrations.AlterUniqueTogether( + name="petitcoursability", + unique_together={("user", "niveau", "matiere")}, + ), + ] diff --git a/petitscours/forms.py b/petitscours/forms.py index 5309b41d..01d4178a 100644 --- a/petitscours/forms.py +++ b/petitscours/forms.py @@ -2,34 +2,11 @@ from captcha.fields import ReCaptchaField from django import forms from django.contrib.auth.models import User from django.forms import ModelForm -from django.forms.models import BaseInlineFormSet, inlineformset_factory +from django.forms.models import inlineformset_factory from petitscours.models import PetitCoursAbility, PetitCoursDemande -class BaseMatieresFormSet(BaseInlineFormSet): - def clean(self): - super().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"}) @@ -58,5 +35,4 @@ MatieresFormSet = inlineformset_factory( User, PetitCoursAbility, fields=("matiere", "niveau", "agrege"), - formset=BaseMatieresFormSet, ) diff --git a/petitscours/models.py b/petitscours/models.py index 27b5e931..b95e344c 100644 --- a/petitscours/models.py +++ b/petitscours/models.py @@ -46,6 +46,7 @@ class PetitCoursAbility(models.Model): app_label = "gestioncof" verbose_name = "Compétence petits cours" verbose_name_plural = "Compétences des petits cours" + unique_together = ("user", "niveau", "matiere") def __str__(self): return "{:s} - {!s} - {:s}".format(