From 474f3347554b95e4c2d2d84d67b7024f427e8269 Mon Sep 17 00:00:00 2001
From: Emmanuel Viennet <emmanuel.viennet@gmail.com>
Date: Mon, 21 Mar 2022 19:41:14 +0100
Subject: [PATCH] Calcul des rangs / modules en formations classiques

---
 app/comp/res_classic.py | 19 ++++++++++++++++++-
 app/comp/res_common.py  |  3 ++-
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/app/comp/res_classic.py b/app/comp/res_classic.py
index 91614935d..b8f8ade02 100644
--- a/app/comp/res_classic.py
+++ b/app/comp/res_classic.py
@@ -15,7 +15,7 @@ from flask import g, url_for
 
 from app import db
 from app import log
-from app.comp import moy_mat, moy_mod, moy_ue, inscr_mod
+from app.comp import moy_mat, moy_mod, moy_sem, moy_ue, inscr_mod
 from app.comp.res_common import NotesTableCompat
 from app.comp.bonus_spo import BonusSport
 from app.models import ScoDocSiteConfig
@@ -35,6 +35,7 @@ class ResultatsSemestreClassic(NotesTableCompat):
         "modimpl_coefs",
         "modimpl_idx",
         "sem_matrix",
+        "mod_rangs",
     )
 
     def __init__(self, formsemestre):
@@ -142,6 +143,22 @@ class ResultatsSemestreClassic(NotesTableCompat):
         if sco_preferences.get_preference("bul_show_matieres", self.formsemestre.id):
             self.compute_moyennes_matieres()
 
+    def compute_rangs(self):
+        """Calcul des rangs (classements) dans le semestre (moy. gen.), les UE
+        et les modules.
+        """
+        # rangs moy gen et UEs sont calculées par la méthode commune à toutes les formations:
+        super().compute_rangs()
+        # les rangs des modules n'existent que dans les formations classiques:
+        self.mod_rangs = {}
+        for modimpl_result in self.modimpls_results.values():
+            # ne prend que les rangs sous forme de chaines:
+            rangs = moy_sem.comp_ranks_series(modimpl_result.etuds_moy_module)[0]
+            self.mod_rangs[modimpl_result.moduleimpl_id] = (
+                rangs,
+                modimpl_result.nb_inscrits_module,
+            )
+
     def get_etud_mod_moy(self, moduleimpl_id: int, etudid: int) -> float:
         """La moyenne de l'étudiant dans le moduleimpl
         Result: valeur float (peut être NaN) ou chaîne "NI" (non inscrit ou DEM)
diff --git a/app/comp/res_common.py b/app/comp/res_common.py
index fa2b9c30b..977d195d8 100644
--- a/app/comp/res_common.py
+++ b/app/comp/res_common.py
@@ -66,7 +66,7 @@ class ResultatsSemestre(ResultatsCache):
         """Moyennes de matières, si calculées. { matiere_id : Series, index etudid }"""
 
     def __repr__(self):
-        return f"<{self.__class__.__name__}(id={self.id}, formsemestre='{self.formsemestre}')>"
+        return f"<{self.__class__.__name__}(formsemestre='{self.formsemestre}')>"
 
     def compute(self):
         "Charge les notes et inscriptions et calcule toutes les moyennes"
@@ -369,6 +369,7 @@ class NotesTableCompat(ResultatsSemestre):
         self.bonus_ues = None  # virtuel
         self.ue_rangs = {u.id: (None, nb_etuds) for u in self.ues}
         self.mod_rangs = None  # sera surchargé en Classic, mais pas en APC
+        """{ modimpl_id : (rangs, effectif) }"""
         self.moy_min = "NA"
         self.moy_max = "NA"
         self.moy_moy = "NA"