refactor: restructure codebase into modular architecture
- 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>
This commit is contained in:
		
							
								
								
									
										50
									
								
								forms.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								forms.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | ||||
| 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') | ||||
		Reference in New Issue
	
	Block a user