From 386471a47f35ab49901535a8ebea7a6dc5140981 Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Thu, 24 Nov 2022 00:11:59 +0100 Subject: [PATCH] =?UTF-8?q?WIP:=20jury=20BUT:=20prise=20en=20compte=20des?= =?UTF-8?q?=20UE=20capitalis=C3=A9es=20dans=20les=20RCUEs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/but/jury_but.py | 97 +++++++++++++---------- app/but/jury_but_recap.py | 10 +-- app/but/jury_but_view.py | 35 ++++++--- app/comp/res_common.py | 2 +- app/models/but_validations.py | 141 ++++++++++++++++------------------ app/models/formsemestre.py | 2 +- app/scodoc/sco_prepajury.py | 6 +- app/static/css/jury_but.css | 1 + app/static/css/scodoc.css | 40 +++++++++- app/views/notes.py | 2 +- 10 files changed, 201 insertions(+), 135 deletions(-) diff --git a/app/but/jury_but.py b/app/but/jury_but.py index a94a5c36f..5a8a53002 100644 --- a/app/but/jury_but.py +++ b/app/but/jury_but.py @@ -383,43 +383,47 @@ class DecisionsProposeesAnnee(DecisionsProposees): # def infos(self) -> str: - "informations, for debugging purpose" - return f"""DecisionsProposeesAnnee + """informations, for debugging purpose.""" + text = f"""DecisionsProposeesAnnee """ + for formsemestre, title in ( + (self.formsemestre_impair, "formsemestre_impair"), + (self.formsemestre_pair, "formsemestre_pair"), + ): + text += f"
  • {title}:" + if formsemestre is not None: + text += f""" + {html.escape(str(formsemestre))} + + """ + else: + text += " aucun." + text += "
  • " + + text += f""" +
  • RCUEs: {html.escape(str(self.rcues_annee))}
  • +
  • nb_competences: {getattr(self, "nb_competences", "-")}
  • +
  • nb_validables: {getattr(self, "nb_validables", "-")}
  • +
  • codes: {self.codes}
  • +
  • explanation: {self.explanation}
  • + + """ + 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 90ee14be4..d9dbd92a9 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 ba1a8d0ea..2db54ab8b 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"""