Fix: anciens bulletins XML du BUT des démissionnaires

This commit is contained in:
Emmanuel Viennet 2022-01-09 10:11:50 +01:00
parent 9172282451
commit 68dec8e1f8

View File

@ -68,11 +68,12 @@ def bulletin_but_xml_compat(
"bulletin_but_xml_compat( formsemestre_id=%s, etudid=%s )" "bulletin_but_xml_compat( formsemestre_id=%s, etudid=%s )"
% (formsemestre_id, etudid) % (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) etud = Identite.query.get_or_404(etudid)
results = bulletin_but.ResultatsSemestreBUT(sem) results = bulletin_but.ResultatsSemestreBUT(formsemestre)
nb_inscrits = len(results.etuds) 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 published = 1
else: else:
published = 0 published = 0
@ -86,10 +87,10 @@ def bulletin_but_xml_compat(
"date": docdate, "date": docdate,
"publie": str(published), "publie": str(published),
} }
if sem.etapes: if formsemestre.etapes:
el["etape_apo"] = sem.etapes[0].etape_apo or "" el["etape_apo"] = formsemestre.etapes[0].etape_apo or ""
n = 2 n = 2
for et in sem.etapes[1:]: for et in formsemestre.etapes[1:]:
el["etape_apo" + str(n)] = et.etape_apo or "" el["etape_apo" + str(n)] = et.etape_apo or ""
n += 1 n += 1
x = Element("bulletinetud", **el) x = Element("bulletinetud", **el)
@ -120,117 +121,121 @@ def bulletin_but_xml_compat(
return sco_xml.XML_HEADER + ElementTree.tostring(doc).decode( return sco_xml.XML_HEADER + ElementTree.tostring(doc).decode(
scu.SCO_ENCODING scu.SCO_ENCODING
) # stop ! ) # stop !
# Moyenne générale:
doc.append( if etat_inscription == scu.INSCRIT:
Element( # Moyenne générale:
"note", doc.append(
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(
Element( Element(
"note", "note",
value=scu.fmt_note(v), value=scu.fmt_note(results.etud_moy_gen[etud.id]),
min=scu.fmt_note(results.etud_moy_ue[ue.id].min()), min=scu.fmt_note(results.etud_moy_gen.min()),
max=scu.fmt_note(results.etud_moy_ue[ue.id].max()), 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))) rang = 0 # XXX TODO rang de l'étduiant selon la moy gen indicative
x_ue.append(Element("rang", value=str(rang_ue))) bonus = 0 # XXX TODO valeur du bonus sport
x_ue.append(Element("effectif", value=str(nb_inscrits_ue))) doc.append(Element("rang", value=str(rang), ninscrits=str(nb_inscrits)))
# Liste les modules rattachés à cette UE # XXX TODO: ajouter "rang_group" : rangs dans les partitions
for modimpl in results.modimpls: doc.append(Element("note_max", value="20")) # notes toujours sur 20
# Liste ici uniquement les modules rattachés à cette UE doc.append(Element("bonus_sport_culture", value=str(bonus)))
if modimpl.module.ue.id == ue.id: # Liste les UE / modules /evals
mod_moy = scu.fmt_note(results.etud_moy_ue[ue.id][etud.id]) for ue in results.ues:
coef = results.modimpl_coefs_df[modimpl.id][ue.id] rang_ue = 0 # XXX TODO rang de l'étudiant dans cette UE
x_mod = Element( nb_inscrits_ue = (
"module", nb_inscrits # approx: compliqué de définir le "nb d'inscrit à une UE"
id=str(modimpl.id), )
code=str(modimpl.module.code or ""), x_ue = Element(
coefficient=str(coef), "ue",
numero=str(modimpl.module.numero or 0), id=str(ue.id),
titre=scu.quote_xml_attr(modimpl.module.titre or ""), numero=scu.quote_xml_attr(ue.numero),
abbrev=scu.quote_xml_attr(modimpl.module.abbrev or ""), acronyme=scu.quote_xml_attr(ue.acronyme or ""),
code_apogee=scu.quote_xml_attr(modimpl.module.code_apogee 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( x_ue.append(Element("ects", value=str(ue.ects if ue.ects else 0)))
Element( x_ue.append(Element("rang", value=str(rang_ue)))
"note", x_ue.append(Element("effectif", value=str(nb_inscrits_ue)))
value=mod_moy, # Liste les modules rattachés à cette UE
min=scu.fmt_note(results.etud_moy_ue[ue.id].min()), for modimpl in results.modimpls:
max=scu.fmt_note(results.etud_moy_ue[ue.id].max()), # Liste ici uniquement les modules rattachés à cette UE
moy=scu.fmt_note(results.etud_moy_ue[ue.id].mean()), 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 ""
),
) )
) x_ue.append(x_mod)
# XXX TODO rangs et effectifs x_mod.append(
# --- notes de chaque eval: Element(
if version != "short": "note",
for e in modimpl.evaluations: value=mod_moy,
if e.visibulletin or version == "long": min=scu.fmt_note(results.etud_moy_ue[ue.id].min()),
x_eval = Element( max=scu.fmt_note(results.etud_moy_ue[ue.id].max()),
"evaluation", moy=scu.fmt_note(results.etud_moy_ue[ue.id].mean()),
jour=e.jour.isoformat() if e.jour else "", )
heure_debut=e.heure_debut.isoformat() )
if e.heure_debut # XXX TODO rangs et effectifs
else "", # --- notes de chaque eval:
heure_fin=e.heure_fin.isoformat() if version != "short":
if e.heure_debut for e in modimpl.evaluations:
else "", if e.visibulletin or version == "long":
coefficient=str(e.coefficient), x_eval = Element(
# pas les poids en XML compat "evaluation",
evaluation_type=str(e.evaluation_type), jour=e.jour.isoformat() if e.jour else "",
description=scu.quote_xml_attr(e.description), heure_debut=e.heure_debut.isoformat()
# notes envoyées sur 20, ceci juste pour garder trace: if e.heure_debut
note_max_origin=str(e.note_max), else "",
) heure_fin=e.heure_fin.isoformat()
x_mod.append(x_eval) if e.heure_debut
x_eval.append( else "",
Element( coefficient=str(e.coefficient),
"note", # pas les poids en XML compat
value=scu.fmt_note( evaluation_type=str(e.evaluation_type),
results.modimpls_evals_notes[e.moduleimpl_id][ description=scu.quote_xml_attr(e.description),
e.id # notes envoyées sur 20, ceci juste pour garder trace:
][etud.id], note_max_origin=str(e.note_max),
note_max=e.note_max,
),
) )
) x_mod.append(x_eval)
# XXX TODO: Evaluations incomplètes ou futures: XXX x_eval.append(
# XXX TODO UE capitalisee (listee seulement si meilleure que l'UE courante) 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 # --- Absences
if sco_preferences.get_preference("bul_show_abs", formsemestre_id): 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))) doc.append(Element("absences", nbabs=str(nbabs), nbabsjust=str(nbabsjust)))
# -------- LA SUITE EST COPIEE SANS MODIF DE sco_bulletins_xml.py --------- # -------- LA SUITE EST COPIEE SANS MODIF DE sco_bulletins_xml.py ---------