diff --git a/app/models/but_validations.py b/app/models/but_validations.py index 8ec9a110..d6eb9d87 100644 --- a/app/models/but_validations.py +++ b/app/models/but_validations.py @@ -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 diff --git a/app/scodoc/sco_pv_lettres_inviduelles.py b/app/scodoc/sco_pv_lettres_inviduelles.py index 3517c9a6..6e335f0a 100644 --- a/app/scodoc/sco_pv_lettres_inviduelles.py +++ b/app/scodoc/sco_pv_lettres_inviduelles.py @@ -312,7 +312,7 @@ def pdf_lettre_individuelle(sem, decision, etud: Identite, params, signature=Non sig = _simulate_br(sig, '') objects += sco_pdf.make_paras( ( - """""" + """""" + sig + """""" )