formsemestre_recap_parcours_table: UE du parcours. Closes #524

This commit is contained in:
Emmanuel Viennet 2022-11-27 19:07:42 +01:00
parent be3a7f900d
commit c29e9fc5bc
4 changed files with 50 additions and 43 deletions

View File

@ -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

View File

@ -62,20 +62,25 @@ def show_etud(deca: DecisionsProposeesAnnee, read_only: bool = True) -> str:
H.append("""<div><em>Pas de décision annuelle (sem. impair)</em></div>""")
H.append("""</div>""")
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"""
<div class="titre_niveaux"><b>Niveaux de compétences et unités d'enseignement</b></div>
<div class="but_annee">
<div class="titre"></div>
<div class="titre">S{deca.formsemestre_impair.semestre_id}</div>
<div class="titre">S{deca.formsemestre_pair.semestre_id}
<div class="titre">S{deca.formsemestre_impair.semestre_id
if deca.formsemestre_impair else "-"}</div>
<div class="titre">S{deca.formsemestre_pair.semestre_id
if deca.formsemestre_pair else "-"}
<span class="avertissement_redoublement">{avertissement_redoublement}</span></div>
<div class="titre">RCUE</div>
"""
@ -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"""<div class="infos_but">
{show_etud(deca, read_only=True)}
</div>

View File

@ -25,7 +25,7 @@ class NotesTableCompat(ResultatsSemestre):
"""Implementation partielle de NotesTable
Les méthodes définies dans cette classe sont
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 }
"""

View File

@ -608,45 +608,46 @@ def formsemestre_recap_parcours_table(
if nt.is_apc:
H.append('<td class="rcp_but">BUT</td>')
elif decision_sem:
H.append('<td class="rcp_dec">%s</td>' % decision_sem["code"])
H.append(
f"""<td class="rcp_dec">{
decision_sem["code"]}</td>"""
)
else:
H.append("<td><em>en cours</em></td>")
H.append('<td class="rcp_nonass">%s</td>' % ass) # abs
H.append(f"""<td class="rcp_nonass">{ass}</td>""") # 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('<td class="ue_acro"><span>%s</span></td>' % ue["acronyme"])
H.append(f"""<td class="ue_acro"><span>{ue.acronyme}</span></td>""")
if len(ues) < Se.nb_max_ue:
H.append('<td colspan="%d"></td>' % (Se.nb_max_ue - len(ues)))
H.append(f"""<td colspan="{Se.nb_max_ue - len(ues)}"></td>""")
# 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("<td><em>compense S%s</em></td>" % csem["semestre_id"])
H.append(f"""<td><em>compense S{csem["semestre_id"]}</em></td>""")
else:
H.append("<td></td>")
if with_links:
H.append("<td></td>")
H.append("</tr>")
# 2eme ligne: notes
H.append('<tr class="%s rcp_l2 sem_%s">' % (class_sem, sem["formsemestre_id"]))
H.append(f"""<tr class="{class_sem} rcp_l2 sem_{sem["formsemestre_id"]}">""")
H.append(
'<td class="rcp_type_sem" style="background-color:%s;">&nbsp;</td>'
% (bgcolor)
f"""<td class="rcp_type_sem"
style="background-color:{bgcolor};">&nbsp;</td>"""
)
if is_prev:
default_sem_info = '<span class="fontred">[sem. précédent]</span>'
@ -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(
'<td class="datefin">%s</td><td class="sem_info">%s</td>'
% (sem["mois_fin"], sem_info.get(sem["formsemestre_id"], default_sem_info))
)
# Moy Gen (sous le code decision)
H.append(
'<td class="rcp_moy">%s</td>' % scu.fmt_note(nt.get_etud_moy_gen(etudid))
f"""<td class="rcp_moy">{scu.fmt_note(nt.get_etud_moy_gen(etudid))}</td>"""
)
# Absences (nb d'abs non just. dans ce semestre)
nbabs, nbabsjust = sco_abs.get_abs_count(etudid, sem)
H.append('<td class="rcp_abs">%d</td>' % (nbabs - nbabsjust))
H.append(f"""<td class="rcp_abs">{nbabs - nbabsjust}</td>""")
# 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(
'<td class="%s" title="%s">%s</td>'
% (class_ue, " ".join(explanation_ue), scu.fmt_note(moy_ue))
f"""<td class="{class_ue}" title="{
" ".join(explanation_ue)
}">{scu.fmt_note(moy_ue)}</td>"""
)
if len(ues) < Se.nb_max_ue:
H.append('<td colspan="%d"></td>' % (Se.nb_max_ue - len(ues)))
H.append(f"""<td colspan="{Se.nb_max_ue - len(ues)}"></td>""")
H.append("<td></td>")
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"""<td class="ue" title="{ects:2.2g}/{ects_pot:2.2g} ECTS">{ects:2.2g}</td>"""
f"""<td class="ue"
title="{ects:2.2g}/{ects_pot:2.2g} ECTS">{ects:2.2g}</td>"""
)
else:
H.append(f"""<td class="ue"></td>""")
H.append("""<td class="ue"></td>""")
H.append("<td></td></tr>")
H.append("</table>")