diff --git a/app/models/formsemestre.py b/app/models/formsemestre.py index dc6b8cf19..3a9e00155 100644 --- a/app/models/formsemestre.py +++ b/app/models/formsemestre.py @@ -18,7 +18,7 @@ from operator import attrgetter from flask_login import current_user -from flask import flash, g, url_for +from flask import abort, flash, g, url_for from sqlalchemy.sql import text from sqlalchemy import func @@ -185,9 +185,14 @@ class FormSemestre(db.Model): @classmethod def get_formsemestre( - cls, formsemestre_id: int, dept_id: int = None + cls, formsemestre_id: int | str, dept_id: int = None ) -> "FormSemestre": """ "FormSemestre ou 404, cherche uniquement dans le département spécifié ou le courant""" + if not isinstance(formsemestre_id, int): + try: + formsemestre_id = int(formsemestre_id) + except (TypeError, ValueError): + abort(404, "formsemestre_id invalide") if g.scodoc_dept: dept_id = dept_id if dept_id is not None else g.scodoc_dept_id if dept_id is not None: @@ -385,13 +390,18 @@ class FormSemestre(db.Model): return ues @classmethod - def get_user_formsemestres_annee( + def get_user_formsemestres_annee_by_dept( cls, user: User - ) -> tuple[list["FormSemestre"], defaultdict[int, list[ModuleImpl]]]: + ) -> tuple[ + defaultdict[int, list["FormSemestre"]], defaultdict[int, list[ModuleImpl]] + ]: """Liste des formsemestres de l'année scolaire dans lesquels user intervient (comme resp., resp. de module ou enseignant), ainsi que la liste des modimpls concernés dans chaque formsemestre Attention: les semestres et modimpls peuvent être de différents départements ! + Résultat: + { dept_id : [ formsemestre, ... ] }, + { formsemestre_id : [ modimpl, ... ]} """ debut_annee_scolaire = scu.date_debut_annee_scolaire() fin_annee_scolaire = scu.date_fin_annee_scolaire() @@ -439,9 +449,11 @@ class FormSemestre(db.Model): formsemestres.append(modimpl.formsemestre) ids.add(modimpl.formsemestre_id) modimpls_by_formsemestre[modimpl.formsemestre_id].append(modimpl) - # Tris + # Tris et organisation par département + formsemestres_by_dept = defaultdict(lambda: []) formsemestres.sort(key=lambda x: (x.departement.acronym,) + x.sort_key()) for formsemestre in formsemestres: + formsemestres_by_dept[formsemestre.dept_id].append(formsemestre) modimpls = modimpls_by_formsemestre[formsemestre.id] if formsemestre.formation.is_apc(): key = lambda x: x.module.sort_key_apc() @@ -449,7 +461,7 @@ class FormSemestre(db.Model): key = lambda x: x.module.sort_key() modimpls.sort(key=key) - return formsemestres, modimpls_by_formsemestre + return formsemestres_by_dept, modimpls_by_formsemestre def get_evaluations(self) -> list[Evaluation]: "Liste de toutes les évaluations du semestre, triées par module/numero" diff --git a/app/templates/user_board/user_board.j2 b/app/templates/user_board/user_board.j2 index 1413a15ae..78f18283c 100644 --- a/app/templates/user_board/user_board.j2 +++ b/app/templates/user_board/user_board.j2 @@ -65,32 +65,44 @@