diff --git a/app/scodoc/sco_inscr_passage.py b/app/scodoc/sco_inscr_passage.py
index d9a562f46d18093a29ba5bf27a8b56230a05ad5d..58b5a0d923ae9364ecd0d02bfd8fa839f3f05bcf 100644
--- a/app/scodoc/sco_inscr_passage.py
+++ b/app/scodoc/sco_inscr_passage.py
@@ -39,21 +39,22 @@ from app import log
 from app.models import FormSemestre
 from app.scodoc.gen_tables import GenTable
 from app.scodoc import html_sco_header
+from app.scodoc import sco_cache
 from app.scodoc import sco_codes_parcours
-from app.scodoc import sco_preferences
-from app.scodoc import sco_pvjury
+from app.scodoc import sco_etud
+from app.scodoc import sco_formations
 from app.scodoc import sco_formsemestre
 from app.scodoc import sco_formsemestre_inscriptions
-from app.scodoc import sco_formations
 from app.scodoc import sco_groups
-from app.scodoc import sco_etud
+from app.scodoc import sco_preferences
+from app.scodoc import sco_pvjury
 from app.scodoc.sco_exceptions import ScoValueError
 
 
 def list_authorized_etuds_by_sem(sem, delai=274, ignore_jury=False):
     """Liste des etudiants autorisés à s'inscrire dans sem.
     delai = nb de jours max entre la date de l'autorisation et celle de debut du semestre cible.
-    ignore_jury: si vrai, considère tous les étudiants comem autorisés, même
+    ignore_jury: si vrai, considère tous les étudiants comme autorisés, même
     s'ils n'ont pas de décision de jury.
     """
     src_sems = list_source_sems(sem, delai=delai)
@@ -276,8 +277,8 @@ def formsemestre_inscr_passage(
     submitted=False,
     dialog_confirmed=False,
     ignore_jury=False,
-):
-    """Form. pour inscription des etudiants d'un semestre dans un autre
+) -> str:
+    """Page Form. pour inscription des etudiants d'un semestre dans un autre
     (donné par formsemestre_id).
     Permet de selectionner parmi les etudiants autorisés à s'inscrire.
     Principe:
@@ -285,8 +286,8 @@ def formsemestre_inscr_passage(
     - afficher chaque semestre "boites" avec cases à cocher
     - si l'étudiant est déjà inscrit, le signaler (gras, nom de groupes): il peut être désinscrit
     - on peut choisir les groupes TD, TP, TA
-    - seuls les etudiants non inscrits changent (de groupe)
-    - les etudiants inscrit qui se trouvent décochés sont désinscrits
+    - seuls les étudiants non inscrits changent (de groupe)
+    - les étudiants inscrit qui se trouvent décochés sont désinscrits
     - Confirmation: indiquer les étudiants inscrits et ceux désinscrits, le total courant.
 
     """
@@ -326,11 +327,9 @@ def formsemestre_inscr_passage(
         a_desinscrire = inscrits_set - etuds_set
     else:
         a_inscrire = a_desinscrire = []
-    # log('formsemestre_inscr_passage: a_inscrire=%s' % str(a_inscrire) )
-    # log('formsemestre_inscr_passage: a_desinscrire=%s' % str(a_desinscrire) )
 
     if not submitted:
-        H += build_page(
+        H += _build_page(
             sem,
             auth_etuds_by_sem,
             inscrits,
@@ -343,7 +342,7 @@ def formsemestre_inscr_passage(
         if not dialog_confirmed:
             # Confirmation
             if a_inscrire:
-                H.append("<h3>Etudiants à inscrire</h3><ol>")
+                H.append("<h3>Étudiants à inscrire</h3><ol>")
                 for etud in set_to_sorted_etud_list(a_inscrire):
                     H.append("<li>%(nomprenom)s</li>" % etud)
                 H.append("</ol>")
@@ -354,7 +353,7 @@ def formsemestre_inscr_passage(
                     H.append('<li class="inscrailleurs">%(nomprenom)s</li>' % etud)
                 H.append("</ul>")
             if a_desinscrire:
-                H.append("<h3>Etudiants à désinscrire</h3><ol>")
+                H.append("<h3>Étudiants à désinscrire</h3><ol>")
                 for etudid in a_desinscrire:
                     H.append(
                         '<li class="desinscription">%(nomprenom)s</li>'
@@ -384,21 +383,29 @@ def formsemestre_inscr_passage(
                 )
             )
         else:
-            # Inscription des étudiants au nouveau semestre:
-            do_inscrit(
-                sem,
-                a_inscrire,
-                inscrit_groupes=inscrit_groupes,
-            )
-
-            # Desincriptions:
-            do_desinscrit(sem, a_desinscrire)
+            with sco_cache.DeferredSemCacheManager():
+                # Inscription des étudiants au nouveau semestre:
+                do_inscrit(
+                    sem,
+                    a_inscrire,
+                    inscrit_groupes=inscrit_groupes,
+                )
+                # Désinscriptions:
+                do_desinscrit(sem, a_desinscrire)
 
             H.append(
-                """<h3>Opération effectuée</h3>
-            <ul><li><a class="stdlink" href="formsemestre_inscr_passage?formsemestre_id=%s">Continuer les inscriptions</a></li>
-                <li><a class="stdlink" href="formsemestre_status?formsemestre_id=%s">Tableau de bord du semestre</a></li>"""
-                % (formsemestre_id, formsemestre_id)
+                f"""<h3>Opération effectuée</h3>
+                <ul>
+                <li><a class="stdlink" href="{
+                    url_for("notes.formsemestre_inscr_passage",
+                        scodoc_dept=g.scodoc_dept, formsemestre_id=formsemestre_id)
+                }">Continuer les inscriptions</a>
+                </li>
+                <li><a class="stdlink" href="{
+                    url_for("notes.formsemestre_status",
+                        scodoc_dept=g.scodoc_dept, formsemestre_id=formsemestre_id)
+                }">Tableau de bord du semestre</a>
+                </li>"""
             )
             partition = sco_groups.formsemestre_get_main_partition(formsemestre_id)
             if (
@@ -410,7 +417,7 @@ def formsemestre_inscr_passage(
                 H.append(
                     f"""<li><a class="stdlink" href="{
                         url_for("scolar.affect_groups",
-                scodoc_dept=g.scodoc_dept, partition_id=partition["partition_id"])
+                            scodoc_dept=g.scodoc_dept, partition_id=partition["partition_id"])
                 }">Répartir les groupes de {partition["partition_name"]}</a></li>
                 """
                 )
@@ -420,7 +427,7 @@ def formsemestre_inscr_passage(
     return "\n".join(H)
 
 
-def build_page(
+def _build_page(
     sem,
     auth_etuds_by_sem,
     inscrits,
@@ -429,6 +436,7 @@ def build_page(
     inscrit_groupes=False,
     ignore_jury=False,
 ):
+    formsemestre: FormSemestre = FormSemestre.query.get(sem["formsemestre_id"])
     inscrit_groupes = int(inscrit_groupes)
     ignore_jury = int(ignore_jury)
     if inscrit_groupes:
@@ -443,27 +451,36 @@ def build_page(
         html_sco_header.html_sem_header(
             "Passages dans le semestre", with_page_header=False
         ),
-        """<form name="f" method="post" action="%s">""" % request.base_url,
-        """<input type="hidden" name="formsemestre_id" value="%(formsemestre_id)s"/>
-    <input type="submit" name="submitted" value="Appliquer les modifications"/>
-    &nbsp;<a href="#help">aide</a>
-    """
-        % sem,  # "
-        """<input name="inscrit_groupes" type="checkbox" value="1" %s>inscrire aux mêmes groupes</input>"""
-        % inscrit_groupes_checked,
-        """<input name="ignore_jury" type="checkbox" value="1" onchange="document.f.submit()" %s>inclure tous les étudiants (même sans décision de jury)</input>"""
-        % ignore_jury_checked,
-        """<div class="pas_recap">Actuellement <span id="nbinscrits">%s</span> inscrits
-        et %d candidats supplémentaires
-        </div>"""
-        % (len(inscrits), len(candidats_non_inscrits)),
-        etuds_select_boxes(auth_etuds_by_sem, inscrits_ailleurs),
-        """<p/><input type="submit" name="submitted" value="Appliquer les modifications"/>""",
-        formsemestre_inscr_passage_help(sem),
-        """</form>""",
+        f"""<form name="f" method="post" action="{request.base_url}">
+
+        <input type="hidden" name="formsemestre_id" value="{sem['formsemestre_id']}"/>
+
+        <input type="submit" name="submitted" value="Appliquer les modifications"/>
+        &nbsp;<a href="#help">aide</a>
+
+        <input name="inscrit_groupes" type="checkbox" value="1"
+            {inscrit_groupes_checked}>inscrire aux mêmes groupes</input>
+
+        <input name="ignore_jury" type="checkbox" value="1" onchange="document.f.submit()"
+            {ignore_jury_checked}>inclure tous les étudiants (même sans décision de jury)</input>
+
+        <div class="pas_recap">Actuellement <span id="nbinscrits">{len(inscrits)}</span> inscrits
+        et {len(candidats_non_inscrits)} candidats supplémentaires
+        </div>
+
+        <div>{scu.EMO_WARNING} <em>Seuls les semestres dont la date de fin est antérieure à la date de début
+        de ce semestre ({formsemestre.date_debut.strftime("%d/%m/%Y")}) sont pris en compte.</em></div>
+        {etuds_select_boxes(auth_etuds_by_sem, inscrits_ailleurs)}
+
+        <input type="submit" name="submitted" value="Appliquer les modifications"/>
+
+        {formsemestre_inscr_passage_help(sem)}
+
+        </form>
+        """,
     ]
 
-    # Semestres sans etudiants autorisés
+    # Semestres sans étudiants autorisés
     empty_sems = []
     for formsemestre_id in auth_etuds_by_sem.keys():
         if not auth_etuds_by_sem[formsemestre_id]["etuds"]:
@@ -473,7 +490,10 @@ def build_page(
             """<div class="pas_empty_sems"><h3>Autres semestres sans candidats :</h3><ul>"""
         )
         for infos in empty_sems:
-            H.append("""<li><a href="%(title_target)s">%(title)s</a></li>""" % infos)
+            H.append(
+                """<li><a class="stdlink" href="%(title_target)s">%(title)s</a></li>"""
+                % infos
+            )
         H.append("""</ul></div>""")
 
     return H