feat add trimester
This commit is contained in:
@@ -45,6 +45,7 @@ def init_db():
|
||||
assessment = Assessment(
|
||||
title="Évaluation de mathématiques",
|
||||
description="Évaluation sur les fractions et les décimaux",
|
||||
trimester=1,
|
||||
class_group_id=classe_6a.id,
|
||||
coefficient=2.0
|
||||
)
|
||||
|
||||
2
forms.py
2
forms.py
@@ -8,6 +8,8 @@ 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')
|
||||
|
||||
@@ -37,10 +37,15 @@ class Assessment(db.Model):
|
||||
title = db.Column(db.String(200), nullable=False)
|
||||
description = db.Column(db.Text)
|
||||
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)
|
||||
coefficient = db.Column(db.Float, default=1.0) # Garder Float pour compatibilité
|
||||
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):
|
||||
return f'<Assessment {self.title}>'
|
||||
|
||||
|
||||
@@ -69,6 +69,7 @@ def _handle_unified_assessment_request(form, assessment=None, is_edit=False):
|
||||
'title': form.title.data,
|
||||
'description': form.description.data,
|
||||
'date': form.date.data,
|
||||
'trimester': form.trimester.data,
|
||||
'class_group_id': form.class_group_id.data,
|
||||
'coefficient': form.coefficient.data
|
||||
})
|
||||
@@ -77,6 +78,7 @@ def _handle_unified_assessment_request(form, assessment=None, is_edit=False):
|
||||
'title': form.title.data,
|
||||
'description': form.description.data,
|
||||
'date': form.date.data,
|
||||
'trimester': form.trimester.data,
|
||||
'class_group_id': form.class_group_id.data,
|
||||
'coefficient': form.coefficient.data
|
||||
})
|
||||
|
||||
10
services.py
10
services.py
@@ -13,6 +13,7 @@ class AssessmentService:
|
||||
title=form_data['title'],
|
||||
description=form_data.get('description', ''),
|
||||
date=form_data['date'],
|
||||
trimester=form_data['trimester'],
|
||||
class_group_id=form_data['class_group_id'],
|
||||
coefficient=form_data['coefficient']
|
||||
)
|
||||
@@ -27,6 +28,7 @@ class AssessmentService:
|
||||
assessment.title = form_data['title']
|
||||
assessment.description = form_data.get('description', '')
|
||||
assessment.date = form_data['date']
|
||||
assessment.trimester = form_data['trimester']
|
||||
assessment.class_group_id = form_data['class_group_id']
|
||||
assessment.coefficient = form_data['coefficient']
|
||||
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):
|
||||
"""Traite une évaluation complète avec exercices et éléments"""
|
||||
# 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)
|
||||
|
||||
# Validation et conversion des types
|
||||
try:
|
||||
class_group_id = safe_int_conversion(assessment_data['class_group_id'], "ID de classe")
|
||||
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
|
||||
date_str = assessment_data.get('date')
|
||||
@@ -64,6 +71,7 @@ class AssessmentService:
|
||||
'title': assessment_data['title'].strip(),
|
||||
'description': assessment_data.get('description', '').strip(),
|
||||
'date': date_obj,
|
||||
'trimester': trimester,
|
||||
'class_group_id': class_group_id,
|
||||
'coefficient': coefficient
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
← Retour aux évaluations
|
||||
</a>
|
||||
<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 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">
|
||||
@@ -40,6 +40,10 @@
|
||||
<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>
|
||||
</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>
|
||||
<dt class="text-sm font-medium text-gray-500">Coefficient</dt>
|
||||
<dd class="mt-1 text-sm text-gray-900">{{ assessment.coefficient }}</dd>
|
||||
|
||||
@@ -76,6 +76,20 @@
|
||||
{% endif %}
|
||||
</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>
|
||||
<label for="{{ form.coefficient.id }}" class="block text-sm font-medium text-gray-700 mb-1">
|
||||
{{ form.coefficient.label.text }}
|
||||
@@ -437,6 +451,7 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
title: formData.get('title'),
|
||||
description: formData.get('description'),
|
||||
date: formData.get('date'),
|
||||
trimester: formData.get('trimester'),
|
||||
class_group_id: formData.get('class_group_id'),
|
||||
coefficient: formData.get('coefficient'),
|
||||
exercises: exercises
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
<div class="text-sm font-medium text-gray-900">{{ assessment.title }}</div>
|
||||
<div class="text-sm text-gray-500">
|
||||
{{ assessment.class_group.name }} - {{ assessment.date.strftime('%d/%m/%Y') }}
|
||||
- Coefficient {{ assessment.coefficient }}
|
||||
- Trimestre {{ assessment.trimester }} - Coefficient {{ assessment.coefficient }}
|
||||
</div>
|
||||
{% if assessment.description %}
|
||||
<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