Better uniqueness checks

This commit is contained in:
Ludovic Stephan 2020-09-14 11:40:21 +02:00
parent 2bc97a115c
commit 1ffda1a5c4
3 changed files with 21 additions and 25 deletions

View file

@ -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")},
),
]

View file

@ -2,34 +2,11 @@ from captcha.fields import ReCaptchaField
from django import forms from django import forms
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.forms import ModelForm 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 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): class DemandeForm(ModelForm):
captcha = ReCaptchaField(attrs={"theme": "clean", "lang": "fr"}) captcha = ReCaptchaField(attrs={"theme": "clean", "lang": "fr"})
@ -58,5 +35,4 @@ MatieresFormSet = inlineformset_factory(
User, User,
PetitCoursAbility, PetitCoursAbility,
fields=("matiere", "niveau", "agrege"), fields=("matiere", "niveau", "agrege"),
formset=BaseMatieresFormSet,
) )

View file

@ -46,6 +46,7 @@ class PetitCoursAbility(models.Model):
app_label = "gestioncof" app_label = "gestioncof"
verbose_name = "Compétence petits cours" verbose_name = "Compétence petits cours"
verbose_name_plural = "Compétences des petits cours" verbose_name_plural = "Compétences des petits cours"
unique_together = ("user", "niveau", "matiere")
def __str__(self): def __str__(self):
return "{:s} - {!s} - {:s}".format( return "{:s} - {!s} - {:s}".format(