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