Files
notytex/commands.py
2025-08-06 20:34:55 +02:00

232 lines
10 KiB
Python

import click
from flask.cli import with_appcontext
from models import db, ClassGroup, Student, Assessment, Exercise, GradingElement, Domain
@click.command()
@with_appcontext
def init_db():
"""Initialize the database with sample data."""
db.create_all()
# Check if data already exists
if ClassGroup.query.first():
click.echo("Database already initialized!")
return
# Create sample class groups
classe_6a = ClassGroup(name="6ème A", description="Classe de 6ème A", year="2024-2025")
classe_5b = ClassGroup(name="5ème B", description="Classe de 5ème B", year="2024-2025")
db.session.add(classe_6a)
db.session.add(classe_5b)
db.session.commit()
# Create sample students
students_data = [
("Dupont", "Marie", "marie.dupont@email.com", classe_6a.id),
("Martin", "Pierre", "pierre.martin@email.com", classe_6a.id),
("Durand", "Sophie", "sophie.durand@email.com", classe_6a.id),
("Moreau", "Lucas", "lucas.moreau@email.com", classe_5b.id),
("Bernard", "Emma", "emma.bernard@email.com", classe_5b.id),
]
for last_name, first_name, email, class_group_id in students_data:
student = Student(
last_name=last_name,
first_name=first_name,
email=email,
class_group_id=class_group_id
)
db.session.add(student)
db.session.commit()
# Create sample assessment
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
)
db.session.add(assessment)
db.session.commit()
# Create sample exercise
exercise = Exercise(
assessment_id=assessment.id,
title="Exercice 1 - Fractions",
description="Calculs avec les fractions",
order=1
)
db.session.add(exercise)
db.session.commit()
# Récupérer des domaines existants (créés automatiquement par la configuration)
domain_calcul = Domain.query.filter_by(name='Algèbre').first()
domain_methode = Domain.query.filter_by(name='Problèmes').first()
# Create sample grading elements with domains (optionnels)
elements_data = [
("Calcul de base", "Addition et soustraction de fractions", "Calculer", 4.0, "notes", domain_calcul.id if domain_calcul else None),
("Méthode", "Justification de la méthode utilisée", "Raisonner", 2.0, "score", domain_methode.id if domain_methode else None),
("Présentation", "Clarté de la présentation", "Communiquer", 2.0, "score", None), # Pas de domaine spécifique
]
for label, description, skill, max_points, grading_type, domain_id in elements_data:
element = GradingElement(
exercise_id=exercise.id,
label=label,
description=description,
skill=skill,
max_points=max_points,
grading_type=grading_type,
domain_id=domain_id
)
db.session.add(element)
db.session.commit()
click.echo("Database initialized with sample data!")
@click.command()
@with_appcontext
def create_large_test_data():
"""Create large test data: 30 students and complex assessment."""
# Create a large class with 30 students
classe_test = ClassGroup(name="3ème Test", description="Classe de test avec 30 élèves", year="2024-2025")
db.session.add(classe_test)
db.session.commit()
# Generate 30 students with realistic French names
first_names = ["Alice", "Antoine", "Amélie", "Alexandre", "Anna", "Adrien", "Camille", "Clément", "Charlotte", "Clément",
"Emma", "Ethan", "Elise", "Enzo", "Eva", "Fabien", "Fanny", "Gabriel", "Giulia", "Hugo",
"Inès", "Jules", "Jade", "Kévin", "Léa", "Louis", "Marie", "Mathis", "Nina", "Oscar"]
last_names = ["Martin", "Bernard", "Dubois", "Thomas", "Robert", "Richard", "Petit", "Durand", "Leroy", "Moreau",
"Simon", "Laurent", "Lefebvre", "Michel", "Garcia", "David", "Bertrand", "Roux", "Vincent", "Fournier",
"Morel", "Girard", "André", "Lefèvre", "Mercier", "Dupont", "Lambert", "Bonnet", "François", "Martinez"]
for i in range(30):
student = Student(
last_name=last_names[i],
first_name=first_names[i],
email=f"{first_names[i].lower()}.{last_names[i].lower()}@test.com",
class_group_id=classe_test.id
)
db.session.add(student)
db.session.commit()
# Récupérer les domaines existants (créés automatiquement par la configuration)
domain_fonctions = Domain.query.filter_by(name='Fonctions').first()
domain_calcul = Domain.query.filter_by(name='Algèbre').first()
domain_geometrie = Domain.query.filter_by(name='Géométrie').first()
domain_stats = Domain.query.filter_by(name='Statistiques').first()
domain_problemes = Domain.query.filter_by(name='Problèmes').first()
# Create a complex assessment with 4 exercises, 5 elements each
assessment = Assessment(
title="Contrôle de Mathématiques - Fonctions et Statistiques",
description="Évaluation complète sur les fonctions affines et les statistiques descriptives",
trimester=2,
class_group_id=classe_test.id,
coefficient=3.0
)
db.session.add(assessment)
db.session.commit()
# Exercise 1: Fonctions affines
ex1 = Exercise(
assessment_id=assessment.id,
title="Ex1 - Fonctions affines",
description="Calculs et représentations graphiques",
order=1
)
db.session.add(ex1)
db.session.commit()
ex1_elements = [
("1a - Calcul image", "Calculer f(3)", "Calculer", 2.0, "notes", domain_fonctions.id if domain_fonctions else None),
("1b - Antécédent", "Résoudre f(x)=5", "Calculer", 3.0, "notes", domain_calcul.id if domain_calcul else None),
("1c - Graphique", "Tracer la droite", "Représenter", 3.0, "score", domain_fonctions.id if domain_fonctions else None),
("1d - Lecture graph", "Lire coordonnées", "Modéliser", 2.0, "notes", domain_fonctions.id if domain_fonctions else None),
("1e - Méthode", "Justification", "Raisonner", 2.0, "score", domain_problemes.id if domain_problemes else None)
]
for label, desc, skill, points, gtype, domain_id in ex1_elements:
elem = GradingElement(exercise_id=ex1.id, label=label, description=desc,
skill=skill, max_points=points, grading_type=gtype, domain_id=domain_id)
db.session.add(elem)
# Exercise 2: Équations
ex2 = Exercise(
assessment_id=assessment.id,
title="Ex2 - Équations du 1er degré",
description="Résolution d'équations",
order=2
)
db.session.add(ex2)
db.session.commit()
ex2_elements = [
("2a - Équation simple", "Résoudre 2x+3=7", "Calculer", 2.0, "notes", domain_calcul.id if domain_calcul else None),
("2b - Avec parenthèses", "3(x-1)=2x+5", "Calculer", 4.0, "notes", domain_calcul.id if domain_calcul else None),
("2c - Vérification", "Contrôler solution", "Raisonner", 1.0, "score", domain_problemes.id if domain_problemes else None),
("2d - Méthode", "Étapes de résolution", "Communiquer", 2.0, "score", domain_problemes.id if domain_problemes else None),
("2e - Application", "Problème concret", "Modéliser", 3.0, "score", domain_problemes.id if domain_problemes else None)
]
for label, desc, skill, points, gtype, domain_id in ex2_elements:
elem = GradingElement(exercise_id=ex2.id, label=label, description=desc,
skill=skill, max_points=points, grading_type=gtype, domain_id=domain_id)
db.session.add(elem)
# Exercise 3: Statistiques
ex3 = Exercise(
assessment_id=assessment.id,
title="Ex3 - Statistiques descriptives",
description="Moyennes, médianes, quartiles",
order=3
)
db.session.add(ex3)
db.session.commit()
ex3_elements = [
("3a - Moyenne", "Calculer moyenne", "Calculer", 3.0, "notes", domain_stats.id if domain_stats else None),
("3b - Médiane", "Déterminer médiane", "Calculer", 2.0, "notes", domain_stats.id if domain_stats else None),
("3c - Quartiles", "Q1 et Q3", "Calculer", 4.0, "notes", domain_stats.id if domain_stats else None),
("3d - Interprétation", "Analyser résultats", "Raisonner", 3.0, "score", domain_stats.id if domain_stats else None),
("3e - Graphique", "Diagramme en boîte", "Représenter", 2.0, "score", domain_stats.id if domain_stats else None)
]
for label, desc, skill, points, gtype, domain_id in ex3_elements:
elem = GradingElement(exercise_id=ex3.id, label=label, description=desc,
skill=skill, max_points=points, grading_type=gtype, domain_id=domain_id)
db.session.add(elem)
# Exercise 4: Problème de synthèse
ex4 = Exercise(
assessment_id=assessment.id,
title="Ex4 - Problème de synthèse",
description="Application des notions",
order=4
)
db.session.add(ex4)
db.session.commit()
ex4_elements = [
("4a - Modélisation", "Mise en équation", "Modéliser", 4.0, "score", domain_problemes.id if domain_problemes else None),
("4b - Résolution", "Calculs", "Calculer", 5.0, "notes", domain_calcul.id if domain_calcul else None),
("4c - Interprétation", "Sens du résultat", "Raisonner", 3.0, "score", domain_problemes.id if domain_problemes else None),
("4d - Communication", "Rédaction", "Communiquer", 3.0, "score", domain_problemes.id if domain_problemes else None),
("4e - Démarche", "Organisation", "Raisonner", 3.0, "score", domain_problemes.id if domain_problemes else None)
]
for label, desc, skill, points, gtype, domain_id in ex4_elements:
elem = GradingElement(exercise_id=ex4.id, label=label, description=desc,
skill=skill, max_points=points, grading_type=gtype, domain_id=domain_id)
db.session.add(elem)
db.session.commit()
click.echo(f"Created test data: {classe_test.name} with 30 students and complex assessment with 4 exercises (20 grading elements total)!")