feat add trimester
This commit is contained in:
		| @@ -45,6 +45,7 @@ def init_db(): | |||||||
|     assessment = Assessment( |     assessment = Assessment( | ||||||
|         title="Évaluation de mathématiques", |         title="Évaluation de mathématiques", | ||||||
|         description="Évaluation sur les fractions et les décimaux", |         description="Évaluation sur les fractions et les décimaux", | ||||||
|  |         trimester=1, | ||||||
|         class_group_id=classe_6a.id, |         class_group_id=classe_6a.id, | ||||||
|         coefficient=2.0 |         coefficient=2.0 | ||||||
|     ) |     ) | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								forms.py
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								forms.py
									
									
									
									
									
								
							| @@ -8,6 +8,8 @@ class AssessmentForm(FlaskForm): | |||||||
|     title = StringField('Titre', validators=[DataRequired(), Length(max=200)]) |     title = StringField('Titre', validators=[DataRequired(), Length(max=200)]) | ||||||
|     description = TextAreaField('Description', validators=[Optional()]) |     description = TextAreaField('Description', validators=[Optional()]) | ||||||
|     date = DateField('Date', validators=[DataRequired()], default=date.today) |     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) |     class_group_id = SelectField('Classe', validators=[DataRequired()], coerce=int) | ||||||
|     coefficient = FloatField('Coefficient', validators=[DataRequired(), NumberRange(min=0.1, max=10)], default=1.0) |     coefficient = FloatField('Coefficient', validators=[DataRequired(), NumberRange(min=0.1, max=10)], default=1.0) | ||||||
|     submit = SubmitField('Enregistrer') |     submit = SubmitField('Enregistrer') | ||||||
|   | |||||||
| @@ -37,10 +37,15 @@ class Assessment(db.Model): | |||||||
|     title = db.Column(db.String(200), nullable=False) |     title = db.Column(db.String(200), nullable=False) | ||||||
|     description = db.Column(db.Text) |     description = db.Column(db.Text) | ||||||
|     date = db.Column(db.Date, nullable=False, default=datetime.utcnow) |     date = db.Column(db.Date, nullable=False, default=datetime.utcnow) | ||||||
|  |     trimester = db.Column(db.Integer, nullable=False)  # 1, 2, ou 3 | ||||||
|     class_group_id = db.Column(db.Integer, db.ForeignKey('class_group.id'), nullable=False) |     class_group_id = db.Column(db.Integer, db.ForeignKey('class_group.id'), nullable=False) | ||||||
|     coefficient = db.Column(db.Float, default=1.0)  # Garder Float pour compatibilité |     coefficient = db.Column(db.Float, default=1.0)  # Garder Float pour compatibilité | ||||||
|     exercises = db.relationship('Exercise', backref='assessment', lazy=True, cascade='all, delete-orphan') |     exercises = db.relationship('Exercise', backref='assessment', lazy=True, cascade='all, delete-orphan') | ||||||
|  |  | ||||||
|  |     __table_args__ = ( | ||||||
|  |         CheckConstraint('trimester IN (1, 2, 3)', name='check_trimester_valid'), | ||||||
|  |     ) | ||||||
|  |  | ||||||
|     def __repr__(self): |     def __repr__(self): | ||||||
|         return f'<Assessment {self.title}>' |         return f'<Assessment {self.title}>' | ||||||
|  |  | ||||||
|   | |||||||
| @@ -69,6 +69,7 @@ def _handle_unified_assessment_request(form, assessment=None, is_edit=False): | |||||||
|                     'title': form.title.data, |                     'title': form.title.data, | ||||||
|                     'description': form.description.data, |                     'description': form.description.data, | ||||||
|                     'date': form.date.data, |                     'date': form.date.data, | ||||||
|  |                     'trimester': form.trimester.data, | ||||||
|                     'class_group_id': form.class_group_id.data, |                     'class_group_id': form.class_group_id.data, | ||||||
|                     'coefficient': form.coefficient.data |                     'coefficient': form.coefficient.data | ||||||
|                 }) |                 }) | ||||||
| @@ -77,6 +78,7 @@ def _handle_unified_assessment_request(form, assessment=None, is_edit=False): | |||||||
|                     'title': form.title.data, |                     'title': form.title.data, | ||||||
|                     'description': form.description.data, |                     'description': form.description.data, | ||||||
|                     'date': form.date.data, |                     'date': form.date.data, | ||||||
|  |                     'trimester': form.trimester.data, | ||||||
|                     'class_group_id': form.class_group_id.data, |                     'class_group_id': form.class_group_id.data, | ||||||
|                     'coefficient': form.coefficient.data |                     'coefficient': form.coefficient.data | ||||||
|                 }) |                 }) | ||||||
|   | |||||||
							
								
								
									
										10
									
								
								services.py
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								services.py
									
									
									
									
									
								
							| @@ -13,6 +13,7 @@ class AssessmentService: | |||||||
|             title=form_data['title'], |             title=form_data['title'], | ||||||
|             description=form_data.get('description', ''), |             description=form_data.get('description', ''), | ||||||
|             date=form_data['date'], |             date=form_data['date'], | ||||||
|  |             trimester=form_data['trimester'], | ||||||
|             class_group_id=form_data['class_group_id'], |             class_group_id=form_data['class_group_id'], | ||||||
|             coefficient=form_data['coefficient'] |             coefficient=form_data['coefficient'] | ||||||
|         ) |         ) | ||||||
| @@ -27,6 +28,7 @@ class AssessmentService: | |||||||
|         assessment.title = form_data['title'] |         assessment.title = form_data['title'] | ||||||
|         assessment.description = form_data.get('description', '') |         assessment.description = form_data.get('description', '') | ||||||
|         assessment.date = form_data['date'] |         assessment.date = form_data['date'] | ||||||
|  |         assessment.trimester = form_data['trimester'] | ||||||
|         assessment.class_group_id = form_data['class_group_id'] |         assessment.class_group_id = form_data['class_group_id'] | ||||||
|         assessment.coefficient = form_data['coefficient'] |         assessment.coefficient = form_data['coefficient'] | ||||||
|         log_user_action("Modification évaluation", f"ID: {assessment.id}") |         log_user_action("Modification évaluation", f"ID: {assessment.id}") | ||||||
| @@ -41,13 +43,18 @@ class AssessmentService: | |||||||
|     def process_assessment_with_exercises(assessment_data, is_edit=False, existing_assessment=None): |     def process_assessment_with_exercises(assessment_data, is_edit=False, existing_assessment=None): | ||||||
|         """Traite une évaluation complète avec exercices et éléments""" |         """Traite une évaluation complète avec exercices et éléments""" | ||||||
|         # Validation des données de base |         # Validation des données de base | ||||||
|         required_fields = ['title', 'date', 'class_group_id', 'coefficient'] |         required_fields = ['title', 'date', 'trimester', 'class_group_id', 'coefficient'] | ||||||
|         validate_json_data(assessment_data, required_fields) |         validate_json_data(assessment_data, required_fields) | ||||||
|          |          | ||||||
|         # Validation et conversion des types |         # Validation et conversion des types | ||||||
|         try: |         try: | ||||||
|             class_group_id = safe_int_conversion(assessment_data['class_group_id'], "ID de classe") |             class_group_id = safe_int_conversion(assessment_data['class_group_id'], "ID de classe") | ||||||
|             coefficient = safe_decimal_conversion(assessment_data['coefficient'], "coefficient") |             coefficient = safe_decimal_conversion(assessment_data['coefficient'], "coefficient") | ||||||
|  |             trimester = safe_int_conversion(assessment_data['trimester'], "trimestre") | ||||||
|  |              | ||||||
|  |             # Validation du trimestre | ||||||
|  |             if trimester not in [1, 2, 3]: | ||||||
|  |                 raise ValidationError("Le trimestre doit être 1, 2 ou 3") | ||||||
|              |              | ||||||
|             # Validation de la date |             # Validation de la date | ||||||
|             date_str = assessment_data.get('date') |             date_str = assessment_data.get('date') | ||||||
| @@ -64,6 +71,7 @@ class AssessmentService: | |||||||
|             'title': assessment_data['title'].strip(), |             'title': assessment_data['title'].strip(), | ||||||
|             'description': assessment_data.get('description', '').strip(), |             'description': assessment_data.get('description', '').strip(), | ||||||
|             'date': date_obj, |             'date': date_obj, | ||||||
|  |             'trimester': trimester, | ||||||
|             'class_group_id': class_group_id, |             'class_group_id': class_group_id, | ||||||
|             'coefficient': coefficient |             'coefficient': coefficient | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ | |||||||
|                 ← Retour aux évaluations |                 ← Retour aux évaluations | ||||||
|             </a> |             </a> | ||||||
|             <h1 class="text-2xl font-bold text-gray-900">{{ assessment.title }}</h1> |             <h1 class="text-2xl font-bold text-gray-900">{{ assessment.title }}</h1> | ||||||
|             <p class="text-gray-600">{{ assessment.class_group.name }} - {{ assessment.date.strftime('%d/%m/%Y') }}</p> |             <p class="text-gray-600">{{ assessment.class_group.name }} - {{ assessment.date.strftime('%d/%m/%Y') }} - Trimestre {{ assessment.trimester }}</p> | ||||||
|         </div> |         </div> | ||||||
|         <div class="flex space-x-3"> |         <div class="flex space-x-3"> | ||||||
|             <a href="{{ url_for('assessments.edit', id=assessment.id) }}" class="bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-md text-sm font-medium transition-colors"> |             <a href="{{ url_for('assessments.edit', id=assessment.id) }}" class="bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-md text-sm font-medium transition-colors"> | ||||||
| @@ -40,6 +40,10 @@ | |||||||
|                     <dt class="text-sm font-medium text-gray-500">Date</dt> |                     <dt class="text-sm font-medium text-gray-500">Date</dt> | ||||||
|                     <dd class="mt-1 text-sm text-gray-900">{{ assessment.date.strftime('%d/%m/%Y') }}</dd> |                     <dd class="mt-1 text-sm text-gray-900">{{ assessment.date.strftime('%d/%m/%Y') }}</dd> | ||||||
|                 </div> |                 </div> | ||||||
|  |                 <div> | ||||||
|  |                     <dt class="text-sm font-medium text-gray-500">Trimestre</dt> | ||||||
|  |                     <dd class="mt-1 text-sm text-gray-900">{{ assessment.trimester }}</dd> | ||||||
|  |                 </div> | ||||||
|                 <div> |                 <div> | ||||||
|                     <dt class="text-sm font-medium text-gray-500">Coefficient</dt> |                     <dt class="text-sm font-medium text-gray-500">Coefficient</dt> | ||||||
|                     <dd class="mt-1 text-sm text-gray-900">{{ assessment.coefficient }}</dd> |                     <dd class="mt-1 text-sm text-gray-900">{{ assessment.coefficient }}</dd> | ||||||
|   | |||||||
| @@ -76,6 +76,20 @@ | |||||||
|                         {% endif %} |                         {% endif %} | ||||||
|                     </div> |                     </div> | ||||||
|                      |                      | ||||||
|  |                     <div> | ||||||
|  |                         <label for="{{ form.trimester.id }}" class="block text-sm font-medium text-gray-700 mb-1"> | ||||||
|  |                             {{ form.trimester.label.text }} | ||||||
|  |                         </label> | ||||||
|  |                         {{ form.trimester(class="block w-full border border-gray-300 rounded-md px-3 py-2 focus:ring-blue-500 focus:border-blue-500") }} | ||||||
|  |                         {% if form.trimester.errors %} | ||||||
|  |                             <div class="mt-1 text-sm text-red-600"> | ||||||
|  |                                 {% for error in form.trimester.errors %} | ||||||
|  |                                     <p>{{ error }}</p> | ||||||
|  |                                 {% endfor %} | ||||||
|  |                             </div> | ||||||
|  |                         {% endif %} | ||||||
|  |                     </div> | ||||||
|  |                      | ||||||
|                     <div> |                     <div> | ||||||
|                         <label for="{{ form.coefficient.id }}" class="block text-sm font-medium text-gray-700 mb-1"> |                         <label for="{{ form.coefficient.id }}" class="block text-sm font-medium text-gray-700 mb-1"> | ||||||
|                             {{ form.coefficient.label.text }} |                             {{ form.coefficient.label.text }} | ||||||
| @@ -437,6 +451,7 @@ document.addEventListener('DOMContentLoaded', function() { | |||||||
|             title: formData.get('title'), |             title: formData.get('title'), | ||||||
|             description: formData.get('description'), |             description: formData.get('description'), | ||||||
|             date: formData.get('date'), |             date: formData.get('date'), | ||||||
|  |             trimester: formData.get('trimester'), | ||||||
|             class_group_id: formData.get('class_group_id'), |             class_group_id: formData.get('class_group_id'), | ||||||
|             coefficient: formData.get('coefficient'), |             coefficient: formData.get('coefficient'), | ||||||
|             exercises: exercises |             exercises: exercises | ||||||
|   | |||||||
| @@ -33,7 +33,7 @@ | |||||||
|                                         <div class="text-sm font-medium text-gray-900">{{ assessment.title }}</div> |                                         <div class="text-sm font-medium text-gray-900">{{ assessment.title }}</div> | ||||||
|                                         <div class="text-sm text-gray-500"> |                                         <div class="text-sm text-gray-500"> | ||||||
|                                             {{ assessment.class_group.name }} - {{ assessment.date.strftime('%d/%m/%Y') }} |                                             {{ assessment.class_group.name }} - {{ assessment.date.strftime('%d/%m/%Y') }} | ||||||
|                                             - Coefficient {{ assessment.coefficient }} |                                             - Trimestre {{ assessment.trimester }} - Coefficient {{ assessment.coefficient }} | ||||||
|                                         </div> |                                         </div> | ||||||
|                                         {% if assessment.description %} |                                         {% if assessment.description %} | ||||||
|                                             <div class="text-sm text-gray-500 mt-1">{{ assessment.description[:100] }}{% if assessment.description|length > 100 %}...{% endif %}</div> |                                             <div class="text-sm text-gray-500 mt-1">{{ assessment.description[:100] }}{% if assessment.description|length > 100 %}...{% endif %}</div> | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user