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
"""
from collections import defaultdict
from app import db
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)
)
decisions["decision_rcue"] = [v.to_dict_bul() for v in validations_rcues]
titres_rcues = []
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"]}"""
)
titres_rcues = _build_decisions_rcue_list(decisions["decision_rcue"])
decisions["descr_decisions_rcue"] = ", ".join(titres_rcues)
decisions["descr_decisions_rcue_list"] = titres_rcues
decisions["descr_decisions_niveaux"] = (
@ -243,3 +235,44 @@ def dict_decision_jury(etud: Identite, formsemestre: FormSemestre) -> dict:
else:
decisions["decision_annee"] = None
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">')
objects += sco_pdf.make_paras(
(
"""<para leftindent="%(htab1)s" spaceBefore="25mm">"""
"""<para leftindent="%(htab1)s" spaceBefore="8mm">"""
+ sig
+ """</para>"""
)