diff --git a/app/api/etudiants.py b/app/api/etudiants.py
index 821a545c34e22adebb9d8860fd1e3ee20054960d..bc9b363526a613da142d10c4478090e4424bde2c 100755
--- a/app/api/etudiants.py
+++ b/app/api/etudiants.py
@@ -5,11 +5,11 @@
 ##############################################################################
 
 """
-  API : accès aux étudiants
+API : accès aux étudiants
 
-  CATEGORY
-  --------
-  Étudiants
+CATEGORY
+--------
+Étudiants
 """
 from datetime import datetime
 from operator import attrgetter
@@ -35,8 +35,8 @@ from app.models import (
     FormSemestreInscription,
     FormSemestre,
     Identite,
-    ScolarNews,
 )
+from app.models.etudiants import create_etud_with_adresse_admission
 from app.scodoc import sco_bulletins
 from app.scodoc import sco_groups
 from app.scodoc.sco_bulletins import do_formsemestre_bulletinetud
@@ -549,32 +549,8 @@ def etudiant_create(force=False):
         return scu.json_error(
             400, f"{len(homonyms)} homonymes détectés. Vous pouvez utiliser /force."
         )
-    etud = Identite.create_etud(**args)
-    db.session.flush()
-    # --- Données admission
-    admission_args = args.get("admission", None)
-    if admission_args:
-        etud.admission.from_dict(admission_args)
-    # --- Adresse
-    adresses = args.get("adresses", [])
-    if adresses:
-        # ne prend en compte que la première adresse
-        # car si la base est concue pour avoir plusieurs adresses par étudiant,
-        # l'application n'en gère plus qu'une seule.
-        adresse = etud.adresses.first()
-        adresse.from_dict(adresses[0])
-
-    # Poste une nouvelle dans le département concerné:
-    ScolarNews.add(
-        typ=ScolarNews.NEWS_INSCR,
-        text=f"Nouvel étudiant {etud.html_link_fiche()}",
-        url=etud.url_fiche(),
-        max_frequency=0,
-        dept_id=dept_o.id,
-    )
+    etud = create_etud_with_adresse_admission(args)
     db.session.commit()
-    # Note: je ne comprends pas pourquoi un refresh est nécessaire ici
-    # sans ce refresh, etud.__dict__ est incomplet (pas de 'nom').
     db.session.refresh(etud)
 
     r = etud.to_dict_api(restrict=False)  # pas de restriction, on vient de le créer
diff --git a/app/models/etudiants.py b/app/models/etudiants.py
index bf337158df12ea3e5787edafabf7bff1d75491f4..573f3f2ba0ef0ac80ec09daaf373fff64d6e65b1 100644
--- a/app/models/etudiants.py
+++ b/app/models/etudiants.py
@@ -1,7 +1,7 @@
 # -*- coding: UTF-8 -*
 
 """Définition d'un étudiant
-    et données rattachées (adresses, annotations, ...)
+et données rattachées (adresses, annotations, ...)
 """
 
 import datetime
@@ -1192,6 +1192,7 @@ class ItemSuivi(models.ScoDocModel):
 
 class ItemSuiviTag(models.ScoDocModel):
     "Tag sur un itemsuivi"
+
     __tablename__ = "itemsuivi_tags"
     id = db.Column(db.Integer, primary_key=True)
     dept_id = db.Column(db.Integer, db.ForeignKey("departement.id"), index=True)
@@ -1231,5 +1232,39 @@ class EtudAnnotation(models.ScoDocModel):
         return e
 
 
+def create_etud_with_adresse_admission(
+    args: dict, dept: Departement | None = None
+) -> Identite:
+    """Création d'un étudiant avec adresse et admission.
+    Poste une "nouvelle".
+    Renvoie l'étudiant créé.
+    """
+    etud = Identite.create_etud(**args)
+    db.session.flush()
+    # --- Données admission
+    admission_args = args.get("admission", None)
+    if admission_args:
+        etud.admission.from_dict(admission_args)
+    # --- Adresse
+    adresses = args.get("adresses", [])
+    if adresses:
+        # ne prend en compte que la première adresse
+        # car si la base est concue pour avoir plusieurs adresses par étudiant,
+        # l'application n'en gère plus qu'une seule.
+        adresse = etud.adresses.first()
+        adresse.from_dict(adresses[0])
+
+    # Poste une nouvelle dans le département concerné:
+    if dept:
+        ScolarNews.add(
+            typ=ScolarNews.NEWS_INSCR,
+            text=f"Nouvel étudiant {etud.html_link_fiche()}",
+            url=etud.url_fiche(),
+            max_frequency=0,
+            dept_id=dept.id,
+        )
+    return etud
+
+
 from app.models.formsemestre import FormSemestre, FormSemestreInscription
 from app.models.moduleimpls import ModuleImpl, ModuleImplInscription