diff --git a/app/pe/pe_etudiant.py b/app/pe/pe_etudiant.py index 29d5f597..81c3e7ef 100644 --- a/app/pe/pe_etudiant.py +++ b/app/pe/pe_etudiant.py @@ -85,6 +85,7 @@ class EtudiantsJuryPE: """ "Les cosemestres donnant lieu à même année de diplome" cosemestres = pe_tools.get_cosemestres_diplomants(annee_diplome, None) + self.cosemestres = cosemestres pe_tools.pe_print( "1) Recherche des coSemestres -> %d trouvés" % len(cosemestres) ) @@ -121,7 +122,7 @@ class EtudiantsJuryPE: self.diplomes_ids = self.get_etudiants(annee_diplome) """Les étudiants dont il faut calculer les moyennes""" - self.etudiants_ids = {etudid for etudid in self.cursus} + self.etudiants_ids = {etudid for etudid in self.identites} """Les formsemestres (des étudiants) dont il faut calculer les moyennes""" self.formsemestres_jury_ids = self.get_formsemestres_jury() @@ -130,8 +131,9 @@ class EtudiantsJuryPE: pe_tools.pe_print( f" => {len(self.diplomes_ids)} étudiants à diplômer en {annee_diplome}" ) - nbre_abandons = len(self.etudiants_ids) - len(self.etudiants_ids) + nbre_abandons = len(self.etudiants_ids) - len(self.diplomes_ids) pe_tools.pe_print(f" => {nbre_abandons} étudiants éliminer pour abandon") + pe_tools.pe_print(f" => {len(self.formsemestres_jury_ids)} semestres dont il faut calculer la moyenne") pe_tools.pe_print( f" => quelques étudiants futurs diplômés : " + ", ".join([str(etudid) for etudid in list(self.diplomes_ids)[:10]]) @@ -155,15 +157,13 @@ class EtudiantsJuryPE: etudids = [ etudid for etudid in self.cursus - if self.cursus[etudid]["diplome"] == annee_diplome and self.cursus[etudid]["abandon"] + if self.cursus[etudid]["diplome"] == annee_diplome + and self.cursus[etudid]["abandon"] == False ] etudiants = {etudid: self.identites[etudid] for etudid in etudids} return etudiants - - def analyse_etat_etudiant( - self, etudid: int, cosemestres: dict[int, FormSemestre] - ): + def analyse_etat_etudiant(self, etudid: int, cosemestres: dict[int, FormSemestre]): """Analyse le cursus d'un étudiant pouvant être : * l'un de ceux sur lesquels le jury va statuer (année de diplômation du jury considéré) @@ -194,14 +194,15 @@ class EtudiantsJuryPE: self.cursus[etudid] = { "etudid": etudid, # les infos sur l'étudiant "etat_civil": identite.etat_civil, # Ajout à la table jury + "nom": identite.nom, "diplome": annee_diplome(identite), # Le date prévisionnelle de son diplôme "formsemestres": semestres_etudiant, # les semestres de l'étudiant + "abandon": False, # va être traité en dessous } """ 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 analyse_parcours_etudiant_dans_semestres(self, etudid): """Structure les informations sur les semestres suivis par un étudiant, pour identifier les semestres qui seront pris en compte lors de ses calculs @@ -222,6 +223,8 @@ class EtudiantsJuryPE: """ semestres_etudiant = self.cursus[etudid]["formsemestres"] + self.aggregats[etudid] = {} + """Tri des semestres par numéro de semestre""" for nom_sem in pe_tools.TOUS_LES_SEMESTRES: i = int(nom_sem[1]) # le n° du semestre @@ -233,10 +236,9 @@ class EtudiantsJuryPE: self.aggregats[etudid][nom_sem] = semestres_i self.cursus[etudid][nom_sem] = get_dernier_semestre(semestres_i) - """Tri des semestres par aggrégat et par semestre terminal""" for aggregat in pe_tools.TOUS_LES_AGGREGATS: - self.aggregat[etudid][aggregat] = {} + self.aggregats[etudid][aggregat] = {} """L'aggrégat considéré (par ex: 3S), son nom de son semestre terminal (par ex: S3) et son numéro (par ex: 3)""" noms_semestre_de_aggregat = pe_tools.PARCOURS[aggregat]["aggregat"] @@ -247,10 +249,12 @@ class EtudiantsJuryPE: dernier_formsemestre_terminal = self.cursus[etudid][nom_semestre_terminal] # for formsem_id_term in formsemestres_terminal: - if dernier_formsemestre_terminal: # ne considérant que le dernier + if dernier_formsemestre_terminal: # ne considérant que le dernier formsem_id_term = list(dernier_formsemestre_terminal.keys())[0] - formsemestre_terminal = self.cursus[etudid]["formsemestres"][formsem_id_term] + formsemestre_terminal = self.cursus[etudid]["formsemestres"][ + formsem_id_term + ] """Semestres de n° inférieur (pax ex: des S1, S2, S3 pour un S3 terminal) et qui lui sont antérieurs""" semestres_aggreges = {} @@ -262,7 +266,11 @@ class EtudiantsJuryPE: ): semestres_aggreges[fid] = semestre - self.aggregat[etudid][aggregat][formsem_id_term] = semestres_aggreges + self.aggregats[etudid][aggregat][formsem_id_term] = semestres_aggreges + + """Vérifications""" + dernier_semestre_aggregat = get_dernier_semestre(semestres_aggreges) + assert dernier_semestre_aggregat == dernier_formsemestre_terminal def get_formsemestres_terminaux_aggregat(self, aggregat: str): """Pour un aggrégat donné, ensemble des formsemestres terminaux possibles pour l'aggrégat (pour l'aggrégat '3S' @@ -365,7 +373,7 @@ class EtudiantsJuryPE: nom_sem = semestres_recherches semestres = {} for etudid in self.etudiants_ids: - semestres = semestres | self.cursus[etudid]["aggregats"][nom_sem] + semestres = semestres | self.aggregats[etudid][nom_sem] return semestres else: raise ValueError( @@ -423,7 +431,6 @@ def annee_diplome(identite: Identite) -> int: return None - def arret_de_formation(identite: Identite, cosemestres: list[FormSemestre]) -> bool: """Détermine si un étudiant a arrêté sa formation. Il peut s'agir : @@ -460,27 +467,36 @@ def arret_de_formation(identite: Identite, cosemestres: list[FormSemestre]) -> b Est-il réorienté, démissionnaire ou a-t-il arrêté de son propre chef sa formation ? TODO:: A reprendre pour le cas des étudiants à l'étranger + TODO:: A reprendre si BUT avec semestres décalés """ etudid = identite.etudid - reponse = False - etud = sco_etud.get_etud_info(etudid=etudid, filled=True)[0] - (code, parcours) = sco_report.get_code_cursus_etud(etud) """Son dernier semestre en date""" dernier_formsemestre = identite.get_formsemestres()[0] numero_dernier_formsemestre = dernier_formsemestre.semestre_id """Les numéro de semestres possible dans lesquels il pourrait s'incrire""" - if numero_dernier_formsemestre % 2 == 1: # semestre impair - numeros_possibles = list(range(numero_dernier_formsemestre+1, pe_tools.)) + # 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_tools.NBRE_SEMESTRES_DIPLOMANT) + ) + # semestre pair => passage en année supérieure ou redoublement + else: # + numeros_possibles = list( + range( + max(numero_dernier_formsemestre - 1, 1), + pe_tools.NBRE_SEMESTRES_DIPLOMANT, + ) + ) """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 ( - sem.formsemestre_id != dernier_formsemestre.formsemestre_id + fid != dernier_formsemestre.formsemestre_id + and sem.semestre_id in numeros_possibles and sem.date_debut.year >= dernier_formsemestre.date_debut.year - and sem.semestre_id > dernier_formsemestre.semestre_id ): # date de debut des semestres possibles postérieur au dernier semestre de l'étudiant et de niveau plus élevé que le dernier semestre valide de l'étudiant formsestres_superieurs_possibles.append(fid) @@ -491,7 +507,7 @@ def arret_de_formation(identite: Identite, cosemestres: list[FormSemestre]) -> b def get_dernier_semestre(semestres: dict[int, FormSemestre]): - """Renvoie le dernier semestre en date d'un dictionnaire + """Renvoie le dernier semestre en date (de fin) d'un dictionnaire de semestres de la forme {fid: FormSemestre(fid)}. La date prise en compte est celle marquant la **fin** des semestres. diff --git a/app/pe/pe_tools.py b/app/pe/pe_tools.py index b34ec3be..dba1c00f 100644 --- a/app/pe/pe_tools.py +++ b/app/pe/pe_tools.py @@ -76,6 +76,12 @@ PE_LOCAL_FOOTER_TMPL = REP_LOCAL_AVIS + "local/modeles/un_footer.tex" # ---------------------------------------------------------------------------------------- +""" +Descriptif d'un parcours classique BUT + +TODO:: A améliorer si BUT en moins de 6 semestres +""" + PARCOURS = { "S1": { "aggregat": ["S1"], @@ -156,6 +162,7 @@ PARCOURS = { "affichage_long": "BUT (tout semestre inclus)", }, } +NBRE_SEMESTRES_DIPLOMANT = 6 AGGREGAT_DIPLOMANT = ( "6S" # aggrégat correspondant à la totalité des notes pour le diplôme )