Améliore détection étudiants

This commit is contained in:
Cléo Baras 2024-01-23 09:54:30 +01:00
parent 02976c9996
commit 8b3efe9dad
2 changed files with 46 additions and 23 deletions

View File

@ -85,6 +85,7 @@ class EtudiantsJuryPE:
""" """
"Les cosemestres donnant lieu à même année de diplome" "Les cosemestres donnant lieu à même année de diplome"
cosemestres = pe_tools.get_cosemestres_diplomants(annee_diplome, None) cosemestres = pe_tools.get_cosemestres_diplomants(annee_diplome, None)
self.cosemestres = cosemestres
pe_tools.pe_print( pe_tools.pe_print(
"1) Recherche des coSemestres -> %d trouvés" % len(cosemestres) "1) Recherche des coSemestres -> %d trouvés" % len(cosemestres)
) )
@ -121,7 +122,7 @@ class EtudiantsJuryPE:
self.diplomes_ids = self.get_etudiants(annee_diplome) self.diplomes_ids = self.get_etudiants(annee_diplome)
"""Les étudiants dont il faut calculer les moyennes""" """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""" """Les formsemestres (des étudiants) dont il faut calculer les moyennes"""
self.formsemestres_jury_ids = self.get_formsemestres_jury() self.formsemestres_jury_ids = self.get_formsemestres_jury()
@ -130,8 +131,9 @@ class EtudiantsJuryPE:
pe_tools.pe_print( pe_tools.pe_print(
f" => {len(self.diplomes_ids)} étudiants à diplômer en {annee_diplome}" 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" => {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( pe_tools.pe_print(
f" => quelques étudiants futurs diplômés : " f" => quelques étudiants futurs diplômés : "
+ ", ".join([str(etudid) for etudid in list(self.diplomes_ids)[:10]]) + ", ".join([str(etudid) for etudid in list(self.diplomes_ids)[:10]])
@ -155,15 +157,13 @@ class EtudiantsJuryPE:
etudids = [ etudids = [
etudid etudid
for etudid in self.cursus 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} etudiants = {etudid: self.identites[etudid] for etudid in etudids}
return etudiants 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 : """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é) * 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] = { self.cursus[etudid] = {
"etudid": etudid, # les infos sur l'étudiant "etudid": etudid, # les infos sur l'étudiant
"etat_civil": identite.etat_civil, # Ajout à la table jury "etat_civil": identite.etat_civil, # Ajout à la table jury
"nom": identite.nom,
"diplome": annee_diplome(identite), # Le date prévisionnelle de son diplôme "diplome": annee_diplome(identite), # Le date prévisionnelle de son diplôme
"formsemestres": semestres_etudiant, # les semestres de l'étudiant "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 ?""" """ Est-il réorienté / démissionnaire ou a-t-il arrêté volontairement sa formation ?"""
self.cursus[etudid]["abandon"] = arret_de_formation(identite, cosemestres) self.cursus[etudid]["abandon"] = arret_de_formation(identite, cosemestres)
def analyse_parcours_etudiant_dans_semestres(self, etudid): def analyse_parcours_etudiant_dans_semestres(self, etudid):
"""Structure les informations sur les semestres suivis par un """Structure les informations sur les semestres suivis par un
étudiant, pour identifier les semestres qui seront pris en compte lors de ses calculs é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"] semestres_etudiant = self.cursus[etudid]["formsemestres"]
self.aggregats[etudid] = {}
"""Tri des semestres par numéro de semestre""" """Tri des semestres par numéro de semestre"""
for nom_sem in pe_tools.TOUS_LES_SEMESTRES: for nom_sem in pe_tools.TOUS_LES_SEMESTRES:
i = int(nom_sem[1]) # le n° du semestre i = int(nom_sem[1]) # le n° du semestre
@ -233,10 +236,9 @@ class EtudiantsJuryPE:
self.aggregats[etudid][nom_sem] = semestres_i self.aggregats[etudid][nom_sem] = semestres_i
self.cursus[etudid][nom_sem] = get_dernier_semestre(semestres_i) self.cursus[etudid][nom_sem] = get_dernier_semestre(semestres_i)
"""Tri des semestres par aggrégat et par semestre terminal""" """Tri des semestres par aggrégat et par semestre terminal"""
for aggregat in pe_tools.TOUS_LES_AGGREGATS: 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)""" """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"] noms_semestre_de_aggregat = pe_tools.PARCOURS[aggregat]["aggregat"]
@ -250,7 +252,9 @@ class EtudiantsJuryPE:
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] 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 de n° inférieur (pax ex: des S1, S2, S3 pour un S3 terminal) et qui lui sont antérieurs"""
semestres_aggreges = {} semestres_aggreges = {}
@ -262,7 +266,11 @@ class EtudiantsJuryPE:
): ):
semestres_aggreges[fid] = semestre 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): 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' """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 nom_sem = semestres_recherches
semestres = {} semestres = {}
for etudid in self.etudiants_ids: for etudid in self.etudiants_ids:
semestres = semestres | self.cursus[etudid]["aggregats"][nom_sem] semestres = semestres | self.aggregats[etudid][nom_sem]
return semestres return semestres
else: else:
raise ValueError( raise ValueError(
@ -423,7 +431,6 @@ def annee_diplome(identite: Identite) -> int:
return None return None
def arret_de_formation(identite: Identite, cosemestres: list[FormSemestre]) -> bool: def arret_de_formation(identite: Identite, cosemestres: list[FormSemestre]) -> bool:
"""Détermine si un étudiant a arrêté sa formation. Il peut s'agir : """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 ? 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 pour le cas des étudiants à l'étranger
TODO:: A reprendre si BUT avec semestres décalés
""" """
etudid = identite.etudid 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""" """Son dernier semestre en date"""
dernier_formsemestre = identite.get_formsemestres()[0] dernier_formsemestre = identite.get_formsemestres()[0]
numero_dernier_formsemestre = dernier_formsemestre.semestre_id numero_dernier_formsemestre = dernier_formsemestre.semestre_id
"""Les numéro de semestres possible dans lesquels il pourrait s'incrire""" """Les numéro de semestres possible dans lesquels il pourrait s'incrire"""
if numero_dernier_formsemestre % 2 == 1: # semestre impair # semestre impair => passage de droit en semestre pair suivant (effet de l'annualisation)
numeros_possibles = list(range(numero_dernier_formsemestre+1, pe_tools.)) 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 ?""" """Y-a-t-il des cosemestres dans lesquels il aurait pu s'incrire ?"""
formsestres_superieurs_possibles = [] formsestres_superieurs_possibles = []
for fid, sem in cosemestres.items(): # Les semestres ayant des inscrits for fid, sem in cosemestres.items(): # Les semestres ayant des inscrits
if ( 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.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 ): # 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) 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]): 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)}. de semestres de la forme {fid: FormSemestre(fid)}.
La date prise en compte est celle marquant la **fin** des semestres. La date prise en compte est celle marquant la **fin** des semestres.

View File

@ -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 = { PARCOURS = {
"S1": { "S1": {
"aggregat": ["S1"], "aggregat": ["S1"],
@ -156,6 +162,7 @@ PARCOURS = {
"affichage_long": "BUT (tout semestre inclus)", "affichage_long": "BUT (tout semestre inclus)",
}, },
} }
NBRE_SEMESTRES_DIPLOMANT = 6
AGGREGAT_DIPLOMANT = ( AGGREGAT_DIPLOMANT = (
"6S" # aggrégat correspondant à la totalité des notes pour le diplôme "6S" # aggrégat correspondant à la totalité des notes pour le diplôme
) )