forked from ScoDoc/ScoDoc
Améliore détection étudiants
This commit is contained in:
parent
02976c9996
commit
8b3efe9dad
@ -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"]
|
||||
@ -250,7 +252,9 @@ class EtudiantsJuryPE:
|
||||
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.
|
||||
|
||||
|
@ -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
|
||||
)
|
||||
|
Loading…
Reference in New Issue
Block a user