From 68dec8e1f8c076c3785d548302362ca6f9fc95a8 Mon Sep 17 00:00:00 2001 From: Emmanuel Viennet Date: Sun, 9 Jan 2022 10:11:50 +0100 Subject: [PATCH] =?UTF-8?q?Fix:=20anciens=20bulletins=20XML=20du=20BUT=20d?= =?UTF-8?q?es=20d=C3=A9missionnaires?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/but/bulletin_but_xml_compat.py | 219 +++++++++++++++-------------- 1 file changed, 112 insertions(+), 107 deletions(-) diff --git a/app/but/bulletin_but_xml_compat.py b/app/but/bulletin_but_xml_compat.py index 5b4a14ca05..ee42e44415 100644 --- a/app/but/bulletin_but_xml_compat.py +++ b/app/but/bulletin_but_xml_compat.py @@ -68,11 +68,12 @@ def bulletin_but_xml_compat( "bulletin_but_xml_compat( formsemestre_id=%s, etudid=%s )" % (formsemestre_id, etudid) ) - sem = FormSemestre.query.get_or_404(formsemestre_id) + formsemestre = FormSemestre.query.get_or_404(formsemestre_id) etud = Identite.query.get_or_404(etudid) - results = bulletin_but.ResultatsSemestreBUT(sem) + results = bulletin_but.ResultatsSemestreBUT(formsemestre) nb_inscrits = len(results.etuds) - if (not sem.bul_hide_xml) or force_publishing: + etat_inscription = etud.etat_inscription(formsemestre.id) + if (not formsemestre.bul_hide_xml) or force_publishing: published = 1 else: published = 0 @@ -86,10 +87,10 @@ def bulletin_but_xml_compat( "date": docdate, "publie": str(published), } - if sem.etapes: - el["etape_apo"] = sem.etapes[0].etape_apo or "" + if formsemestre.etapes: + el["etape_apo"] = formsemestre.etapes[0].etape_apo or "" n = 2 - for et in sem.etapes[1:]: + for et in formsemestre.etapes[1:]: el["etape_apo" + str(n)] = et.etape_apo or "" n += 1 x = Element("bulletinetud", **el) @@ -120,117 +121,121 @@ def bulletin_but_xml_compat( return sco_xml.XML_HEADER + ElementTree.tostring(doc).decode( scu.SCO_ENCODING ) # stop ! - # Moyenne générale: - doc.append( - Element( - "note", - value=scu.fmt_note(results.etud_moy_gen[etud.id]), - min=scu.fmt_note(results.etud_moy_gen.min()), - max=scu.fmt_note(results.etud_moy_gen.max()), - moy=scu.fmt_note(results.etud_moy_gen.mean()), # moyenne des moy. gen. - ) - ) - rang = 0 # XXX TODO rang de l'étduiant selon la moy gen indicative - bonus = 0 # XXX TODO valeur du bonus sport - doc.append(Element("rang", value=str(rang), ninscrits=str(nb_inscrits))) - # XXX TODO: ajouter "rang_group" : rangs dans les partitions - doc.append(Element("note_max", value="20")) # notes toujours sur 20 - doc.append(Element("bonus_sport_culture", value=str(bonus))) - # Liste les UE / modules /evals - for ue in results.ues: - rang_ue = 0 # XXX TODO rang de l'étudiant dans cette UE - nb_inscrits_ue = ( - nb_inscrits # approx: compliqué de définir le "nb d'inscrit à une UE" - ) - x_ue = Element( - "ue", - id=str(ue.id), - numero=scu.quote_xml_attr(ue.numero), - acronyme=scu.quote_xml_attr(ue.acronyme or ""), - titre=scu.quote_xml_attr(ue.titre or ""), - code_apogee=scu.quote_xml_attr(ue.code_apogee or ""), - ) - doc.append(x_ue) - if ue.type != sco_codes_parcours.UE_SPORT: - v = results.etud_moy_ue[ue.id][etud.id] - else: - v = 0 # XXX TODO valeur bonus sport pour cet étudiant - x_ue.append( + + if etat_inscription == scu.INSCRIT: + # Moyenne générale: + doc.append( Element( "note", - value=scu.fmt_note(v), - min=scu.fmt_note(results.etud_moy_ue[ue.id].min()), - max=scu.fmt_note(results.etud_moy_ue[ue.id].max()), + value=scu.fmt_note(results.etud_moy_gen[etud.id]), + min=scu.fmt_note(results.etud_moy_gen.min()), + max=scu.fmt_note(results.etud_moy_gen.max()), + moy=scu.fmt_note(results.etud_moy_gen.mean()), # moyenne des moy. gen. ) ) - x_ue.append(Element("ects", value=str(ue.ects if ue.ects else 0))) - x_ue.append(Element("rang", value=str(rang_ue))) - x_ue.append(Element("effectif", value=str(nb_inscrits_ue))) - # Liste les modules rattachés à cette UE - for modimpl in results.modimpls: - # Liste ici uniquement les modules rattachés à cette UE - if modimpl.module.ue.id == ue.id: - mod_moy = scu.fmt_note(results.etud_moy_ue[ue.id][etud.id]) - coef = results.modimpl_coefs_df[modimpl.id][ue.id] - x_mod = Element( - "module", - id=str(modimpl.id), - code=str(modimpl.module.code or ""), - coefficient=str(coef), - numero=str(modimpl.module.numero or 0), - titre=scu.quote_xml_attr(modimpl.module.titre or ""), - abbrev=scu.quote_xml_attr(modimpl.module.abbrev or ""), - code_apogee=scu.quote_xml_attr(modimpl.module.code_apogee or ""), + rang = 0 # XXX TODO rang de l'étduiant selon la moy gen indicative + bonus = 0 # XXX TODO valeur du bonus sport + doc.append(Element("rang", value=str(rang), ninscrits=str(nb_inscrits))) + # XXX TODO: ajouter "rang_group" : rangs dans les partitions + doc.append(Element("note_max", value="20")) # notes toujours sur 20 + doc.append(Element("bonus_sport_culture", value=str(bonus))) + # Liste les UE / modules /evals + for ue in results.ues: + rang_ue = 0 # XXX TODO rang de l'étudiant dans cette UE + nb_inscrits_ue = ( + nb_inscrits # approx: compliqué de définir le "nb d'inscrit à une UE" + ) + x_ue = Element( + "ue", + id=str(ue.id), + numero=scu.quote_xml_attr(ue.numero), + acronyme=scu.quote_xml_attr(ue.acronyme or ""), + titre=scu.quote_xml_attr(ue.titre or ""), + code_apogee=scu.quote_xml_attr(ue.code_apogee or ""), + ) + doc.append(x_ue) + if ue.type != sco_codes_parcours.UE_SPORT: + v = results.etud_moy_ue[ue.id][etud.id] + else: + v = 0 # XXX TODO valeur bonus sport pour cet étudiant + x_ue.append( + Element( + "note", + value=scu.fmt_note(v), + min=scu.fmt_note(results.etud_moy_ue[ue.id].min()), + max=scu.fmt_note(results.etud_moy_ue[ue.id].max()), ) - x_ue.append(x_mod) - x_mod.append( - Element( - "note", - value=mod_moy, - min=scu.fmt_note(results.etud_moy_ue[ue.id].min()), - max=scu.fmt_note(results.etud_moy_ue[ue.id].max()), - moy=scu.fmt_note(results.etud_moy_ue[ue.id].mean()), + ) + x_ue.append(Element("ects", value=str(ue.ects if ue.ects else 0))) + x_ue.append(Element("rang", value=str(rang_ue))) + x_ue.append(Element("effectif", value=str(nb_inscrits_ue))) + # Liste les modules rattachés à cette UE + for modimpl in results.modimpls: + # Liste ici uniquement les modules rattachés à cette UE + if modimpl.module.ue.id == ue.id: + mod_moy = scu.fmt_note(results.etud_moy_ue[ue.id][etud.id]) + coef = results.modimpl_coefs_df[modimpl.id][ue.id] + x_mod = Element( + "module", + id=str(modimpl.id), + code=str(modimpl.module.code or ""), + coefficient=str(coef), + numero=str(modimpl.module.numero or 0), + titre=scu.quote_xml_attr(modimpl.module.titre or ""), + abbrev=scu.quote_xml_attr(modimpl.module.abbrev or ""), + code_apogee=scu.quote_xml_attr( + modimpl.module.code_apogee or "" + ), ) - ) - # XXX TODO rangs et effectifs - # --- notes de chaque eval: - if version != "short": - for e in modimpl.evaluations: - if e.visibulletin or version == "long": - x_eval = Element( - "evaluation", - jour=e.jour.isoformat() if e.jour else "", - heure_debut=e.heure_debut.isoformat() - if e.heure_debut - else "", - heure_fin=e.heure_fin.isoformat() - if e.heure_debut - else "", - coefficient=str(e.coefficient), - # pas les poids en XML compat - evaluation_type=str(e.evaluation_type), - description=scu.quote_xml_attr(e.description), - # notes envoyées sur 20, ceci juste pour garder trace: - note_max_origin=str(e.note_max), - ) - x_mod.append(x_eval) - x_eval.append( - Element( - "note", - value=scu.fmt_note( - results.modimpls_evals_notes[e.moduleimpl_id][ - e.id - ][etud.id], - note_max=e.note_max, - ), + x_ue.append(x_mod) + x_mod.append( + Element( + "note", + value=mod_moy, + min=scu.fmt_note(results.etud_moy_ue[ue.id].min()), + max=scu.fmt_note(results.etud_moy_ue[ue.id].max()), + moy=scu.fmt_note(results.etud_moy_ue[ue.id].mean()), + ) + ) + # XXX TODO rangs et effectifs + # --- notes de chaque eval: + if version != "short": + for e in modimpl.evaluations: + if e.visibulletin or version == "long": + x_eval = Element( + "evaluation", + jour=e.jour.isoformat() if e.jour else "", + heure_debut=e.heure_debut.isoformat() + if e.heure_debut + else "", + heure_fin=e.heure_fin.isoformat() + if e.heure_debut + else "", + coefficient=str(e.coefficient), + # pas les poids en XML compat + evaluation_type=str(e.evaluation_type), + description=scu.quote_xml_attr(e.description), + # notes envoyées sur 20, ceci juste pour garder trace: + note_max_origin=str(e.note_max), ) - ) - # XXX TODO: Evaluations incomplètes ou futures: XXX - # XXX TODO UE capitalisee (listee seulement si meilleure que l'UE courante) + x_mod.append(x_eval) + x_eval.append( + Element( + "note", + value=scu.fmt_note( + results.modimpls_evals_notes[ + e.moduleimpl_id + ][e.id][etud.id], + note_max=e.note_max, + ), + ) + ) + # XXX TODO: Evaluations incomplètes ou futures: XXX + # XXX TODO UE capitalisee (listee seulement si meilleure que l'UE courante) # --- Absences if sco_preferences.get_preference("bul_show_abs", formsemestre_id): - nbabs, nbabsjust = sem.get_abs_count(etud.id) + nbabs, nbabsjust = formsemestre.get_abs_count(etud.id) doc.append(Element("absences", nbabs=str(nbabs), nbabsjust=str(nbabsjust))) # -------- LA SUITE EST COPIEE SANS MODIF DE sco_bulletins_xml.py ---------