Lettres individuelles: améliore présentation compétences validées

This commit is contained in:
Emmanuel Viennet 2024-07-04 14:51:46 +02:00
parent 2570f811ed
commit a92e1ab853
2 changed files with 44 additions and 11 deletions

View File

@ -2,6 +2,7 @@
"""Décisions de jury (validations) des RCUE et années du BUT """Décisions de jury (validations) des RCUE et années du BUT
""" """
from collections import defaultdict
from app import db from app import db
from app.models import CODE_STR_LEN from app.models import CODE_STR_LEN
@ -208,16 +209,7 @@ def dict_decision_jury(etud: Identite, formsemestre: FormSemestre) -> dict:
.order_by(UniteEns.numero, UniteEns.acronyme) .order_by(UniteEns.numero, UniteEns.acronyme)
) )
decisions["decision_rcue"] = [v.to_dict_bul() for v in validations_rcues] decisions["decision_rcue"] = [v.to_dict_bul() for v in validations_rcues]
titres_rcues = [] titres_rcues = _build_decisions_rcue_list(decisions["decision_rcue"])
for dec_rcue in decisions["decision_rcue"]:
niveau = dec_rcue["niveau"]
if niveau is None:
titres_rcues.append(f"""pas de compétence: code {dec_rcue["code"]}""")
else:
titres_rcues.append(
f"""{niveau["competence"]["titre"]} {niveau["ordre"]}: {
dec_rcue["code"]}"""
)
decisions["descr_decisions_rcue"] = ", ".join(titres_rcues) decisions["descr_decisions_rcue"] = ", ".join(titres_rcues)
decisions["descr_decisions_rcue_list"] = titres_rcues decisions["descr_decisions_rcue_list"] = titres_rcues
decisions["descr_decisions_niveaux"] = ( decisions["descr_decisions_niveaux"] = (
@ -243,3 +235,44 @@ def dict_decision_jury(etud: Identite, formsemestre: FormSemestre) -> dict:
else: else:
decisions["decision_annee"] = None decisions["decision_annee"] = None
return decisions return decisions
def _build_decisions_rcue_list(decisions_rcue: dict) -> list[str]:
"""Formatte liste des décisions niveaux de compétences / RCUE pour
lettres individuelles.
Le résulat est trié par compétence et donne pour chaque niveau avec validation:
[ 'Administrer: niveau 1 ADM, niveau 2 ADJ', ... ]
"""
# Construit { id_competence : validation }
# où validation est {'code': 'CMP', 'niveau': {'annee': 'BUT3', 'competence': {}, ... }
validation_by_competence = defaultdict(list)
for validation in decisions_rcue:
competence_id = (
validation.get("niveau", {}).get("competence", {}).get("id_orebut")
)
validation_by_competence[competence_id].append(validation)
# Tri des listes de validation par numéro de compétence
validations_niveaux = sorted(
validation_by_competence.values(),
key=lambda v: (
v[0].get("niveau", {}).get("competence", {}).get("numero", 0) if v else -1
),
)
titres_rcues = []
empty = {} # pour syntaxe f-string
for validations in validations_niveaux:
if validations:
v = validations[0]
titre_competence = (
v.get("niveau", {}).get("competence", {}).get("titre", "sans titre")
)
titres_rcues.append(
f"""{titre_competence} : """
+ ", ".join(
[
f"niveau {v.get('niveau',empty).get('ordre','?')} {v.get('code', '?')}"
for v in validations
]
)
)
return titres_rcues

View File

@ -312,7 +312,7 @@ def pdf_lettre_individuelle(sem, decision, etud: Identite, params, signature=Non
sig = _simulate_br(sig, '<para leftindent="%(htab1)s">') sig = _simulate_br(sig, '<para leftindent="%(htab1)s">')
objects += sco_pdf.make_paras( objects += sco_pdf.make_paras(
( (
"""<para leftindent="%(htab1)s" spaceBefore="25mm">""" """<para leftindent="%(htab1)s" spaceBefore="8mm">"""
+ sig + sig
+ """</para>""" + """</para>"""
) )