85 lines
3.9 KiB
Python
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') |