forked from ScoDoc/ScoDoc
Update opolka/ScoDoc from ScoDoc/ScoDoc #2
@ -37,6 +37,7 @@ import pandas as pd
|
||||
import numpy as np
|
||||
|
||||
from app.models import Identite
|
||||
from app.pe import pe_affichage
|
||||
from app.pe.moys import pe_tabletags, pe_moy, pe_moytag, pe_sxtag
|
||||
from app.pe.rcss import pe_rcs
|
||||
import app.pe.pe_comp as pe_comp
|
||||
@ -82,6 +83,10 @@ class InterClassTag(pe_tabletags.TableTag):
|
||||
# Le type d'interclassement
|
||||
self.type = type_interclassement
|
||||
|
||||
pe_affichage.pe_print(
|
||||
f"--> Interclassement par 🗂️{type_interclassement} pour le RCS ⏯️{nom_rcs}"
|
||||
)
|
||||
|
||||
# Les informations sur les étudiants diplômés
|
||||
self.etuds: list[Identite] = list(etudiants_diplomes.values())
|
||||
"""Identités des étudiants diplômés"""
|
||||
@ -114,9 +119,13 @@ class InterClassTag(pe_tabletags.TableTag):
|
||||
# Les données sur les tags
|
||||
self.tags_sorted = self._do_taglist()
|
||||
"""Liste des tags (triés par ordre alphabétique)"""
|
||||
aff_tag = ["👜" + tag for tag in self.tags_sorted]
|
||||
pe_affichage.pe_print(f"--> Tags : {', '.join(aff_tag)}")
|
||||
|
||||
# Les données sur les UEs (si SxTag) ou compétences (si RCSTag)
|
||||
self.champs_sorted = self._do_ues_ou_competences_list()
|
||||
"""Les champs (UEs ou compétences) de l'interclassement"""
|
||||
self._aff_comp_ou_ues_debug()
|
||||
|
||||
# Construit la matrice de notes
|
||||
etudids_sorted = sorted(list(self.diplomes_ids))
|
||||
@ -127,10 +136,16 @@ class InterClassTag(pe_tabletags.TableTag):
|
||||
# Synthétise les moyennes/classements par tag
|
||||
self.moyennes_tags: dict[str, pe_moytag.MoyennesTag] = {}
|
||||
for tag in self.tags_sorted:
|
||||
pe_affichage.pe_print(f"--> Moyenne 👜{tag} : ")
|
||||
|
||||
notes = self.compute_notes_matrice(tag, etudids_sorted, self.champs_sorted)
|
||||
|
||||
coeffs = self.compute_coeffs_matrice(
|
||||
tag, etudids_sorted, self.champs_sorted
|
||||
)
|
||||
|
||||
self.__aff_profil_coeffs(coeffs)
|
||||
|
||||
self.moyennes_tags[tag] = pe_moytag.MoyennesTag(
|
||||
tag,
|
||||
self.type,
|
||||
@ -142,6 +157,29 @@ class InterClassTag(pe_tabletags.TableTag):
|
||||
"""Une représentation textuelle"""
|
||||
return f"{self.nom_rcs} par {self.type}"
|
||||
|
||||
def __aff_profil_coeffs(self, matrice_coeffs_moy_gen):
|
||||
"""Extrait de la matrice des coeffs, les différents types d'inscription
|
||||
et de coefficients (appelés profil) des étudiants et les affiche
|
||||
(pour debug)
|
||||
"""
|
||||
|
||||
# Les profils des coeffs d'UE (pour debug)
|
||||
profils = []
|
||||
for i in matrice_coeffs_moy_gen.index:
|
||||
val = matrice_coeffs_moy_gen.loc[i].fillna("-")
|
||||
val = " | ".join([str(v) for v in val])
|
||||
if val not in profils:
|
||||
profils += [val]
|
||||
|
||||
# L'affichage
|
||||
if len(profils) > 1:
|
||||
profils_aff = "\n" + "\n".join([" " * 10 + prof for prof in profils])
|
||||
else:
|
||||
profils_aff = "\n".join(profils)
|
||||
pe_affichage.pe_print(
|
||||
f" > Moyenne calculée avec pour coeffs (de compétences) : {profils_aff}"
|
||||
)
|
||||
|
||||
def _do_taglist(self):
|
||||
"""Synthétise les tags à partir des TableTags (SXTag ou RCSTag)
|
||||
|
||||
@ -241,6 +279,21 @@ class InterClassTag(pe_tabletags.TableTag):
|
||||
dict_champs.extend(champs)
|
||||
return sorted(set(dict_champs))
|
||||
|
||||
def _aff_comp_ou_ues_debug(self):
|
||||
"""Affichage pour debug"""
|
||||
aff_comp = []
|
||||
|
||||
for comp in self.champs_sorted:
|
||||
liste = []
|
||||
if self.type == pe_moytag.CODE_MOY_UE:
|
||||
liste += ["📍" + comp]
|
||||
else:
|
||||
liste += ["💡" + comp]
|
||||
if self.type == pe_moytag.CODE_MOY_UE:
|
||||
pe_affichage.pe_print(f"--> UEs : {', '.join(aff_comp)}")
|
||||
else:
|
||||
pe_affichage.pe_print(f"--> Compétences : {', '.join(aff_comp)}")
|
||||
|
||||
def has_tags(self):
|
||||
"""Indique si l'interclassement a des tags (cas d'un
|
||||
interclassement sur un S5 qui n'a pas eu lieu)
|
||||
|
@ -222,7 +222,7 @@ class SxTag(pe_tabletags.TableTag):
|
||||
# L'affichage
|
||||
ues = ", ".join(self.acronymes_sorted)
|
||||
pe_affichage.pe_print(
|
||||
f" > MoyTag 👜{tag} pour UES: {ues} avec pour coeffs : {profils_aff}"
|
||||
f" > MoyTag 👜{tag} pour UEs : {ues} avec pour coeffs : {profils_aff}"
|
||||
)
|
||||
|
||||
def has_notes(self, tag):
|
||||
|
@ -9,7 +9,7 @@
|
||||
from flask import g
|
||||
from app import log
|
||||
|
||||
PE_DEBUG = True
|
||||
PE_DEBUG = False
|
||||
|
||||
|
||||
# On stocke les logs PE dans g.scodoc_pe_log
|
||||
|
@ -203,8 +203,8 @@ class JuryPE(object):
|
||||
"""
|
||||
pe_affichage.pe_print(
|
||||
"***************************************************************************\n"
|
||||
"*** Génère les trajectoires (≠tes combinaisons de semestres) des étudiants"
|
||||
"***************************************************************************\n"
|
||||
"*** Génère les trajectoires (≠tes combinaisons de semestres) des étudiants\n"
|
||||
"***************************************************************************"
|
||||
)
|
||||
|
||||
self.rcss_jury.cree_trajectoires(self.etudiants)
|
||||
@ -228,8 +228,8 @@ class JuryPE(object):
|
||||
# Génère les moyennes des RCS de type Sx
|
||||
pe_affichage.pe_print(
|
||||
"***************************************************************************\n"
|
||||
"*** Calcule les moyennes des SxTag (moyennes d'un RCS de type Sx)"
|
||||
"***************************************************************************\n"
|
||||
"*** Calcule les moyennes des SxTag (moyennes d'un RCS de type Sx)\n"
|
||||
"***************************************************************************"
|
||||
)
|
||||
|
||||
# Les SxTag (moyenne de Sx par UE)
|
||||
@ -305,11 +305,13 @@ class JuryPE(object):
|
||||
"""****************************************************"""
|
||||
)
|
||||
|
||||
pe_affichage.pe_print("1) Calcul des moyennes des RCSTag")
|
||||
self.rcss_tags = {}
|
||||
for rcs_id, rcsemx in self.rcss_jury.rcsemxs.items():
|
||||
self.rcss_tags[rcs_id] = pe_rcstag.RCSTag(rcsemx, self.sxtags)
|
||||
|
||||
# Intègre le bilan des trajectoires tagguées au zip final
|
||||
pe_affichage.pe_print("2) Bilan")
|
||||
output = io.BytesIO()
|
||||
with pd.ExcelWriter( # pylint: disable=abstract-class-instantiated
|
||||
output, engine="openpyxl"
|
||||
@ -321,10 +323,10 @@ class JuryPE(object):
|
||||
df = rcs_tag.to_df()
|
||||
# Conversion colonnes en multiindex
|
||||
df = convert_colonnes_to_multiindex(df)
|
||||
onglets += [onglet]
|
||||
onglets += ["📊" + onglet]
|
||||
# écriture dans l'onglet
|
||||
df.to_excel(writer, onglet, index=True, header=True)
|
||||
pe_affichage.pe_print(f"=> Export excel de {', '.join(onglets)}")
|
||||
pe_affichage.pe_print(f"--> Export excel de {', '.join(onglets)}")
|
||||
output.seek(0)
|
||||
|
||||
if onglets:
|
||||
@ -342,7 +344,9 @@ class JuryPE(object):
|
||||
et ceux par compétences (sur les RCSTag).
|
||||
"""
|
||||
pe_affichage.pe_print(
|
||||
"*** Génère les interclassements sur chaque type de RCS/agrgégat"
|
||||
"""******************************************************************\n"""
|
||||
"""*** Génère les interclassements sur chaque type de RCS/agrgégat\n"""
|
||||
"""******************************************************************"""
|
||||
)
|
||||
self.interclasstags = {
|
||||
pe_moytag.CODE_MOY_UE: {},
|
||||
@ -353,9 +357,6 @@ class JuryPE(object):
|
||||
|
||||
# Les interclassements par UE
|
||||
for Sx in pe_rcs.TOUS_LES_SEMESTRES:
|
||||
pe_affichage.pe_print(
|
||||
f"--> Interclassement par (acronyme d')UEs pour le RCS {Sx}"
|
||||
)
|
||||
interclass = pe_interclasstag.InterClassTag(
|
||||
Sx,
|
||||
pe_moytag.CODE_MOY_UE,
|
||||
@ -368,9 +369,6 @@ class JuryPE(object):
|
||||
|
||||
# Les interclassements par compétences
|
||||
for nom_rcs in pe_rcs.TOUS_LES_RCS:
|
||||
pe_affichage.pe_print(
|
||||
f"--> Interclassement par compétences pour le RCS {nom_rcs}"
|
||||
)
|
||||
interclass = pe_interclasstag.InterClassTag(
|
||||
nom_rcs,
|
||||
pe_moytag.CODE_MOY_COMPETENCES,
|
||||
|
Loading…
Reference in New Issue
Block a user