From 769f6c0ea08a966d5524dfd450d7535986075af2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9o=20BARAS=20=28IUT1=20Grenoble=29?= Date: Fri, 26 Jan 2024 09:42:41 +0100 Subject: [PATCH] Restreint les analyses aux semestres d'une formation APC (cf. bug lyonnais) --- app/pe/pe_etudiant.py | 65 ++++++++++++++++++++++++++++--------------- 1 file changed, 43 insertions(+), 22 deletions(-) diff --git a/app/pe/pe_etudiant.py b/app/pe/pe_etudiant.py index 9e79e8d6..87ed83d4 100644 --- a/app/pe/pe_etudiant.py +++ b/app/pe/pe_etudiant.py @@ -190,7 +190,7 @@ class EtudiantsJuryPE: """ identite = Identite.get_etud(etudid) - """Le cursus global de l'étudiant (restreint aux semestres APC)""" + # Le cursus global de l'étudiant (restreint aux semestres APC) formsemestres = identite.get_formsemestres() semestres_etudiant = { @@ -212,7 +212,7 @@ class EtudiantsJuryPE: "abandon": False, # va être traité en dessous } - """ Est-il réorienté / démissionnaire ou a-t-il arrêté volontairement sa formation ?""" + # Est-il réorienté / démissionnaire ou a-t-il arrêté volontairement sa formation ? self.cursus[etudid]["abandon"] = arret_de_formation(identite, cosemestres) def get_semestres_significatifs(self, etudid: int): @@ -409,8 +409,9 @@ def get_etudiants_dans_semestres(semestres: dict[int, FormSemestre]) -> set: def annee_diplome(identite: Identite) -> int: - """L'année de diplôme prévue d'un étudiant en fonction de ses semestres - d'inscription (pour un BUT). + """L'année de diplôme prévue d'un étudiant en fonction de ses semestres d'inscription (pour un BUT). + + Les semestres utilisés pour le calcul sont limités à ceux d'une formation apc. Args: identite: L'identité d'un étudiant @@ -418,23 +419,39 @@ def annee_diplome(identite: Identite) -> int: Returns: L'année prévue de sa diplômation """ - formsemestres = identite.get_formsemestres() + formsemestres_apc = get_semestres_apc(identite) - if formsemestres: - dates_possibles_diplome = [] - for sem_base in formsemestres: + if formsemestres_apc: + dates_possibles_diplome: int = [] + """Années de diplômation prédites en fonction des semestres (d'une formation APC) d'un étudiant""" + for sem_base in formsemestres_apc: annee = pe_comp.get_annee_diplome_semestre(sem_base) if annee: - dates_possibles_diplome(annee) + dates_possibles_diplome.append(annee) if dates_possibles_diplome: return max(dates_possibles_diplome) - else: - None - else: - return None + + return None -def arret_de_formation(identite: Identite, cosemestres: list[FormSemestre]) -> bool: +def get_semestres_apc(identite: Identite) -> list: + """Liste des semestres d'un étudiant qui corresponde à une formation APC. + + Args: + identite: L'identité d'un étudiant + + Returns: + Liste de ``FormSemestre`` correspondant à une formation APC + """ + semestres = identite.get_formsemestres() + semestres_apc = [] + for sem in semestres: + if sem.formation.is_apc(): + semestres_apc.append(sem) + return semestres_apc + + +def arret_de_formation(identite: Identite, cosemestres: dict[int, FormSemestre]) -> bool: """Détermine si un étudiant a arrêté sa formation. Il peut s'agir : * d'une réorientation à l'initiative du jury de semestre ou d'une démission (on pourrait @@ -472,20 +489,24 @@ def arret_de_formation(identite: Identite, cosemestres: list[FormSemestre]) -> b TODO:: A reprendre pour le cas des étudiants à l'étranger TODO:: A reprendre si BUT avec semestres décalés """ - etudid = identite.etudid - """Son dernier semestre en date""" - semestres = {sem.semestre_id: sem for sem in identite.get_formsemestres()} - dernier_formsemestre = get_dernier_semestre_en_date(semestres) + # Les semestres APC de l'étudiant + semestres = get_semestres_apc(identite) + semestres_apc = {sem.semestre_id: sem for sem in semestres} + if not semestres_apc: + return True + + # Son dernier semestre APC en date + dernier_formsemestre = get_dernier_semestre_en_date(semestres_apc) numero_dernier_formsemestre = dernier_formsemestre.semestre_id - """Les numéro de semestres possible dans lesquels il pourrait s'incrire""" - # semestre impair => passage de droit en semestre pair suivant (effet de l'annualisation) + # Les numéro de semestres possible dans lesquels il pourrait s'incrire + ## semestre impair => passage de droit en semestre pair suivant (effet de l'annualisation) if numero_dernier_formsemestre % 2 == 1: numeros_possibles = list( range(numero_dernier_formsemestre + 1, pe_comp.NBRE_SEMESTRES_DIPLOMANT) ) - # semestre pair => passage en année supérieure ou redoublement + ## semestre pair => passage en année supérieure ou redoublement else: # numeros_possibles = list( range( @@ -494,7 +515,7 @@ def arret_de_formation(identite: Identite, cosemestres: list[FormSemestre]) -> b ) ) - """Y-a-t-il des cosemestres dans lesquels il aurait pu s'incrire ?""" + # Y-a-t-il des cosemestres dans lesquels il aurait pu s'incrire ? formsestres_superieurs_possibles = [] for fid, sem in cosemestres.items(): # Les semestres ayant des inscrits if (