rangs dans les UEs

This commit is contained in:
Emmanuel Viennet 2022-02-06 18:29:22 +01:00
parent e6bd6cf28a
commit 39fa7f2487
6 changed files with 31 additions and 11 deletions

View File

@ -77,11 +77,14 @@ class BulletinBUT(ResultatsSemestreBUT):
"saes": self.etud_ue_mod_results(etud, ue, self.saes), "saes": self.etud_ue_mod_results(etud, ue, self.saes),
} }
if ue.type != UE_SPORT: if ue.type != UE_SPORT:
rangs, effectif = self.ue_rangs[ue.id]
d["moyenne"] = { d["moyenne"] = {
"value": fmt_note(self.etud_moy_ue[ue.id][etud.id]), "value": fmt_note(self.etud_moy_ue[ue.id][etud.id]),
"min": fmt_note(self.etud_moy_ue[ue.id].min()), "min": fmt_note(self.etud_moy_ue[ue.id].min()),
"max": fmt_note(self.etud_moy_ue[ue.id].max()), "max": fmt_note(self.etud_moy_ue[ue.id].max()),
"moy": fmt_note(self.etud_moy_ue[ue.id].mean()), "moy": fmt_note(self.etud_moy_ue[ue.id].mean()),
"rang": rangs[etud.id],
"total": effectif, # nb etud avec note dans cette UE
} }
else: else:
# ceci suppose que l'on a une seule UE bonus, # ceci suppose que l'on a une seule UE bonus,

View File

@ -98,7 +98,8 @@ class ResultatsSemestreBUT(NotesTableCompat):
self.etud_moy_gen = moy_sem.compute_sem_moys_apc( self.etud_moy_gen = moy_sem.compute_sem_moys_apc(
self.etud_moy_ue, self.modimpl_coefs_df self.etud_moy_ue, self.modimpl_coefs_df
) )
self.etud_moy_gen_ranks = moy_sem.comp_ranks_series(self.etud_moy_gen) # --- Classements:
self.compute_rangs()
def get_etud_mod_moy(self, moduleimpl_id: int, etudid: int) -> float: def get_etud_mod_moy(self, moduleimpl_id: int, etudid: int) -> float:
"""La moyenne de l'étudiant dans le moduleimpl """La moyenne de l'étudiant dans le moduleimpl

View File

@ -9,7 +9,7 @@
import numpy as np import numpy as np
import pandas as pd import pandas as pd
from app.comp import moy_mod, moy_ue, moy_sem, inscr_mod from app.comp import moy_mod, moy_ue, inscr_mod
from app.comp.res_common import NotesTableCompat from app.comp.res_common import NotesTableCompat
from app.comp.bonus_spo import BonusSport from app.comp.bonus_spo import BonusSport
from app.models import ScoDocSiteConfig from app.models import ScoDocSiteConfig
@ -105,7 +105,7 @@ class ResultatsSemestreClassic(NotesTableCompat):
bonus_mg # compat nt, utilisé pour l'afficher sur les bulletins bonus_mg # compat nt, utilisé pour l'afficher sur les bulletins
) )
# --- Classements: # --- Classements:
self.etud_moy_gen_ranks = moy_sem.comp_ranks_series(self.etud_moy_gen) self.compute_rangs()
def get_etud_mod_moy(self, moduleimpl_id: int, etudid: int) -> float: def get_etud_mod_moy(self, moduleimpl_id: int, etudid: int) -> float:
"""La moyenne de l'étudiant dans le moduleimpl """La moyenne de l'étudiant dans le moduleimpl

View File

@ -9,6 +9,7 @@ from functools import cached_property
import numpy as np import numpy as np
import pandas as pd import pandas as pd
from app.comp.aux_stats import StatsMoyenne from app.comp.aux_stats import StatsMoyenne
from app.comp import moy_sem
from app.comp.res_cache import ResultatsCache from app.comp.res_cache import ResultatsCache
from app.comp import res_sem from app.comp import res_sem
from app.comp.moy_mod import ModuleImplResults from app.comp.moy_mod import ModuleImplResults
@ -169,6 +170,8 @@ class NotesTableCompat(ResultatsSemestre):
"bonus", "bonus",
"bonus_ues", "bonus_ues",
"malus", "malus",
"etud_moy_gen_ranks",
"ue_rangs",
) )
def __init__(self, formsemestre: FormSemestre): def __init__(self, formsemestre: FormSemestre):
@ -250,6 +253,20 @@ class NotesTableCompat(ResultatsSemestre):
modimpls_dict.append(d) modimpls_dict.append(d)
return modimpls_dict return modimpls_dict
def compute_rangs(self):
"""Calcule les classements
Moyenne générale: etud_moy_gen_ranks
Par UE:
"""
self.etud_moy_gen_ranks = moy_sem.comp_ranks_series(self.etud_moy_gen)
for ue in self.formsemestre.query_ues():
moy_ue = self.etud_moy_ue[ue.id]
self.ue_rangs[ue.id] = (
moy_sem.comp_ranks_series(moy_ue),
int(moy_ue.count()),
)
# .count() -> nb of non NaN values
def get_etud_decision_ues(self, etudid: int) -> dict: def get_etud_decision_ues(self, etudid: int) -> dict:
"""Decisions du jury pour les UE de cet etudiant, ou None s'il n'y en pas eu. """Decisions du jury pour les UE de cet etudiant, ou None s'il n'y en pas eu.
Ne tient pas compte des UE capitalisées. Ne tient pas compte des UE capitalisées.

View File

@ -53,6 +53,7 @@ from reportlab.lib import styles
import flask import flask
from flask import url_for, g, request from flask import url_for, g, request
from app.models.ues import UniteEns
import app.scodoc.sco_utils as scu import app.scodoc.sco_utils as scu
import app.scodoc.notesdb as ndb import app.scodoc.notesdb as ndb
@ -145,16 +146,14 @@ def _comp_ects_by_ue_code(nt, decision_ues):
decision_ues est le resultat de nt.get_etud_decision_ues decision_ues est le resultat de nt.get_etud_decision_ues
Chaque resultat est un dict: { ue_code : ects } Chaque resultat est un dict: { ue_code : ects }
""" """
raise NotImplementedError() # XXX #sco92
# ré-écrire en utilisant
if not decision_ues: if not decision_ues:
return {} return {}
ects_by_ue_code = {} ects_by_ue_code = {}
for ue_id in decision_ues: for ue_id in decision_ues:
d = decision_ues[ue_id] d = decision_ues[ue_id]
ue = nt.uedict[ue_id] ue = UniteEns.query.get(ue_id)
ects_by_ue_code[ue["ue_code"]] = d["ects"] ects_by_ue_code[ue.ue_code] = d["ects"]
return ects_by_ue_code return ects_by_ue_code

View File

@ -645,12 +645,12 @@ def make_formsemestre_recapcomplet(
): # Rang: force tri numerique pour sortable ): # Rang: force tri numerique pour sortable
cls = cls + " sortnumeric" cls = cls + " sortnumeric"
if F[0][i] in cod2mod: # lien vers etat module if F[0][i] in cod2mod: # lien vers etat module
mod = cod2mod[F[0][i]] modimpl = cod2mod[F[0][i]]
cells += '<td class="%s"><a href="moduleimpl_status?moduleimpl_id=%s" title="%s (%s)">%s</a></td>' % ( cells += '<td class="%s"><a href="moduleimpl_status?moduleimpl_id=%s" title="%s (%s)">%s</a></td>' % (
cls, cls,
mod["moduleimpl_id"], modimpl.id,
mod["module"]["titre"], modimpl.module.titre,
sco_users.user_info(mod["responsable_id"])["nomcomplet"], sco_users.user_info(modimpl.responsable_id)["nomcomplet"],
F[0][i], F[0][i],
) )
else: else: