diff --git a/app/models/etudiants.py b/app/models/etudiants.py index 9bb6cc56..18387a56 100644 --- a/app/models/etudiants.py +++ b/app/models/etudiants.py @@ -237,6 +237,8 @@ class Identite(models.ScoDocModel): Les clés adresses et admission ne SONT PAS utilisées. (added to session but not flushed nor commited) """ + check_etud_duplicate_code(args, "code_nip", dest_url=None) + check_etud_duplicate_code(args, "code_ine", dest_url=None) if not "dept_id" in args: if "dept" in args: departement = Departement.query.filter_by(acronym=args["dept"]).first() @@ -248,8 +250,19 @@ class Identite(models.ScoDocModel): if args.get("admission_id", None) is None: etud.admission = Admission() etud.adresses.append(Adresse(typeadresse="domicile")) - db.session.flush() - + try: + db.session.flush() + except sqlalchemy.exc.IntegrityError as e: + db.session.rollback() + if "unique_dept_nip_except_null" in str(e): + raise ScoValueError( + "Code NIP déjà utilisé pour un autre étudiant" + ) from e + if "unique_dept_ine_except_null" in str(e): + raise ScoValueError( + "Code INE déjà utilisé pour un autre étudiant" + ) from e + raise event = ScolarEvent(etud=etud, event_type="CREATION") db.session.add(event) log(f"Identite.create {etud}") @@ -796,9 +809,12 @@ class Identite(models.ScoDocModel): ) -def check_etud_duplicate_code(args, code_name, edit=True, etudid: int | None = None): +def check_etud_duplicate_code( + args, code_name, edit=True, etudid: int | None = None, dest_url: str | None = "" +): """Vérifie que le code n'est pas dupliqué. Raises ScoGenError si problème. + Si dest_url === None, pas de lien continuer/annuler. """ etudid = etudid or args.get("etudid", None) if not args.get(code_name, None): @@ -837,11 +853,17 @@ def check_etud_duplicate_code(args, code_name, edit=True, etudid: int | None = N
Import terminé !
- - """ - ) return render_template( - "sco_page.j2", title="Import etudiants", content="\n".join(H) + "sco_page.j2", + title="Import etudiants", + content=f""" +Import terminé !
+A utiliser pour importer de nouveaux étudiants (typiquement au + premier semestre). +
+Si les étudiants à inscrire sont déjà dans un autre + semestre, utiliser le menu "Inscriptions (passage des étudiants) + depuis d'autres semestres à partir du semestre destination. +
+Si vous avez un portail Apogée, il est en général préférable d'importer les + étudiants depuis Apogée, via le menu "Synchroniser avec étape Apogée". +
++ L'opération se déroule en deux étapes. Dans un premier temps, + vous téléchargez une feuille Excel type. Vous devez remplir + cette feuille, une ligne décrivant chaque étudiant. Ensuite, + vous indiquez le nom de votre fichier dans la case "Fichier Excel" + ci-dessous, et cliquez sur "Télécharger" pour envoyer au serveur + votre liste. +
+ +{% if formsemestre %} +Les étudiants importés seront inscrits dans + le semestre {{formsemestre.html_link_status()|safe}} +
+{% else %} +Le fichier Excel décrivant les étudiants doit comporter les colonnes suivantes.
+Les colonnes peuvent être placées dans n'importe quel ordre, mais + le titre exact (tel que ci-dessous) doit être sur la première ligne. +
++ Les champs avec un astérisque (*) doivent être présents (vides non autorisés). +
+ +Attribut | +Type | +Description | +Requis | +
{{t[0]}} | +{{t[1]}} | +{{t[4]}} | +{{'*' if t[3] else ''}} | +
Attribut | Type | Description | |
%s | %s | %s | %s |