diff --git a/app/but/jury_but.py b/app/but/jury_but.py
index 4eb7525f1503452062a586334728c346ec7946ed..22cbc070a496ee0de7384f451c96c2f5f79042f3 100644
--- a/app/but/jury_but.py
+++ b/app/but/jury_but.py
@@ -61,7 +61,6 @@ DecisionsProposeesUE: décisions de jury sur une UE du BUT
 from datetime import datetime
 import html
 import re
-from typing import Union
 
 import numpy as np
 from flask import flash, g, url_for
@@ -150,7 +149,7 @@ class DecisionsProposees:
     def __init__(
         self,
         etud: Identite = None,
-        code: Union[str, list[str]] = None,
+        code: str | list[str] | None = None,
         explanation="",
         code_valide=None,
         include_communs=True,
diff --git a/app/but/rcue.py b/app/but/rcue.py
index b7cf2711e5706eee24bfeb05ee584402c4f9d04a..5a5fce3ea9525ae6964c4fe21c3229bfdaf2d2da 100644
--- a/app/but/rcue.py
+++ b/app/but/rcue.py
@@ -6,7 +6,6 @@
 
 """Jury BUT: un RCUE, ou Regroupe Cohérent d'UEs
 """
-from typing import Union
 from flask_sqlalchemy.query import Query
 
 from app.comp.res_but import ResultatsSemestreBUT
@@ -205,7 +204,7 @@ class RegroupementCoherentUE:
             self.moy_rcue > codes_cursus.BUT_BARRE_RCUE
         )
 
-    def code_valide(self) -> Union[ApcValidationRCUE, None]:
+    def code_valide(self) -> ApcValidationRCUE | None:
         "Si ce RCUE est ADM, CMP ou ADJ, la validation. Sinon, None"
         validation = self.query_validations().first()
         if (validation is not None) and (
diff --git a/app/models/assiduites.py b/app/models/assiduites.py
index 994a88e07bc1a6cc190939b03f160d37e08b5eac..ca787e980dfa8d8cc8efcd25581144b030cff8a7 100644
--- a/app/models/assiduites.py
+++ b/app/models/assiduites.py
@@ -123,7 +123,7 @@ class Assiduite(db.Model):
         user_id: int = None,
         est_just: bool = False,
         external_data: dict = None,
-    ) -> object or int:
+    ) -> "Assiduite":
         """Créer une nouvelle assiduité pour l'étudiant"""
         # Vérification de non duplication des périodes
         assiduites: Query = etud.assiduites
@@ -285,7 +285,7 @@ class Justificatif(db.Model):
         entry_date: datetime = None,
         user_id: int = None,
         external_data: dict = None,
-    ) -> object or int:
+    ) -> "Justificatif":
         """Créer un nouveau justificatif pour l'étudiant"""
         nouv_justificatif = Justificatif(
             date_debut=date_debut,
@@ -313,7 +313,7 @@ def is_period_conflicting(
     date_debut: datetime,
     date_fin: datetime,
     collection: Query,
-    collection_cls: Assiduite or Justificatif,
+    collection_cls: Assiduite | Justificatif,
 ) -> bool:
     """
     Vérifie si une date n'entre pas en collision
diff --git a/app/scodoc/sco_archives.py b/app/scodoc/sco_archives.py
index 51bba4b208a4a1c9475eeaf99a86e4afbc028894..9c05c6535b675853496392f54fe5a8533b154ab0 100644
--- a/app/scodoc/sco_archives.py
+++ b/app/scodoc/sco_archives.py
@@ -47,7 +47,6 @@
  nommé _description.txt qui est une description (humaine, format libre) de l'archive.
 
 """
-from typing import Union
 import datetime
 import glob
 import json
@@ -253,7 +252,7 @@ class BaseArchiver:
         self,
         archive_id: str,
         filename: str,
-        data: Union[str, bytes],
+        data: str | bytes,
         dept_id: int = None,
     ):
         """Store data in archive, under given filename.
diff --git a/app/scodoc/sco_assiduites.py b/app/scodoc/sco_assiduites.py
index 1ad5332d4043e50873c3673e447578317bda5605..c80a5f55e9dff21a214f162b8160bfe73ed3a5f4 100644
--- a/app/scodoc/sco_assiduites.py
+++ b/app/scodoc/sco_assiduites.py
@@ -141,12 +141,9 @@ class CountCalculator:
         self.hours += finish_hours.total_seconds() / 3600
         self.hours += self.hour_per_day - (start_hours.total_seconds() / 3600)
 
-    def compute_assiduites(self, assiduites: Query or list):
+    def compute_assiduites(self, assiduites: Query | list):
         """Calcule les métriques pour la collection d'assiduité donnée"""
         assi: Assiduite
-        assiduites: list[Assiduite] = (
-            assiduites.all() if isinstance(assiduites, Query) else assiduites
-        )
         for assi in assiduites:
             self.count += 1
             delta: timedelta = assi.date_fin - assi.date_debut
@@ -167,7 +164,7 @@ class CountCalculator:
 
             self.hours += delta.total_seconds() / 3600
 
-    def to_dict(self) -> dict[str, int or float]:
+    def to_dict(self) -> dict[str, int | float]:
         """Retourne les métriques sous la forme d'un dictionnaire"""
         return {
             "compte": self.count,
@@ -179,7 +176,7 @@ class CountCalculator:
 
 def get_assiduites_stats(
     assiduites: Query, metric: str = "all", filtered: dict[str, object] = None
-) -> dict[str, int or float]:
+) -> dict[str, int | float]:
     """Compte les assiduités en fonction des filtres"""
 
     if filtered is not None:
@@ -276,7 +273,7 @@ def filter_assiduites_by_est_just(assiduites: Assiduite, est_just: bool) -> Quer
 
 
 def filter_by_user_id(
-    collection: Assiduite or Justificatif,
+    collection: Assiduite | Justificatif,
     user_id: int,
 ) -> Query:
     """
@@ -286,8 +283,8 @@ def filter_by_user_id(
 
 
 def filter_by_date(
-    collection: Assiduite or Justificatif,
-    collection_cls: Assiduite or Justificatif,
+    collection: Assiduite | Justificatif,
+    collection_cls: Assiduite | Justificatif,
     date_deb: datetime = None,
     date_fin: datetime = None,
     strict: bool = False,
@@ -320,7 +317,7 @@ def filter_justificatifs_by_etat(justificatifs: Query, etat: str) -> Query:
     return justificatifs.filter(Justificatif.etat.in_(etats))
 
 
-def filter_by_module_impl(assiduites: Assiduite, module_impl_id: int or None) -> Query:
+def filter_by_module_impl(assiduites: Assiduite, module_impl_id: int | None) -> Query:
     """
     Filtrage d'une collection d'assiduites en fonction de l'ID du module_impl
     """
@@ -328,8 +325,8 @@ def filter_by_module_impl(assiduites: Assiduite, module_impl_id: int or None) ->
 
 
 def filter_by_formsemestre(
-    collection_query: Assiduite or Justificatif,
-    collection_class: Assiduite or Justificatif,
+    collection_query: Assiduite | Justificatif,
+    collection_class: Assiduite | Justificatif,
     formsemestre: FormSemestre,
 ) -> Query:
     """
@@ -358,7 +355,7 @@ def filter_by_formsemestre(
     return collection_result.filter(collection_class.date_fin <= form_date_fin)
 
 
-def justifies(justi: Justificatif, obj: bool = False) -> list[int] or Query:
+def justifies(justi: Justificatif, obj: bool = False) -> list[int] | Query:
     """
     Retourne la liste des assiduite_id qui sont justifié par la justification
     Une assiduité est justifiée si elle est COMPLETEMENT ou PARTIELLEMENT
@@ -597,7 +594,7 @@ def invalidate_assiduites_etud_date(etudid, date: datetime):
         invalidate_assiduites_count(etudid, sem)
 
 
-def simple_invalidate_cache(obj: dict, etudid: str or int = None):
+def simple_invalidate_cache(obj: dict, etudid: str | int = None):
     """Invalide le cache de l'étudiant et du / des semestres"""
     date_debut = (
         obj["date_debut"]
diff --git a/app/views/assiduites.py b/app/views/assiduites.py
index c40345c9bb0ff738c434087b47be11e4df8518cd..a2e5a3b1d7e02cb6d0b4bac90133c711171e7a3a 100644
--- a/app/views/assiduites.py
+++ b/app/views/assiduites.py
@@ -109,13 +109,13 @@ class HTMLStringElement(HTMLElement):
 
 
 class HTMLBuilder:
-    def __init__(self, *content: HTMLElement or str) -> None:
-        self.content: list[HTMLElement or str] = list(content)
+    def __init__(self, *content: HTMLElement | str) -> None:
+        self.content: list[HTMLElement | str] = list(content)
 
-    def add(self, *element: HTMLElement or str):
+    def add(self, *element: HTMLElement | str):
         self.content.extend(element)
 
-    def remove(self, element: HTMLElement or str):
+    def remove(self, element: HTMLElement | str):
         if element in self.content:
             self.content.remove(element)
 
diff --git a/tools/migrate_abs_to_assiduites.py b/tools/migrate_abs_to_assiduites.py
index 68e2cab98ee1b21862b8c0ef608bd907cf0d4248..87c799dfffd44db0535fa44a5d25433dafa7dbd3 100644
--- a/tools/migrate_abs_to_assiduites.py
+++ b/tools/migrate_abs_to_assiduites.py
@@ -152,7 +152,6 @@ class _Merger:
 
     def export(self):
         """Génère un nouvel objet Assiduité ou Justificatif"""
-        obj: Assiduite or Justificatif = None
         if self.est_abs:
             _glob.COMPTE[0] += 1
             self._to_assi()
@@ -167,7 +166,7 @@ def _assi_in_justifs(deb, fin, etudid):
 
 class _Statistics:
     def __init__(self) -> None:
-        self.object: dict[str, dict or int] = {"total": 0}
+        self.object: dict[str, dict | int] = {"total": 0}
         self.year: int = None
 
     def __set_year(self, year: int):