"""
+ for formsemestre, title in (
+ (self.formsemestre_impair, "formsemestre_impair"),
+ (self.formsemestre_pair, "formsemestre_pair"),
+ ):
+ text += f"
+
+ """
+ return text
def annee_scolaire(self) -> int:
"L'année de début de l'année scolaire"
@@ -434,14 +438,19 @@ class DecisionsProposeesAnnee(DecisionsProposees):
def comp_formsemestres(
self, formsemestre: FormSemestre
) -> tuple[FormSemestre, FormSemestre]:
- """les deux formsemestres de l'année scolaire à laquelle appartient formsemestre."""
+ """Les deux formsemestres du niveau auquel appartient formsemestre.
+ Complète le niveau avec le formsemestre antérieur le plus récent.
+ L'"autre" formsemestre peut ainsi appartenir à l'année scolaire
+ antérieure (redoublants).
+ -> S_impair, S_pair
+ """
if not formsemestre.formation.is_apc(): # garde fou
return None, None
if formsemestre.semestre_id % 2 == 0:
other_semestre_id = formsemestre.semestre_id - 1
else:
other_semestre_id = formsemestre.semestre_id + 1
- annee_scolaire = formsemestre.annee_scolaire()
+
other_formsemestre = None
for inscr in self.etud.formsemestre_inscriptions:
if (
@@ -452,8 +461,13 @@ class DecisionsProposeesAnnee(DecisionsProposees):
)
# L'autre semestre
and (inscr.formsemestre.semestre_id == other_semestre_id)
- # de la même année scolaire:
- and (inscr.formsemestre.annee_scolaire() == annee_scolaire)
+ # Antérieur
+ and inscr.formsemestre.date_debut < formsemestre.date_debut
+ # Et plus le récent possible
+ and (
+ (other_formsemestre is None)
+ or (other_formsemestre.date_debut < inscr.formsemestre.date_debut)
+ )
):
other_formsemestre = inscr.formsemestre
if formsemestre.semestre_id % 2 == 0:
@@ -512,9 +526,9 @@ class DecisionsProposeesAnnee(DecisionsProposees):
rcue = RegroupementCoherentUE(
self.etud,
self.formsemestre_impair,
- ue_impair,
+ self.decisions_ues[ue_impair.id],
self.formsemestre_pair,
- ue_pair,
+ self.decisions_ues[ue_pair.id],
self.inscription_etat,
)
ues_impair_sans_rcue.discard(ue_impair.id)
@@ -976,18 +990,23 @@ class DecisionsProposeesUE(DecisionsProposees):
self.codes = [
sco_codes.DEM if inscription_etat == scu.DEMISSION else sco_codes.DEF
]
- self.moy_ue = np.NaN
+ self.moy_ue = self.moy_ue_with_cap = np.NaN
+ self.ue_status = {}
return
# Moyenne de l'UE ?
res: ResultatsSemestreBUT = res_sem.load_formsemestre_results(formsemestre)
+ # Safety checks:
if not ue.id in res.etud_moy_ue:
self.explanation = "UE sans résultat"
return
if not etud.id in res.etud_moy_ue[ue.id]:
self.explanation = "Étudiant sans résultat dans cette UE"
return
- self.moy_ue = res.etud_moy_ue[ue.id][etud.id]
+ ue_status = res.get_etud_ue_status(etud.id, ue.id)
+ self.moy_ue = ue_status["cur_moy_ue"]
+ self.moy_ue_with_cap = ue_status["moy"]
+ self.ue_status = ue_status
def set_rcue(self, rcue: RegroupementCoherentUE):
"""Rattache cette UE à un RCUE. Cela peut modifier les codes
diff --git a/app/but/jury_but_recap.py b/app/but/jury_but_recap.py
index 90ee14be4d..d9dbd92a9c 100644
--- a/app/but/jury_but_recap.py
+++ b/app/but/jury_but_recap.py
@@ -58,15 +58,15 @@ def formsemestre_saisie_jury_but(
# DecisionsProposeesAnnee(etud, formsemestre2)
# Pour le 1er etud, faire un check_ues_ready_jury(self) -> page d'erreur
# -> rcue .ue_1, .ue_2 -> stroe moy ues, rcue.moy_rcue, etc
- if formsemestre2.semestre_id % 2 != 0:
- raise ScoValueError("Cette page ne fonctionne que sur les semestres pairs")
+ # XXX if formsemestre2.semestre_id % 2 != 0:
+ # raise ScoValueError("Cette page ne fonctionne que sur les semestres pairs")
if formsemestre2.formation.referentiel_competence is None:
raise ScoValueError(
"""
Pas de référentiel de compétences associé à la formation !
-
Pour associer un référentiel, passer par le menu Semestre /
- Voir la formation... et suivre le lien "associer à un référentiel
+
Pour associer un référentiel, passer par le menu Semestre /
+ Voir la formation... et suivre le lien "associer à un référentiel
de compétences"
"""
)
@@ -262,7 +262,7 @@ class RowCollector:
# --- Codes (seront cachés, mais exportés en excel)
self.add_cell("etudid", "etudid", etud.id, "codes")
self.add_cell("code_nip", "code_nip", etud.code_nip or "", "codes")
- # --- Identité étudiant (adapté de res_comon/get_table_recap, à factoriser XXX TODO)
+ # --- Identité étudiant (adapté de res_common/get_table_recap, à factoriser XXX TODO)
self.add_cell("civilite_str", "Civ.", etud.civilite_str, "identite_detail")
self.add_cell("nom_disp", "Nom", etud.nom_disp(), "identite_detail")
self["_nom_disp_order"] = etud.sort_key
diff --git a/app/but/jury_but_view.py b/app/but/jury_but_view.py
index ba1a8d0ead..2db54ab8bb 100644
--- a/app/but/jury_but_view.py
+++ b/app/but/jury_but_view.py
@@ -82,8 +82,6 @@ def show_etud(deca: DecisionsProposeesAnnee, read_only: bool = True) -> str:
H.append(
_gen_but_niveau_ue(
dec_rcue.rcue.ue_1,
- deca.decisions_ues[dec_rcue.rcue.ue_1.id].moy_ue,
- # dec_rcue.rcue.moy_ue_1,
deca.decisions_ues[dec_rcue.rcue.ue_1.id],
disabled=read_only,
)
@@ -92,8 +90,6 @@ def show_etud(deca: DecisionsProposeesAnnee, read_only: bool = True) -> str:
H.append(
_gen_but_niveau_ue(
dec_rcue.rcue.ue_2,
- deca.decisions_ues[dec_rcue.rcue.ue_2.id].moy_ue,
- # dec_rcue.rcue.moy_ue_2,
deca.decisions_ues[dec_rcue.rcue.ue_2.id],
disabled=read_only,
)
@@ -134,7 +130,7 @@ def _gen_but_select(
for code in codes
]
)
- return f"""