From bc55b95bda2f56563229ae245608a14cc5419942 Mon Sep 17 00:00:00 2001 From: Rene Luria Date: Tue, 7 Oct 2025 07:55:18 +0200 Subject: [PATCH] feat: permit to generate only multiplications --- app/main.py | 56 ++++++++++++++++++++++++++++------------ app/templates/index.html | 12 +++++++-- 2 files changed, 49 insertions(+), 19 deletions(-) diff --git a/app/main.py b/app/main.py index f3525c2..52715e5 100644 --- a/app/main.py +++ b/app/main.py @@ -167,6 +167,7 @@ class ExerciseRequest(BaseModel): min_table: int max_table: int num_exercises: int = 15 + multiplication_only: bool = False class OperationExerciseRequest(BaseModel): @@ -174,7 +175,7 @@ class OperationExerciseRequest(BaseModel): def generate_exercises( - min_table: int, max_table: int, num_exercises: int = 15 + min_table: int, max_table: int, num_exercises: int = 15, multiplication_only: bool = False ) -> List[str]: """Génère des exercices de multiplication et division aléatoires mélangés sans doublons""" exercises: List[str] = [] @@ -192,8 +193,12 @@ def generate_exercises( b = random.randint(min_table, max_table) result = a * b - # Choisir aléatoirement le type d'exercice (seulement multiplication ou division) - exercise_type = random.choice(["multiplication", "division"]) + # Déterminer le type d'exercice + if multiplication_only: + exercise_type = "multiplication" + else: + # Choisir aléatoirement le type d'exercice (seulement multiplication ou division) + exercise_type = random.choice(["multiplication", "division"]) if exercise_type == "multiplication": # Exercice de multiplication @@ -202,7 +207,7 @@ def generate_exercises( exercise = f"{a} · {b} = ____" exercises.append(exercise) used_operations.add(operation_key) - else: # division + elif not multiplication_only: # division # Exercice de division divisor = random.choice([a, b]) operation_key = f"div_{result}_{divisor}" # Clé unique pour cette opération @@ -221,14 +226,21 @@ def generate_exercises( b = random.randint(min_table, max_table) result = a * b - # Choisir aléatoirement le type d'exercice - exercise_type = random.choice(["multiplication", "division"]) + # Déterminer le type d'exercice + if multiplication_only: + exercise_type = "multiplication" + else: + # Choisir aléatoirement le type d'exercice + exercise_type = random.choice(["multiplication", "division"]) if exercise_type == "multiplication": exercise = f"{a} · {b} = ____" - else: # division + elif not multiplication_only: # division divisor = random.choice([a, b]) exercise = f"{result} : {divisor} = ____" + else: + # Fallback to multiplication if multiplication_only is True + exercise = f"{a} · {b} = ____" exercises.append(exercise) @@ -236,7 +248,7 @@ def generate_exercises( def create_math_exercises_pdf( - min_table: int, max_table: int, num_exercises: int = 15 + min_table: int, max_table: int, num_exercises: int = 15, multiplication_only: bool = False ) -> str: """Crée un fichier PDF avec des exercices de mathématiques mélangés en 3 colonnes et l'upload sur S3""" import datetime @@ -245,14 +257,24 @@ def create_math_exercises_pdf( timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") # Ajouter des informations sur la plage de tables - if min_table == max_table: - table_info = f"Tables de multiplication et division pour {min_table}" - pdf_filename = f"exercices_mathematiques_table_{min_table}_{num_exercises}_exercices_{timestamp}.pdf" + if multiplication_only: + if min_table == max_table: + table_info = f"Tables de multiplication seulement pour {min_table}" + pdf_filename = f"exercices_multiplication_seulement_table_{min_table}_{num_exercises}_exercices_{timestamp}.pdf" + else: + table_info = ( + f"Tables de multiplication seulement de {min_table} à {max_table}" + ) + pdf_filename = f"exercices_multiplication_seulement_tables_{min_table}_a_{max_table}_{num_exercises}_exercices_{timestamp}.pdf" else: - table_info = ( - f"Tables de multiplication et division de {min_table} à {max_table}" - ) - pdf_filename = f"exercices_mathematiques_tables_{min_table}_a_{max_table}_{num_exercises}_exercices_{timestamp}.pdf" + if min_table == max_table: + table_info = f"Tables de multiplication et division pour {min_table}" + pdf_filename = f"exercices_mathematiques_table_{min_table}_{num_exercises}_exercices_{timestamp}.pdf" + else: + table_info = ( + f"Tables de multiplication et division de {min_table} à {max_table}" + ) + pdf_filename = f"exercices_mathematiques_tables_{min_table}_a_{max_table}_{num_exercises}_exercices_{timestamp}.pdf" pdf = MathExercisesPDF() pdf.add_page() @@ -262,7 +284,7 @@ def create_math_exercises_pdf( pdf.ln(5) # Générer les exercices - exercises = generate_exercises(min_table, max_table, num_exercises) + exercises = generate_exercises(min_table, max_table, num_exercises, multiplication_only) # Pas d'en-têtes de colonnes @@ -354,7 +376,7 @@ async def generate_exercises_endpoint(request: ExerciseRequest): return {"error": "Le nombre d'exercices doit être supérieur à 0"} pdf_filename = create_math_exercises_pdf( - request.min_table, request.max_table, request.num_exercises + request.min_table, request.max_table, request.num_exercises, request.multiplication_only ) # Return redirect to automatically download the file diff --git a/app/templates/index.html b/app/templates/index.html index 0e7c146..039222d 100644 --- a/app/templates/index.html +++ b/app/templates/index.html @@ -61,6 +61,11 @@
Nombre total d'exercices à générer (entre 1 et 100)
+
+ + +
+