126 lines
6.2 KiB
Python
126 lines
6.2 KiB
Python
from app.pe import pe_tagtable
|
|
from app.pe.pe_tools import PE_DEBUG, pe_print
|
|
|
|
|
|
class SetTagInterClasse(pe_tagtable.TableTag):
|
|
"""Récupère les moyennes de SetTag aggrégeant un même parcours (par ex un ['S1', 'S2']
|
|
n'ayant pas fini au même S2
|
|
pour fournir un interclassement sur un groupe d'étudiant => seul compte alors la promo
|
|
nom_combinaison = 'S1' ou '1A'
|
|
"""
|
|
|
|
# -------------------------------------------------------------------------------------------------------------------
|
|
def __init__(self, nom_combinaison, diplome):
|
|
pe_tagtable.TableTag.__init__(self, nom=f"{nom_combinaison}_{diplome or ''}")
|
|
self.combinaison = nom_combinaison
|
|
self.parcoursDict = {}
|
|
|
|
# -------------------------------------------------------------------------------------------
|
|
def set_Etudiants(self, etudiants, juryPEDict, etudInfoDict, nom_sem_final=None):
|
|
"""Détermine la liste des étudiants à prendre en compte, en partant de
|
|
la liste fournie en paramètre et en vérifiant que l'étudiant dispose bien d'un parcours valide pour la combinaison demandée.
|
|
Renvoie le nombre d'étudiants effectivement inscrits."""
|
|
if nom_sem_final:
|
|
self.nom += "_" + nom_sem_final
|
|
for etudid in etudiants:
|
|
if juryPEDict[etudid][self.combinaison] != None:
|
|
self.inscrlist.append(etudInfoDict[etudid])
|
|
self.identdict[etudid] = etudInfoDict[etudid]
|
|
self.parcoursDict[etudid] = juryPEDict[etudid]
|
|
return len(self.inscrlist)
|
|
|
|
# -------------------------------------------------------------------------------------------
|
|
def get_Fids_in_settag(self):
|
|
"""Renvoie la liste des semestres (les formsemestre_id finissant la combinaison par ex. '3S' dont les fid des S3) à prendre en compte
|
|
pour les moyennes, en considérant tous les étudiants inscrits"""
|
|
return list(
|
|
{self.parcoursDict[etudid][self.combinaison] for etudid in self.identdict}
|
|
)
|
|
|
|
# ---------------------------------------------------------------------------------------------
|
|
def set_SetTagDict(self, SetTagDict):
|
|
"""Mémorise les settag nécessaires au jury."""
|
|
self.SetTagDict = {
|
|
fid: SetTagDict[fid] for fid in self.get_Fids_in_settag() if fid != None
|
|
}
|
|
if PE_DEBUG >= 1:
|
|
pe_print(" => %d semestres utilisés" % len(self.SetTagDict))
|
|
|
|
# -------------------------------------------------------------------------------------------------------------------
|
|
def comp_data_settag(self):
|
|
"""Calcule tous les données numériques relatives au settag"""
|
|
# Attributs relatifs aux tag pour les modules pris en compte
|
|
self.taglist = self.do_taglist()
|
|
|
|
# if PE_DEBUG >= 1: pe_print(" => Tags = " + ", ".join( self.taglist ))
|
|
|
|
# Calcul des moyennes de chaque étudiant par tag
|
|
reussiteAjoutTag = {"OK": [], "KO": []}
|
|
for tag in self.taglist:
|
|
moyennes = self.get_MoyennesSetTag(tag, force=False)
|
|
res = self.add_moyennesTag(tag, moyennes) # pas de notes => pas de moyenne
|
|
reussiteAjoutTag["OK" if res else "KO"].append(tag)
|
|
if len(reussiteAjoutTag["OK"]) > 0 and PE_DEBUG:
|
|
pe_print(
|
|
" => Interclassement de %d tags : " % (len(reussiteAjoutTag["OK"]))
|
|
+ ", ".join(reussiteAjoutTag["OK"])
|
|
)
|
|
if len(reussiteAjoutTag["KO"]) > 0 and PE_DEBUG:
|
|
pe_print(
|
|
" => %d tags manquants : " % (len(reussiteAjoutTag["KO"]))
|
|
+ ", ".join(reussiteAjoutTag["KO"])
|
|
)
|
|
|
|
# -------------------------------------------------------------------------------------------------------------------
|
|
def get_etudids(self):
|
|
return list(self.identdict.keys())
|
|
|
|
# -------------------------------------------------------------------------------------------------------------------
|
|
def do_taglist(self):
|
|
"""Parcourt les tags des semestres taggués et les synthétise sous la forme
|
|
d'une liste en supprimant les doublons
|
|
"""
|
|
ensemble = []
|
|
for settag in self.SetTagDict.values():
|
|
ensemble.extend(settag.get_all_tags())
|
|
return sorted(list(set(ensemble)))
|
|
|
|
# -------------------------------------------------------------------------------------------------------------------
|
|
def get_NotesEtCoeffsSetTagEtudiant(self, tag, etudid):
|
|
"""Récupère tous les notes et les coeffs d'un étudiant relatives à un tag dans ses semestres valides et les renvoie dans un tuple (notes, coeffs)
|
|
avec notes et coeffs deux listes"""
|
|
leSetTagDeLetudiant = self.parcoursDict[etudid][self.combinaison]
|
|
|
|
note = self.SetTagDict[leSetTagDeLetudiant].get_moy_from_resultats(tag, etudid)
|
|
coeff = self.SetTagDict[leSetTagDeLetudiant].get_coeff_from_resultats(
|
|
tag, etudid
|
|
)
|
|
return (note, coeff)
|
|
|
|
# -------------------------------------------------------------------------------------------------------------------
|
|
def get_MoyennesSetTag(self, tag, force=False):
|
|
"""Renvoie les "moyennes" des étudiants à un tag donné, en prenant en compte tous les settag de l'aggrégat,
|
|
et leur coeff Par moyenne, s'entend une note moyenne, la somme des coefficients de pondération
|
|
appliqué dans cette moyenne.
|
|
|
|
Force ou non le calcul de la moyenne lorsque des notes sont manquantes.
|
|
|
|
Renvoie les informations sous la forme d'une liste [etudid: (moy, somme_coeff_normalisée, rang), ...}
|
|
"""
|
|
# if tag not in self.get_all_tags() : return None
|
|
|
|
# Calcule les moyennes
|
|
lesMoyennes = []
|
|
for (
|
|
etudid
|
|
) in (
|
|
self.get_etudids()
|
|
): # Pour tous les étudiants non défaillants du semestre inscrits dans des modules relatifs au tag
|
|
(moyenne, somme_coeffs) = self.get_NotesEtCoeffsSetTagEtudiant(
|
|
tag, etudid
|
|
) # lecture des notes associées au tag
|
|
lesMoyennes += [
|
|
(moyenne, somme_coeffs, etudid)
|
|
] # Un tuple (pour classement résumant les données)
|
|
return lesMoyennes
|