Files
notytex/forms.py

62 lines
3.0 KiB
Python

from flask_wtf import FlaskForm
from wtforms import StringField, TextAreaField, FloatField, SelectField, DateField, SubmitField
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