From afbb1fb0e22346cc342f1d3db6af6882213e692f Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Sun, 27 Nov 2022 19:07:42 +0100 Subject: [PATCH] formsemestre_recap_parcours_table: UE du parcours. Closes #524 --- app/but/jury_but.py | 4 +- app/but/jury_but_view.py | 23 +++++---- app/comp/res_compat.py | 9 ++-- app/scodoc/sco_formsemestre_validation.py | 57 ++++++++++++----------- 4 files changed, 50 insertions(+), 43 deletions(-) diff --git a/app/but/jury_but.py b/app/but/jury_but.py index 8dd2ef62..4a12e129 100644 --- a/app/but/jury_but.py +++ b/app/but/jury_but.py @@ -220,8 +220,8 @@ class DecisionsProposeesAnnee(DecisionsProposees): ) ) # Si on part d'un semestre IMPAIR, il n'y aura pas de décision année proposée - # (mais on pourra évidemment valmider des UE et même des RCUE) - self.jury_annuel: bool = formsemestre.semestre_id in (2, 3, 6) + # (mais on pourra évidemment valider des UE et même des RCUE) + self.jury_annuel: bool = formsemestre.semestre_id in (2, 4, 6) "vrai si jury de fin d'année scolaire (propose code annuel)" self.formsemestre_impair = formsemestre_impair diff --git a/app/but/jury_but_view.py b/app/but/jury_but_view.py index e7f1c2ae..45c472c3 100644 --- a/app/but/jury_but_view.py +++ b/app/but/jury_but_view.py @@ -62,20 +62,25 @@ def show_etud(deca: DecisionsProposeesAnnee, read_only: bool = True) -> str: H.append("""
Pas de décision annuelle (sem. impair)
""") H.append("""""") - annee_sco_pair = deca.formsemestre_pair.annee_scolaire() - avertissement_redoublement = ( - f"année {annee_sco_pair}-{annee_sco_pair+1}" - if annee_sco_pair != deca.annee_scolaire() - else "" - ) + if deca.formsemestre_pair is not None: + annee_sco_pair = deca.formsemestre_pair.annee_scolaire() + avertissement_redoublement = ( + f"année {annee_sco_pair}-{annee_sco_pair+1}" + if annee_sco_pair != deca.annee_scolaire() + else "" + ) + else: + avertissement_redoublement = "" H.append( f"""
Niveaux de compétences et unités d'enseignement
-
S{deca.formsemestre_impair.semestre_id}
-
S{deca.formsemestre_pair.semestre_id} +
S{deca.formsemestre_impair.semestre_id + if deca.formsemestre_impair else "-"}
+
S{deca.formsemestre_pair.semestre_id + if deca.formsemestre_pair else "-"} {avertissement_redoublement}
RCUE
""" @@ -385,7 +390,7 @@ def infos_fiche_etud_html(etudid: int) -> str: # temporaire quick & dirty: affiche le dernier try: deca = DecisionsProposeesAnnee(etud, formsemestres_but[-1]) - if len(deca.rcues_annee) > 0: + if True: # len(deca.rcues_annee) > 0: return f"""
{show_etud(deca, read_only=True)}
diff --git a/app/comp/res_compat.py b/app/comp/res_compat.py index fdf6aaad..1e4c80bc 100644 --- a/app/comp/res_compat.py +++ b/app/comp/res_compat.py @@ -25,7 +25,7 @@ class NotesTableCompat(ResultatsSemestre): """Implementation partielle de NotesTable Les méthodes définies dans cette classe sont là - pour conserver la compatibilité abvec les codes anciens et + pour conserver la compatibilité avec les codes anciens et il n'est pas recommandé de les utiliser dans de nouveaux développements (API malcommode et peu efficace). """ @@ -103,10 +103,9 @@ class NotesTableCompat(ResultatsSemestre): """Stats (moy/min/max) sur la moyenne générale""" return StatsMoyenne(self.etud_moy_gen) - def get_ues_stat_dict( - self, filter_sport=False, check_apc_ects=True - ) -> list[dict]: # was get_ues() - """Liste des UEs, ordonnée par numero. + def get_ues_stat_dict(self, filter_sport=False, check_apc_ects=True) -> list[dict]: + """Liste des UEs de toutes les UEs du semestre (tous parcours), + ordonnée par numero. Si filter_sport, retire les UE de type SPORT. Résultat: liste de dicts { champs UE U stats moyenne UE } """ diff --git a/app/scodoc/sco_formsemestre_validation.py b/app/scodoc/sco_formsemestre_validation.py index 183006e6..b94db987 100644 --- a/app/scodoc/sco_formsemestre_validation.py +++ b/app/scodoc/sco_formsemestre_validation.py @@ -608,45 +608,46 @@ def formsemestre_recap_parcours_table( if nt.is_apc: H.append('BUT') elif decision_sem: - H.append('%s' % decision_sem["code"]) + H.append( + f"""{ + decision_sem["code"]}""" + ) else: H.append("en cours") - H.append('%s' % ass) # abs + H.append(f"""{ass}""") # abs # acronymes UEs auxquelles l'étudiant est inscrit (ou capitalisé) - ues = nt.get_ues_stat_dict(filter_sport=True) + ues = list(nt.etud_ues(etudid)) cnx = ndb.GetDBConnexion() - etud_ue_status = { - ue["ue_id"]: nt.get_etud_ue_status(etudid, ue["ue_id"]) for ue in ues - } + etud_ue_status = {ue.id: nt.get_etud_ue_status(etudid, ue.id) for ue in ues} if not nt.is_apc: # formations classiques: filtre UE sur inscriptions (et garde UE capitalisées) ues = [ ue for ue in ues - if etud_est_inscrit_ue(cnx, etudid, sem["formsemestre_id"], ue["ue_id"]) - or etud_ue_status[ue["ue_id"]]["is_capitalized"] + if etud_est_inscrit_ue(cnx, etudid, sem["formsemestre_id"], ue.id) + or etud_ue_status[ue.id]["is_capitalized"] ] for ue in ues: - H.append('%s' % ue["acronyme"]) + H.append(f"""{ue.acronyme}""") if len(ues) < Se.nb_max_ue: - H.append('' % (Se.nb_max_ue - len(ues))) + H.append(f"""""") # indique le semestre compensé par celui ci: if decision_sem and decision_sem["compense_formsemestre_id"]: csem = sco_formsemestre.get_formsemestre( decision_sem["compense_formsemestre_id"] ) - H.append("compense S%s" % csem["semestre_id"]) + H.append(f"""compense S{csem["semestre_id"]}""") else: H.append("") if with_links: H.append("") H.append("") # 2eme ligne: notes - H.append('' % (class_sem, sem["formsemestre_id"])) + H.append(f"""""") H.append( - ' ' - % (bgcolor) + f""" """ ) if is_prev: default_sem_info = '[sem. précédent]' @@ -656,26 +657,26 @@ def formsemestre_recap_parcours_table( lockicon = scu.icontag("lock32_img", title="verrouillé", border="0") default_sem_info += lockicon if sem["formation_code"] != Se.formation.formation_code: - default_sem_info += "Autre formation: %s" % sem["formation_code"] + default_sem_info += f"""Autre formation: {sem["formation_code"]}""" H.append( '%s%s' % (sem["mois_fin"], sem_info.get(sem["formsemestre_id"], default_sem_info)) ) # Moy Gen (sous le code decision) H.append( - '%s' % scu.fmt_note(nt.get_etud_moy_gen(etudid)) + f"""{scu.fmt_note(nt.get_etud_moy_gen(etudid))}""" ) # Absences (nb d'abs non just. dans ce semestre) nbabs, nbabsjust = sco_abs.get_abs_count(etudid, sem) - H.append('%d' % (nbabs - nbabsjust)) + H.append(f"""{nbabs - nbabsjust}""") # UEs for ue in ues: - if decisions_ue and ue["ue_id"] in decisions_ue: - code = decisions_ue[ue["ue_id"]]["code"] + if decisions_ue and ue.id in decisions_ue: + code = decisions_ue[ue.id]["code"] else: code = "" - ue_status = etud_ue_status[ue["ue_id"]] + ue_status = etud_ue_status[ue.id] moy_ue = ue_status["moy"] if ue_status else "" explanation_ue = [] # list of strings if code == ADM: @@ -690,15 +691,16 @@ def formsemestre_recap_parcours_table( if ue_status and ue_status["is_capitalized"]: class_ue += " ue_capitalized" explanation_ue.append( - "Capitalisée le %s." % (ue_status["event_date"] or "?") + f"""Capitalisée le {ue_status["event_date"] or "?"}.""" ) H.append( - '%s' - % (class_ue, " ".join(explanation_ue), scu.fmt_note(moy_ue)) + f"""{scu.fmt_note(moy_ue)}""" ) if len(ues) < Se.nb_max_ue: - H.append('' % (Se.nb_max_ue - len(ues))) + H.append(f"""""") H.append("") if with_links: @@ -728,15 +730,16 @@ def formsemestre_recap_parcours_table( ) # ECTS validables dans chaque UE for ue in ues: - ue_status = nt.get_etud_ue_status(etudid, ue["ue_id"]) + ue_status = nt.get_etud_ue_status(etudid, ue.id) if ue_status: ects = ue_status["ects"] ects_pot = ue_status["ects_pot"] H.append( - f"""{ects:2.2g}""" + f"""{ects:2.2g}""" ) else: - H.append(f"""""") + H.append("""""") H.append("") H.append("")