From 02bccb58aaab96173f0f18e77e6eec43f823eb69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9o=20BARAS=20=28IUT1=20Grenoble=29?= Date: Fri, 26 Jan 2024 07:13:09 +0100 Subject: [PATCH 1/4] =?UTF-8?q?Am=C3=A9liore=20le=20calcul=20de=20l'ann?= =?UTF-8?q?=C3=A9e=20de=20dipl=C3=B4me=20d'un=20=C3=A9tudiant?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/pe/pe_etudiant.py | 15 ++++++++++----- app/pe/pe_jury.py | 7 ++++++- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/app/pe/pe_etudiant.py b/app/pe/pe_etudiant.py index 126f112f1..9e79e8d60 100644 --- a/app/pe/pe_etudiant.py +++ b/app/pe/pe_etudiant.py @@ -417,14 +417,19 @@ def annee_diplome(identite: Identite) -> int: Returns: L'année prévue de sa diplômation - - NOTE: Pourrait être déplacé dans app.models.etudiants.Identite """ formsemestres = identite.get_formsemestres() + if formsemestres: - return max( - [pe_comp.get_annee_diplome_semestre(sem_base) for sem_base in formsemestres] - ) + dates_possibles_diplome = [] + for sem_base in formsemestres: + annee = pe_comp.get_annee_diplome_semestre(sem_base) + if annee: + dates_possibles_diplome(annee) + if dates_possibles_diplome: + return max(dates_possibles_diplome) + else: + None else: return None diff --git a/app/pe/pe_jury.py b/app/pe/pe_jury.py index 790b10f82..6873a5be1 100644 --- a/app/pe/pe_jury.py +++ b/app/pe/pe_jury.py @@ -266,13 +266,18 @@ class JuryPE(object): cursus = self.etudiants.cursus[etudid] formsemestres = cursus["formsemestres"] + if cursus["diplome"]: + diplome = cursus["diplome"] + else: + diplome = "indéterminé" + administratif[etudid] = { "Nom": etudiant.nom, "Prenom": etudiant.prenom, "Civilite": etudiant.civilite_str, "Age": pe_comp.calcul_age(etudiant.date_naissance), "Date d'entree": cursus["entree"], - "Date de diplome": cursus["diplome"], + "Date de diplome": diplome, "Nbre de semestres": len(formsemestres), } 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 2/4] 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 9e79e8d60..87ed83d41 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 ( From 1b18034adbbb2b20a7d9cde9cd59f63a2467508d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9o=20BARAS=20=28IUT1=20Grenoble=29?= Date: Fri, 26 Jan 2024 15:26:11 +0100 Subject: [PATCH 3/4] Coquille --- app/pe/pe_etudiant.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/pe/pe_etudiant.py b/app/pe/pe_etudiant.py index f44ed8fa9..605f85cbb 100644 --- a/app/pe/pe_etudiant.py +++ b/app/pe/pe_etudiant.py @@ -420,7 +420,7 @@ def get_annee_diplome(etud: Identite) -> int: Returns: L'année prévue de sa diplômation """ - formsemestres_apc = get_semestres_apc(identite) + formsemestres_apc = get_semestres_apc(etud) if formsemestres_apc: dates_possibles_diplome = [] From f87902d1acba9cee0e2d57c1ea64aca35a417734 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9o=20BARAS=20=28IUT1=20Grenoble=29?= Date: Fri, 26 Jan 2024 16:54:50 +0100 Subject: [PATCH 4/4] =?UTF-8?q?Corrige=20la=20boucle=20en=20erreur=20pour?= =?UTF-8?q?=20le=20calcul=20des=20moyennes=20d'aggr=C3=A9gat?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/pe/pe_jury.py | 6 ++---- app/pe/pe_trajectoire.py | 25 ++++++++++++++++++++----- app/pe/pe_trajectoiretag.py | 16 +++++++--------- 3 files changed, 29 insertions(+), 18 deletions(-) diff --git a/app/pe/pe_jury.py b/app/pe/pe_jury.py index ec87bf7ee..3d5f116c8 100644 --- a/app/pe/pe_jury.py +++ b/app/pe/pe_jury.py @@ -455,10 +455,8 @@ def compute_trajectoires_tag( pe_comp.pe_print(f" --> Fusion {nom}") - """Création de la trajectoire_tagguee associée""" - trajectoire_tagguee = TrajectoireTag( - nom, trajectoire, semestres_taggues, etudiants - ) + trajectoire_tagguee = TrajectoireTag(nom, trajectoire, semestres_taggues) + """Trajectoire_tagguee associée""" """Mémorise le résultat""" trajectoires_tagguees[trajectoire_id] = trajectoire_tagguee diff --git a/app/pe/pe_trajectoire.py b/app/pe/pe_trajectoire.py index d527de3cd..d4fa6c9d6 100644 --- a/app/pe/pe_trajectoire.py +++ b/app/pe/pe_trajectoire.py @@ -1,4 +1,4 @@ -import app.pe.pe_comp as pe_tools +import app.pe.pe_comp as pe_comp from app.models import FormSemestre from app.pe.pe_etudiant import EtudiantsJuryPE, get_dernier_semestre_en_date @@ -83,16 +83,16 @@ class TrajectoiresJuryPE: analysés + les mémorise dans les données de l'étudiant """ - for nom_aggregat in pe_tools.TOUS_LES_SEMESTRES + pe_tools.TOUS_LES_AGGREGATS: + for nom_aggregat in pe_comp.TOUS_LES_SEMESTRES + pe_comp.TOUS_LES_AGGREGATS: """L'aggrégat considéré (par ex: 3S=S1+S2+S3), son nom de son semestre terminal (par ex: S3) et son numéro (par ex: 3)""" - noms_semestre_de_aggregat = pe_tools.PARCOURS[nom_aggregat]["aggregat"] + noms_semestre_de_aggregat = pe_comp.PARCOURS[nom_aggregat]["aggregat"] nom_semestre_terminal = noms_semestre_de_aggregat[-1] for etudid in etudiants.cursus: if etudid not in self.suivi: self.suivi[etudid] = {aggregat: None - for aggregat in pe_tools.TOUS_LES_SEMESTRES + pe_tools.TOUS_LES_AGGREGATS} + for aggregat in pe_comp.TOUS_LES_SEMESTRES + pe_comp.TOUS_LES_AGGREGATS} """Le formsemestre terminal (dernier en date) associé au semestre marquant la fin de l'aggrégat @@ -124,6 +124,21 @@ class TrajectoiresJuryPE: # assert dernier_semestre_aggregat == formsemestre_terminal +def get_trajectoires_etudid(trajectoires, etudid): + """Fonction pour débuggage: renvoie la liste des trajectoires_id des + trajectoires suivies par un étudiant + """ + if etudid not in trajectoires.suivi: + pe_comp.pe_print(f"{etudid} fait-il bien partie du jury ?") + + liste = [] + for aggregat in pe_comp.TOUS_LES_PARCOURS: + trajet = trajectoires.suivi[etudid][aggregat] + if trajet: + liste.append(trajet.trajectoire_id) + return liste + + def get_semestres_a_aggreger(self, aggregat: str, formsemestre_id_terminal: int): """Pour un nom d'aggrégat donné (par ex: 'S3') et un semestre terminal cible identifié par son formsemestre_id (par ex: 'S3 2022-2023'), @@ -138,7 +153,7 @@ def get_semestres_a_aggreger(self, aggregat: str, formsemestre_id_terminal: int) formsemestre_id_terminal: L'identifiant du formsemestre terminal de l'aggrégat, devant correspondre au dernier semestre de l'aggrégat """ - noms_semestres_aggreges = pe_tools.PARCOURS[aggregat]["aggregat"] + noms_semestres_aggreges = pe_comp.PARCOURS[aggregat]["aggregat"] formsemestres = {} for etudid in self.cursus: diff --git a/app/pe/pe_trajectoiretag.py b/app/pe/pe_trajectoiretag.py index 71b665dca..07b742ca1 100644 --- a/app/pe/pe_trajectoiretag.py +++ b/app/pe/pe_trajectoiretag.py @@ -64,8 +64,7 @@ class TrajectoireTag(TableTag): self, nom: str, trajectoire: Trajectoire, - semestres_taggues: dict[int, SemestreTag], - donnees_etudiants: EtudiantsJuryPE, + semestres_taggues: dict[int, SemestreTag] ): """ """ TableTag.__init__(self, nom=nom) @@ -80,14 +79,13 @@ class TrajectoireTag(TableTag): self.semestres_aggreges = trajectoire.semestres_aggreges + self.semestres_tags_aggreges = {} """Les semestres tags associés aux semestres aggrégés""" - try: - self.semestres_tags_aggreges = { - frmsem_id: semestres_taggues[frmsem_id] - for frmsem_id in semestres_taggues - } - except: - raise ValueError("Semestres taggués manquants") + for frmsem_id in self.semestres_aggreges: + try: + self.semestres_tags_aggreges[frmsem_id] = semestres_taggues[frmsem_id] + except: + raise ValueError("Semestres taggués manquants") """Les étudiants (état civil + cursus connu)""" self.etuds = nt.etuds