- Split monolithic app.py (400+ lines) into organized modules - Extract models, forms, and commands into separate files - Implement Flask blueprints for route organization - Maintain full functionality with cleaner architecture - Update all templates to use new blueprint URLs - Enhance README with technical documentation Structure: ├── app.py (50 lines) - Flask app factory ├── models.py (62 lines) - SQLAlchemy models ├── forms.py (43 lines) - WTForms definitions ├── commands.py (74 lines) - CLI commands └── routes/ - Blueprint modules for each feature 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
		
			
				
	
	
		
			50 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from flask_wtf import FlaskForm
 | |
| from wtforms import StringField, TextAreaField, FloatField, SelectField, DateField, IntegerField, SubmitField
 | |
| from wtforms.validators import DataRequired, Email, NumberRange, Optional, Length
 | |
| from datetime import date
 | |
| from models import ClassGroup
 | |
| 
 | |
| class AssessmentForm(FlaskForm):
 | |
|     title = StringField('Titre', validators=[DataRequired(), Length(max=200)])
 | |
|     description = TextAreaField('Description', validators=[Optional()])
 | |
|     date = DateField('Date', validators=[DataRequired()], default=date.today)
 | |
|     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 __init__(self, *args, **kwargs):
 | |
|         super(AssessmentForm, self).__init__(*args, **kwargs)
 | |
|         self.class_group_id.choices = [(cg.id, cg.name) for cg in ClassGroup.query.order_by(ClassGroup.name).all()]
 | |
| 
 | |
| 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 __init__(self, *args, **kwargs):
 | |
|         super(StudentForm, self).__init__(*args, **kwargs)
 | |
|         self.class_group_id.choices = [(cg.id, cg.name) for cg in ClassGroup.query.order_by(ClassGroup.name).all()]
 | |
| 
 | |
| class ExerciseForm(FlaskForm):
 | |
|     title = StringField('Titre', validators=[DataRequired(), Length(max=200)])
 | |
|     description = TextAreaField('Description', validators=[Optional()])
 | |
|     order = IntegerField('Ordre', validators=[DataRequired(), NumberRange(min=1)], default=1)
 | |
|     submit = SubmitField('Enregistrer')
 | |
| 
 | |
| class GradingElementForm(FlaskForm):
 | |
|     label = StringField('Libellé', validators=[DataRequired(), Length(max=200)])
 | |
|     description = TextAreaField('Description', validators=[Optional()])
 | |
|     skill = StringField('Compétence', validators=[Optional(), Length(max=200)])
 | |
|     max_points = FloatField('Barème (points max)', validators=[DataRequired(), NumberRange(min=0.1)], default=1.0)
 | |
|     grading_type = SelectField('Type de notation', validators=[DataRequired()], 
 | |
|                               choices=[('points', 'Points (ex: 2.5/4)'), ('score', 'Score (0, 1, 2, 3, .)')],
 | |
|                               default='points')
 | |
|     submit = SubmitField('Enregistrer') |