diff --git a/app/api/justificatifs.py b/app/api/justificatifs.py
index d9e66a527f9f89bf61bbd225f82fa026862c3ff1..e5bdab494b0597ba87ebd4b06a819a780df43fec 100644
--- a/app/api/justificatifs.py
+++ b/app/api/justificatifs.py
@@ -195,7 +195,7 @@ def justificatifs_dept(dept_id: int = None, with_query: bool = False):
     """
 
     # Récupération du département et des étudiants du département
-    dept: Departement = Departement.query.get(dept_id)
+    dept: Departement = db.session.get(Departement, dept_id)
     if dept is None:
         return json_error(404, "Assiduité non existante")
     etuds: list[int] = [etud.id for etud in dept.etudiants]
diff --git a/app/but/change_refcomp.py b/app/but/change_refcomp.py
index dc91d717bb6d13f035e81dc907e05af4e57f024a..4f4a8e23f34ca986b2bfbb48dc2fe6ea4e55e56a 100644
--- a/app/but/change_refcomp.py
+++ b/app/but/change_refcomp.py
@@ -44,7 +44,9 @@ def formation_change_referentiel(
             ue.niveau_competence_id = niveaux_map[ue.niveau_competence_id]
             db.session.add(ue)
         if ue.parcours:
-            new_list = [ApcParcours.query.get(parcours_map[p.id]) for p in ue.parcours]
+            new_list = [
+                db.session.get(ApcParcours, parcours_map[p.id]) for p in ue.parcours
+            ]
             ue.parcours.clear()
             ue.parcours.extend(new_list)
             db.session.add(ue)
@@ -52,7 +54,7 @@ def formation_change_referentiel(
     for module in formation.modules:
         if module.parcours:
             new_list = [
-                ApcParcours.query.get(parcours_map[p.id]) for p in module.parcours
+                db.session.get(ApcParcours, parcours_map[p.id]) for p in module.parcours
             ]
             module.parcours.clear()
             module.parcours.extend(new_list)
@@ -76,7 +78,8 @@ def formation_change_referentiel(
     # FormSemestre / parcours_formsemestre
     for formsemestre in formation.formsemestres:
         new_list = [
-            ApcParcours.query.get(parcours_map[p.id]) for p in formsemestre.parcours
+            db.session.get(ApcParcours, parcours_map[p.id])
+            for p in formsemestre.parcours
         ]
         formsemestre.parcours.clear()
         formsemestre.parcours.extend(new_list)
diff --git a/app/comp/moy_ue.py b/app/comp/moy_ue.py
index 5e88f29e353fa713bce89b8871ddaa17fcbed137..824f01e8d600bfc1afdb254d4e1e707825443704 100644
--- a/app/comp/moy_ue.py
+++ b/app/comp/moy_ue.py
@@ -178,7 +178,7 @@ def notes_sem_assemble_cube(modimpls_notes: list[pd.DataFrame]) -> np.ndarray:
     except ValueError:
         app.critical_error(
             f"""notes_sem_assemble_cube: shapes {
-            ", ".join([x.shape for x in modimpls_notes_arr])}"""
+            ", ".join([str(x.shape) for x in modimpls_notes_arr])}"""
         )
     return modimpls_notes.swapaxes(0, 1)
 
diff --git a/app/models/assiduites.py b/app/models/assiduites.py
index 679a770c31f97eec46a59d242effebb9b34e0bdc..7104c86ad4f79559e4eda7713e106e9a910f6ea5 100644
--- a/app/models/assiduites.py
+++ b/app/models/assiduites.py
@@ -297,7 +297,7 @@ class Assiduite(ScoDocModel):
                 moduleimpl_id = int(moduleimpl_id)
             except ValueError as exc:
                 raise ScoValueError("Module non reconnu") from exc
-            moduleimpl: ModuleImpl = ModuleImpl.query.get(moduleimpl_id)
+            moduleimpl: ModuleImpl = db.session.get(ModuleImpl, moduleimpl_id)
 
         # ici moduleimpl est None si non spécifié
 
@@ -352,8 +352,8 @@ class Assiduite(ScoDocModel):
         """
 
         if self.moduleimpl_id is not None:
-            modimpl: ModuleImpl = ModuleImpl.query.get(self.moduleimpl_id)
-            mod: Module = Module.query.get(modimpl.module_id)
+            modimpl: ModuleImpl = db.session.get(ModuleImpl, self.moduleimpl_id)
+            mod: Module = db.session.get(Module, modimpl.module_id)
             if traduire:
                 return f"{mod.code} {mod.titre}"
             return mod
diff --git a/app/scodoc/sco_formsemestre_inscriptions.py b/app/scodoc/sco_formsemestre_inscriptions.py
index 1cae5472714036ccfe8a11116496c219e9da0e2f..0c4330362d0e83a497f48e77cec53bd6c8bfa750 100644
--- a/app/scodoc/sco_formsemestre_inscriptions.py
+++ b/app/scodoc/sco_formsemestre_inscriptions.py
@@ -196,7 +196,7 @@ def check_if_has_decision_jury(
     nt: NotesTableCompat = res_sem.load_formsemestre_results(formsemestre)
     for etudid in etudids:
         if nt.etud_has_decision(etudid):
-            etud = Identite.query.get(etudid)
+            etud = db.session.get(Identite, etudid)
             raise ScoValueError(
                 f"""désinscription impossible: l'étudiant {etud.nomprenom} a
                 une décision de jury (la supprimer avant si nécessaire)"""
diff --git a/app/scodoc/sco_inscr_passage.py b/app/scodoc/sco_inscr_passage.py
index 968c85d6c601b1082c3400d3d71acf3c797906f0..79864a63e7fe56497dcad22c11ed2b126cfe6d0d 100644
--- a/app/scodoc/sco_inscr_passage.py
+++ b/app/scodoc/sco_inscr_passage.py
@@ -377,7 +377,7 @@ def formsemestre_inscr_passage(
             if a_desinscrire:
                 H.append("<h3>Étudiants à désinscrire</h3><ol>")
                 a_desinscrire_ident = sorted(
-                    (Identite.query.get(eid) for eid in a_desinscrire),
+                    (db.session.get(Identite, eid) for eid in a_desinscrire),
                     key=lambda x: x.sort_key,
                 )
                 for etud in a_desinscrire_ident:
diff --git a/app/scodoc/sco_pv_dict.py b/app/scodoc/sco_pv_dict.py
index fa842924494a44741bba6af1c3739c6f21325c5f..b62dd11a55f5b1907bd628c59c2f9a36fb62a9c1 100644
--- a/app/scodoc/sco_pv_dict.py
+++ b/app/scodoc/sco_pv_dict.py
@@ -292,7 +292,7 @@ def _descr_decisions_ues(nt, etudid, decisions_ue, decision_sem) -> list[dict]:
                 )
             )
         ):
-            ue = UniteEns.query.get(ue_id)
+            ue = db.session.get(UniteEns, ue_id)
             assert ue
             # note modernisation code: on utilise des dict tant que get_etud_ue_status renvoie des dicts
             uelist.append(ue.to_dict())
diff --git a/app/scodoc/sco_saisie_notes.py b/app/scodoc/sco_saisie_notes.py
index cad79c3fc3d36b3b1dd5cacad40afd9261c9572d..5be6839677c09ec21a5116dd2d97aa46266d97e2 100644
--- a/app/scodoc/sco_saisie_notes.py
+++ b/app/scodoc/sco_saisie_notes.py
@@ -408,7 +408,7 @@ def _check_inscription(
     elif etudid not in etudids_inscrits_mod:
         msg_err = "non inscrit au module"
     if msg_err:
-        etud = Identite.query.get(etudid) if isinstance(etudid, int) else None
+        etud = db.session.get(Identite, etudid) if isinstance(etudid, int) else None
         msg = f"étudiant {etud.nomprenom if etud else etudid} {msg_err}"
         log(f"notes_add: {etudid} {msg}: aborting")
         raise NoteProcessError(msg)
@@ -454,7 +454,7 @@ def notes_add(
 
         if (value is not None) and not isinstance(value, float):
             log(f"notes_add: {etudid} valeur de note invalide ({value}): aborting")
-            etud = Identite.query.get(etudid) if isinstance(etudid, int) else None
+            etud = db.session.get(Identite, etudid) if isinstance(etudid, int) else None
             raise NoteProcessError(
                 f"etudiant {etud.nomprenom if etud else etudid}: valeur de note invalide ({value})"
             )
@@ -491,7 +491,9 @@ def notes_add(
                 # si change sur DEM/DEF ajoute message warning aux messages
                 if etudid not in etudids_actifs:  # DEM ou DEF
                     etud = (
-                        Identite.query.get(etudid) if isinstance(etudid, int) else None
+                        db.session.get(Identite, etudid)
+                        if isinstance(etudid, int)
+                        else None
                     )
                     messages.append(
                         f"""étudiant {etud.nomprenom if etud else etudid
@@ -802,7 +804,7 @@ def get_sorted_etuds_notes(
                 notes_db[etudid]["value"], fixed_precision_str=False
             )
             user = (
-                User.query.get(notes_db[etudid]["uid"])
+                db.session.get(User, notes_db[etudid]["uid"])
                 if notes_db[etudid]["uid"]
                 else None
             )
diff --git a/app/scodoc/sco_ue_external.py b/app/scodoc/sco_ue_external.py
index 34bcff77096499c7532f73c402e3942994cd05f1..2ad5b53ae218001328656cff5d3a0b1978e1822a 100644
--- a/app/scodoc/sco_ue_external.py
+++ b/app/scodoc/sco_ue_external.py
@@ -144,7 +144,7 @@ def external_ue_create(
             ),
         },
     )
-    modimpl = ModuleImpl.query.get(moduleimpl_id)
+    modimpl = db.session.get(ModuleImpl, moduleimpl_id)
     assert modimpl
     return modimpl
 
@@ -206,7 +206,7 @@ def get_external_moduleimpl(formsemestre_id: int, ue_id: int) -> ModuleImpl:
     )
     if r:
         modimpl_id = r[0]["moduleimpl_id"]
-        modimpl = ModuleImpl.query.get(modimpl_id)
+        modimpl = db.session.get(ModuleImpl, modimpl_id)
         assert modimpl
         return modimpl
     else:
diff --git a/app/tables/liste_assiduites.py b/app/tables/liste_assiduites.py
index ea808c53f9193dc88a4ce98188c24f47a5752037..1051a0fb012b9d9e4164422dd4c9b70f68f135a1 100644
--- a/app/tables/liste_assiduites.py
+++ b/app/tables/liste_assiduites.py
@@ -553,7 +553,7 @@ class RowAssiJusti(tb.Row):
             )
         if self.table.options.show_module:
             if self.ligne["type"] == "assiduite":
-                assi: Assiduite = Assiduite.query.get(self.ligne["obj_id"])
+                assi: Assiduite = db.session.get(Assiduite, self.ligne["obj_id"])
                 # Gestion des colonnes concernant le module
                 mod: Module = assi.get_module(False)
                 code = mod.code if isinstance(mod, Module) else ""
@@ -607,7 +607,9 @@ class RowAssiJusti(tb.Row):
 
     def _utilisateur(self) -> None:
         utilisateur: User = (
-            User.query.get(self.ligne["user_id"]) if self.ligne["user_id"] else None
+            db.session.get(User, self.ligne["user_id"])
+            if self.ligne["user_id"] is not None
+            else None
         )
 
         self.add_cell(
diff --git a/app/views/assiduites.py b/app/views/assiduites.py
index 10e092cba1a02a0f72b5ab4481f4121fc4ffe7dd..058156a2ba92223a5605704e36da5c27bb43431d 100644
--- a/app/views/assiduites.py
+++ b/app/views/assiduites.py
@@ -24,6 +24,9 @@
 #
 ##############################################################################
 
+"""Vues assiduité
+"""
+
 import datetime
 import json
 import re
@@ -508,7 +511,7 @@ def _record_assiduite_etud(
         case None:
             moduleimpl = None
         case _:
-            moduleimpl = ModuleImpl.query.get(moduleimpl_id)
+            moduleimpl = db.session.get(ModuleImpl, moduleimpl_id)
     try:
         assi_etat: scu.EtatAssiduite = scu.EtatAssiduite.get(form.assi_etat.data)
 
@@ -1678,7 +1681,7 @@ def _preparer_objet(
         if not sans_gros_objet:
             justificatifs: list[int] = get_assiduites_justif(objet.assiduite_id, False)
             for justi_id in justificatifs:
-                justi: Justificatif = Justificatif.query.get(justi_id)
+                justi: Justificatif = db.session.get(Justificatif, justi_id)
                 objet_prepare["justification"]["justificatifs"].append(
                     _preparer_objet("justificatif", justi, sans_gros_objet=True)
                 )
@@ -1717,7 +1720,7 @@ def _preparer_objet(
     objet_prepare["etud_nom"] = objet.etudiant.nomprenom
 
     if objet.user_id is not None:
-        user: User = User.query.get(objet.user_id)
+        user: User = db.session.get(User, objet.user_id)
         objet_prepare["saisie_par"] = user.get_nomprenom()
     else:
         objet_prepare["saisie_par"] = "Inconnu"
@@ -2925,7 +2928,7 @@ def _module_selector_multiple(
     )
     choices = OrderedDict()
     for formsemestre_id in modimpls_by_formsemestre:
-        formsemestre: FormSemestre = FormSemestre.query.get(formsemestre_id)
+        formsemestre: FormSemestre = db.session.get(FormSemestre, formsemestre_id)
         if only_form is not None and formsemestre != only_form:
             continue
         # indique le nom du semestre dans le menu (optgroup)
diff --git a/app/views/scolar.py b/app/views/scolar.py
index 27a1451cc38cd9ef889744c27a8d7b4d8386b6bc..a681b8e1d42919d11a38c16ac625a191ba40fc6c 100644
--- a/app/views/scolar.py
+++ b/app/views/scolar.py
@@ -2112,7 +2112,7 @@ def check_group_apogee(group_id, etat=None, fix=False, fixmail=False):
 def export_etudiants_courants():
     """Table export de tous les étudiants des formsemestres en cours."""
     fmt = request.args.get("fmt", "html")
-    departement = Departement.query.get(g.scodoc_dept_id)
+    departement = db.session.get(Departement, g.scodoc_dept_id)
     if not departement:
         raise ScoValueError("département invalide")
     formsemestres = FormSemestre.get_dept_formsemestres_courants(departement).all()
@@ -2462,7 +2462,7 @@ def formsemestre_import_etud_admission(
     Si tous_courants, le fait pour tous les formsemestres courants du département
     """
     if tous_courants:
-        departement = Departement.query.get(g.scodoc_dept_id)
+        departement = db.session.get(Departement, g.scodoc_dept_id)
         formsemestres = FormSemestre.get_dept_formsemestres_courants(departement)
     else:
         formsemestres = [FormSemestre.get_formsemestre(formsemestre_id)]
@@ -2557,13 +2557,9 @@ def sco_dump_and_send_db(message="", request_url="", traceback_str_base64=""):
     try:
         r_msg = r.json()["message"]
     except (requests.exceptions.JSONDecodeError, KeyError):
-        r_msg = "Erreur: code <tt>"
-        +status_code
-        +'</tt> Merci de contacter <a href="mailto:'
-        +scu.SCO_DEV_MAIL
-        +'">'
-        +scu.SCO_DEV_MAIL
-        +"</a>"
+        r_msg = f"""Erreur: code <tt>{status_code}</tt>
+        Merci de contacter <a href="mailto:{scu.SCO_DEV_MAIL}">{scu.SCO_DEV_MAIL}</a>
+        """
 
     H = [html_sco_header.sco_header(page_title="Assistance technique")]
     if status_code == requests.codes.OK:  # pylint: disable=no-member
diff --git a/app/views/user_board.py b/app/views/user_board.py
index eee48c3420ba5dc3cb70e4abdf4920ce4a1df878..fe3489e4106dcc19ca9b5c5e28fefc4a5133eb7e 100644
--- a/app/views/user_board.py
+++ b/app/views/user_board.py
@@ -4,10 +4,10 @@ Tableau de bord utilisateur
 Emmanuel Viennet, 2023
 """
 
-
 from flask import flash, redirect, render_template, url_for
 from flask import g, request
 from flask_login import login_required
+from app import db
 from app.auth.models import User
 from app.decorators import (
     scodoc,
@@ -31,7 +31,8 @@ def user_board(user_name: str):
         modimpls_by_formsemestre,
     ) = FormSemestre.get_user_formsemestres_annee_by_dept(user)
     depts = {
-        dept_id: Departement.query.get(dept_id) for dept_id in formsemestres_by_dept
+        dept_id: db.session.get(Departement, dept_id)
+        for dept_id in formsemestres_by_dept
     }
     dept_names = {
         dept_id: sco_preferences.get_preference("DeptName", dept_id=dept_id)
diff --git a/tests/unit/test_sco_basic.py b/tests/unit/test_sco_basic.py
index e159391c46295cc3308593741926a0b3d13d899a..f1d933fdb775295bcaa8343dbf1db090b99330f7 100644
--- a/tests/unit/test_sco_basic.py
+++ b/tests/unit/test_sco_basic.py
@@ -250,7 +250,7 @@ def run_sco_basic(verbose=False, dept=None) -> FormSemestre:
 
 
 def _signal_absences_justificatifs(etudid: int):
-    etud: Identite = Identite.query.get(etudid)
+    etud: Identite = db.session.get(Identite, etudid)
     db.session.commit()
     for i in range(15, 18):
         db.session.add(