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 # 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) # (mais on pourra évidemment valider des UE et même des RCUE)
self.jury_annuel: bool = formsemestre.semestre_id in (2, 3, 6) self.jury_annuel: bool = formsemestre.semestre_id in (2, 4, 6)
"vrai si jury de fin d'année scolaire (propose code annuel)" "vrai si jury de fin d'année scolaire (propose code annuel)"
self.formsemestre_impair = formsemestre_impair 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><em>Pas de décision annuelle (sem. impair)</em></div>""")
H.append("""</div>""") H.append("""</div>""")
annee_sco_pair = deca.formsemestre_pair.annee_scolaire() if deca.formsemestre_pair is not None:
avertissement_redoublement = ( annee_sco_pair = deca.formsemestre_pair.annee_scolaire()
f"année {annee_sco_pair}-{annee_sco_pair+1}" avertissement_redoublement = (
if annee_sco_pair != deca.annee_scolaire() f"année {annee_sco_pair}-{annee_sco_pair+1}"
else "" if annee_sco_pair != deca.annee_scolaire()
) else ""
)
else:
avertissement_redoublement = ""
H.append( H.append(
f""" f"""
<div class="titre_niveaux"><b>Niveaux de compétences et unités d'enseignement</b></div> <div class="titre_niveaux"><b>Niveaux de compétences et unités d'enseignement</b></div>
<div class="but_annee"> <div class="but_annee">
<div class="titre"></div> <div class="titre"></div>
<div class="titre">S{deca.formsemestre_impair.semestre_id}</div> <div class="titre">S{deca.formsemestre_impair.semestre_id
<div class="titre">S{deca.formsemestre_pair.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> <span class="avertissement_redoublement">{avertissement_redoublement}</span></div>
<div class="titre">RCUE</div> <div class="titre">RCUE</div>
""" """
@ -385,7 +390,7 @@ def infos_fiche_etud_html(etudid: int) -> str:
# temporaire quick & dirty: affiche le dernier # temporaire quick & dirty: affiche le dernier
try: try:
deca = DecisionsProposeesAnnee(etud, formsemestres_but[-1]) 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"> return f"""<div class="infos_but">
{show_etud(deca, read_only=True)} {show_etud(deca, read_only=True)}
</div> </div>

View File

@ -25,7 +25,7 @@ class NotesTableCompat(ResultatsSemestre):
"""Implementation partielle de NotesTable """Implementation partielle de NotesTable
Les méthodes définies dans cette classe sont 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 il n'est pas recommandé de les utiliser dans de nouveaux
développements (API malcommode et peu efficace). développements (API malcommode et peu efficace).
""" """
@ -103,10 +103,9 @@ class NotesTableCompat(ResultatsSemestre):
"""Stats (moy/min/max) sur la moyenne générale""" """Stats (moy/min/max) sur la moyenne générale"""
return StatsMoyenne(self.etud_moy_gen) return StatsMoyenne(self.etud_moy_gen)
def get_ues_stat_dict( def get_ues_stat_dict(self, filter_sport=False, check_apc_ects=True) -> list[dict]:
self, filter_sport=False, check_apc_ects=True """Liste des UEs de toutes les UEs du semestre (tous parcours),
) -> list[dict]: # was get_ues() ordonnée par numero.
"""Liste des UEs, ordonnée par numero.
Si filter_sport, retire les UE de type SPORT. Si filter_sport, retire les UE de type SPORT.
Résultat: liste de dicts { champs UE U stats moyenne UE } 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: if nt.is_apc:
H.append('<td class="rcp_but">BUT</td>') H.append('<td class="rcp_but">BUT</td>')
elif decision_sem: 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: else:
H.append("<td><em>en cours</em></td>") 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é) # 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() cnx = ndb.GetDBConnexion()
etud_ue_status = { etud_ue_status = {ue.id: nt.get_etud_ue_status(etudid, ue.id) for ue in ues}
ue["ue_id"]: nt.get_etud_ue_status(etudid, ue["ue_id"]) for ue in ues
}
if not nt.is_apc: if not nt.is_apc:
# formations classiques: filtre UE sur inscriptions (et garde UE capitalisées) # formations classiques: filtre UE sur inscriptions (et garde UE capitalisées)
ues = [ ues = [
ue ue
for ue in ues for ue in ues
if etud_est_inscrit_ue(cnx, etudid, sem["formsemestre_id"], ue["ue_id"]) if etud_est_inscrit_ue(cnx, etudid, sem["formsemestre_id"], ue.id)
or etud_ue_status[ue["ue_id"]]["is_capitalized"] or etud_ue_status[ue.id]["is_capitalized"]
] ]
for ue in ues: 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: 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: # indique le semestre compensé par celui ci:
if decision_sem and decision_sem["compense_formsemestre_id"]: if decision_sem and decision_sem["compense_formsemestre_id"]:
csem = sco_formsemestre.get_formsemestre( csem = sco_formsemestre.get_formsemestre(
decision_sem["compense_formsemestre_id"] 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: else:
H.append("<td></td>") H.append("<td></td>")
if with_links: if with_links:
H.append("<td></td>") H.append("<td></td>")
H.append("</tr>") H.append("</tr>")
# 2eme ligne: notes # 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( H.append(
'<td class="rcp_type_sem" style="background-color:%s;">&nbsp;</td>' f"""<td class="rcp_type_sem"
% (bgcolor) style="background-color:{bgcolor};">&nbsp;</td>"""
) )
if is_prev: if is_prev:
default_sem_info = '<span class="fontred">[sem. précédent]</span>' 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") lockicon = scu.icontag("lock32_img", title="verrouillé", border="0")
default_sem_info += lockicon default_sem_info += lockicon
if sem["formation_code"] != Se.formation.formation_code: 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( H.append(
'<td class="datefin">%s</td><td class="sem_info">%s</td>' '<td class="datefin">%s</td><td class="sem_info">%s</td>'
% (sem["mois_fin"], sem_info.get(sem["formsemestre_id"], default_sem_info)) % (sem["mois_fin"], sem_info.get(sem["formsemestre_id"], default_sem_info))
) )
# Moy Gen (sous le code decision) # Moy Gen (sous le code decision)
H.append( 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) # Absences (nb d'abs non just. dans ce semestre)
nbabs, nbabsjust = sco_abs.get_abs_count(etudid, sem) 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 # UEs
for ue in ues: for ue in ues:
if decisions_ue and ue["ue_id"] in decisions_ue: if decisions_ue and ue.id in decisions_ue:
code = decisions_ue[ue["ue_id"]]["code"] code = decisions_ue[ue.id]["code"]
else: else:
code = "" 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 "" moy_ue = ue_status["moy"] if ue_status else ""
explanation_ue = [] # list of strings explanation_ue = [] # list of strings
if code == ADM: if code == ADM:
@ -690,15 +691,16 @@ def formsemestre_recap_parcours_table(
if ue_status and ue_status["is_capitalized"]: if ue_status and ue_status["is_capitalized"]:
class_ue += " ue_capitalized" class_ue += " ue_capitalized"
explanation_ue.append( explanation_ue.append(
"Capitalisée le %s." % (ue_status["event_date"] or "?") f"""Capitalisée le {ue_status["event_date"] or "?"}."""
) )
H.append( H.append(
'<td class="%s" title="%s">%s</td>' f"""<td class="{class_ue}" title="{
% (class_ue, " ".join(explanation_ue), scu.fmt_note(moy_ue)) " ".join(explanation_ue)
}">{scu.fmt_note(moy_ue)}</td>"""
) )
if len(ues) < Se.nb_max_ue: 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>") H.append("<td></td>")
if with_links: if with_links:
@ -728,15 +730,16 @@ def formsemestre_recap_parcours_table(
) )
# ECTS validables dans chaque UE # ECTS validables dans chaque UE
for ue in ues: 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: if ue_status:
ects = ue_status["ects"] ects = ue_status["ects"]
ects_pot = ue_status["ects_pot"] ects_pot = ue_status["ects_pot"]
H.append( 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: else:
H.append(f"""<td class="ue"></td>""") H.append("""<td class="ue"></td>""")
H.append("<td></td></tr>") H.append("<td></td></tr>")
H.append("</table>") H.append("</table>")