Files
notytex/forms.py

85 lines
3.9 KiB
Python

from flask_wtf import FlaskForm
from flask_wtf.file import FileField, FileRequired, FileAllowed
from wtforms import StringField, TextAreaField, FloatField, SelectField, DateField, SubmitField, BooleanField
from wtforms.validators import DataRequired, Email, NumberRange, Optional, Length
from datetime import date
from typing import TYPE_CHECKING
# Import conditionnel pour éviter les imports circulaires
if TYPE_CHECKING:
from repositories.class_repository import ClassRepository
# Utilitaire pour éviter la duplication dans l'initialisation des choix de classe
def _populate_class_choices(field, class_repo: 'ClassRepository'):
"""Remplit les choix d'un champ SelectField avec les classes disponibles.
Args:
field: Le champ SelectField à peupler
class_repo: Repository pour accéder aux données ClassGroup
"""
classes = class_repo.find_for_form_choices()
field.choices = [(cg.id, cg.name) for cg in classes]
class AssessmentForm(FlaskForm):
title = StringField('Titre', validators=[DataRequired(), Length(max=200)])
description = TextAreaField('Description', validators=[Optional()])
date = DateField('Date', validators=[DataRequired()], default=date.today)
trimester = SelectField('Trimestre', validators=[DataRequired()], coerce=int,
choices=[(1, '1er trimestre'), (2, '2ème trimestre'), (3, '3ème trimestre')])
class_group_id = SelectField('Classe', validators=[DataRequired()], coerce=int)
coefficient = FloatField('Coefficient', validators=[DataRequired(), NumberRange(min=0.1, max=10)], default=1.0)
submit = SubmitField('Enregistrer')
def populate_class_choices(self, class_repo: 'ClassRepository'):
"""Peuple les choix de classes en utilisant le repository.
Args:
class_repo: Repository pour accéder aux données ClassGroup
"""
_populate_class_choices(self.class_group_id, class_repo)
class ClassGroupForm(FlaskForm):
name = StringField('Nom de la classe', validators=[DataRequired(), Length(max=100)])
description = TextAreaField('Description', validators=[Optional()])
year = StringField('Année scolaire', validators=[DataRequired(), Length(max=20)], default="2024-2025")
submit = SubmitField('Enregistrer')
class StudentForm(FlaskForm):
first_name = StringField('Prénom', validators=[DataRequired(), Length(max=100)])
last_name = StringField('Nom', validators=[DataRequired(), Length(max=100)])
email = StringField('Email', validators=[Optional(), Email(), Length(max=120)])
class_group_id = SelectField('Classe', validators=[DataRequired()], coerce=int)
submit = SubmitField('Enregistrer')
def populate_class_choices(self, class_repo: 'ClassRepository'):
"""Peuple les choix de classes en utilisant le repository.
Args:
class_repo: Repository pour accéder aux données ClassGroup
"""
_populate_class_choices(self.class_group_id, class_repo)
# Formulaires ExerciseForm et GradingElementForm supprimés
# Ces éléments sont maintenant gérés via le formulaire unifié AssessmentForm
class CSVImportForm(FlaskForm):
"""Formulaire d'import d'élèves depuis un fichier CSV."""
csv_file = FileField(
'Fichier CSV',
validators=[
FileRequired(message='Veuillez sélectionner un fichier CSV'),
FileAllowed(['csv'], message='Seuls les fichiers CSV sont autorisés')
]
)
enrollment_date = DateField(
'Date d\'inscription',
validators=[DataRequired()],
default=date.today,
description='Date d\'inscription des élèves dans la classe'
)
skip_duplicates = BooleanField(
'Ignorer les doublons',
default=True,
description='Si coché, les élèves déjà existants seront ignorés. Sinon, l\'import échouera.'
)
submit = SubmitField('Importer les élèves')