diff --git a/app/scodoc/sco_apogee_csv.py b/app/scodoc/sco_apogee_csv.py
index c56f497f0..f2dba69c9 100644
--- a/app/scodoc/sco_apogee_csv.py
+++ b/app/scodoc/sco_apogee_csv.py
@@ -221,7 +221,8 @@ class ApoEtud(dict):
except KeyError as exc:
raise ScoFormatError(
f"""Fichier Apogee invalide : ligne mal formatée ?
colonne {
- col_id} non déclarée ?"""
+ col_id} non déclarée ?""",
+ safe=True,
) from exc
else:
try:
@@ -326,9 +327,14 @@ class ApoEtud(dict):
self.log.append("export étape désactivé")
return VOID_APO_RES
+ # Element passage
+ res_passage = self.search_elt_passage(code, res)
+ if res_passage:
+ return res_passage
+
# Elements UE
res_ue = self.search_elt_ue(code, res)
- if res_ue != {}:
+ if res_ue:
return res_ue
# Elements Modules
@@ -403,6 +409,25 @@ class ApoEtud(dict):
return VOID_APO_RES
return {} # no UE result found for this code
+ def search_elt_passage(self, code: str, res: NotesTableCompat) -> dict:
+ """Cherche un résultat de type "passage" pour ce code Apogée.
+ dict vide si pas de résultat trouvé pour ce code.
+ L'élement est rempli si:
+ - code est dans les codes passage du formsemestre (sem)
+ - autorisation d'inscription enregistre de sem vers sem d'indice suivant
+ """
+ if res.formsemestre.semestre_id < 1:
+ return {}
+ next_semestre_id = res.formsemestre.semestre_id + 1
+ if code in res.formsemestre.get_codes_apogee(category="passage"):
+ if next_semestre_id in res.get_autorisations_inscription().get(
+ self.etud.id, set()
+ ):
+ return dict(
+ N="", B=20, J="", R=ScoDocSiteConfig.get_code_apo("ADM"), M=""
+ )
+ return {}
+
def comp_elt_semestre(self, nt: NotesTableCompat, decision: dict, etudid: int):
"""Calcul résultat apo semestre.
Toujours vide pour en BUT/APC.
@@ -703,7 +728,8 @@ class ApoData:
filename = self.orig_filename or e.filename
raise ScoFormatError(
f"""
{e.args[0]}
""" +{e.args[0]}
""", + safe=True, ) from e self.etape_apogee = self.get_etape_apogee() # 'V1RT' self.vdi_apogee = self.get_vdi_apogee() # '111' @@ -795,7 +821,9 @@ class ApoData: self.sems_periode = None def get_etape_apogee(self) -> str: - """Le code etape: 'V1RT', donné par le code de l'élément VET""" + """Le code etape: 'V1RT', donné par le code de l'élément VET. + Le VET doit être parmi les colonnes de la section XX-APO_COLONNES-XX + """ for elt in self.apo_csv.apo_elts.values(): if elt.type_objet == "VET": return elt.code @@ -860,7 +888,8 @@ class ApoData: log(f"Colonnes presentes: {present}") raise ScoFormatError( f"""Fichier Apogee invalide{msg}
@@ -112,6 +112,7 @@ class ScoPDFFormatError(ScoValueError): """, dest_url=dest_url, + safe=safe, ) @@ -130,33 +131,33 @@ class ScoConfigurationError(ScoValueError): class ScoLockedFormError(ScoValueError): "Modification d'une formation verrouillée" - def __init__(self, msg="", dest_url=None): + def __init__(self, msg="", dest_url=None, safe=False): msg = ( "Cette formation est verrouillée (car il y a un semestre verrouillé qui s'y réfère). " + str(msg) ) - super().__init__(msg=msg, dest_url=dest_url) + super().__init__(msg=msg, dest_url=dest_url, safe=safe) class ScoLockedSemError(ScoValueError): "Modification d'un formsemestre verrouillé" - def __init__(self, msg="", dest_url=None): + def __init__(self, msg="", dest_url=None, safe=False): msg = "Ce semestre est verrouillé ! " + str(msg) - super().__init__(msg=msg, dest_url=dest_url) + super().__init__(msg=msg, dest_url=dest_url, safe=safe) class ScoNonEmptyFormationObject(ScoValueError): """On ne peut pas supprimer un module/matiere ou UE si des formsemestre s'y réfèrent""" - def __init__(self, type_objet="objet'", msg="", dest_url=None): + def __init__(self, type_objet="objet'", msg="", dest_url=None, safe=False): msg = f"""Il faut d'abord supprimer le semestre (ou en retirer ce {type_objet}). Mais il est peut-être préférable de laisser ce programme intact et d'en créer une nouvelle version pour la modifier sans affecter les semestres déjà en place.
""" - super().__init__(msg=msg, dest_url=dest_url) + super().__init__(msg=msg, dest_url=dest_url, safe=safe) class ScoInvalidIdType(ScoValueError):