diff --git a/app/scodoc/sco_bulletins.py b/app/scodoc/sco_bulletins.py index 83a51293..989c7bd5 100644 --- a/app/scodoc/sco_bulletins.py +++ b/app/scodoc/sco_bulletins.py @@ -347,23 +347,23 @@ def formsemestre_bulletinetud_dict(formsemestre_id, etudid, version="long"): u[ "modules_capitalized" ] = [] # modules de l'UE capitalisée (liste vide si pas capitalisée) - if ue_status["is_capitalized"]: - sem_origin = sco_formsemestre.get_formsemestre(ue_status["formsemestre_id"]) - u["ue_descr_txt"] = "capitalisée le %s" % ndb.DateISOtoDMY( - ue_status["event_date"] - ) + if ue_status["is_capitalized"] and ue_status["formsemestre_id"] is not None: + sem_origin = FormSemestre.query.get(ue_status["formsemestre_id"]) u[ - "ue_descr_html" - ] = f"""{u["ue_descr_txt"]} pouet + "ue_descr_txt" + ] = f'capitalisée le {ndb.DateISOtoDMY(ue_status["event_date"])}' + u["ue_descr_html"] = ( + f"""{u["ue_descr_txt"]} """ - if ue_status["moy"] != "NA" and ue_status["formsemestre_id"]: + if sem_origin + else "" + ) + if ue_status["moy"] != "NA": # détail des modules de l'UE capitalisée - formsemestre_cap = FormSemestre.query.get_or_404( - ue_status["formsemestre_id"] - ) + formsemestre_cap = FormSemestre.query.get(ue_status["formsemestre_id"]) nt_cap: NotesTableCompat = res_sem.load_formsemestre_results( formsemestre_cap ) @@ -712,7 +712,6 @@ def etud_descr_situation_semestre( infos = scu.DictDefault(defaultvalue="") # --- Situation et décisions jury - # démission/inscription ? events = sco_etud.scolar_events_list( cnx, args={"etudid": etudid, "formsemestre_id": formsemestre_id} @@ -763,11 +762,17 @@ def etud_descr_situation_semestre( infos["descr_inscription"] = "" infos["situation"] = infos["descr_inscription"] + # Décision: valeurs par defaut vides: + infos["decision_jury"] = infos["descr_decision_jury"] = "" + infos["decision_sem"] = "" + infos["decisions_ue"] = infos["descr_decisions_ue"] = "" + infos["descr_decisions_niveaux"] = infos["descr_decisions_rcue"] = "" + infos["descr_decision_annee"] = "" if date_dem: infos["descr_demission"] = f"Démission le {date_dem}." infos["date_demission"] = date_dem - infos["descr_decision_jury"] = "Démission" + infos["decision_jury"] = infos["descr_decision_jury"] = "Démission" infos["situation"] += " " + infos["descr_demission"] return infos, None # ne donne pas les dec. de jury pour les demissionnaires if date_def: @@ -779,8 +784,6 @@ def etud_descr_situation_semestre( dpv = sco_pvjury.dict_pvjury(formsemestre_id, etudids=[etudid]) if dpv: infos["decision_sem"] = dpv["decisions"][0]["decision_sem"] - else: - infos["decision_sem"] = "" if not show_decisions: return infos, dpv @@ -803,7 +806,7 @@ def etud_descr_situation_semestre( infos["descr_decisions_ue"] = " UE acquises: " + pv["decisions_ue_descr"] + ". " dec += infos["descr_decisions_ue"] else: - # infos['decisions_ue'] = None + infos["decisions_ue"] = "" infos["descr_decisions_ue"] = "" infos["mention"] = pv["mention"] @@ -842,9 +845,20 @@ def formsemestre_bulletinetud( force_publishing=False, # force publication meme si semestre non publie sur "portail" prefer_mail_perso=False, ): - """Page bulletin de notes - pour les formations classiques hors BUT (page HTML) - ou le format "oldjson". + """Page bulletin de notes pour + - HTML des formations classiques (non BUT) + - le format "oldjson" (les "json" sont générés à part, voir get_formsemestre_bulletin_etud_json) + - les formats PDF, XML et mail pdf (toutes formations) + + Note: le format XML n'est plus maintenu et pour les BUT ne contient pas + toutes les informations. Privilégier le format JSON. + + Paramètres: + - version: pour les formations classqiues, versions short/selectedevals/long + - xml_with_decisions: inclue ou non les + - force_publishing: renvoie le bulletin même si semestre non publie sur "portail" + - prefer_mail_perso: pour pdfmail, utilise adresse mail perso en priorité. + """ format = format or "html" formsemestre: FormSemestre = FormSemestre.query.get(formsemestre_id) @@ -903,7 +917,12 @@ def do_formsemestre_bulletinetud( prefer_mail_perso=False, # mails envoyés sur adresse perso si non vide ): """Génère le bulletin au format demandé. - Retourne: (bul, filigranne) + Utilisé pour: + - HTML des formations classiques (non BUT) + - le format "oldjson" (les json sont générés à part, voir get_formsemestre_bulletin_etud_json) + - les formats PDF, XML et mail pdf (toutes formations) + + Résultat: (bul, filigranne) où bul est str ou bytes au format demandé (html, pdf, pdfmail, pdfpart, xml, json) et filigranne est un message à placer en "filigranne" (eg "Provisoire"). """ @@ -919,7 +938,7 @@ def do_formsemestre_bulletinetud( return bul, "" - elif format == "json": + elif format == "json": # utilisé pour classic et "oldjson" bul = sco_bulletins_json.make_json_formsemestre_bulletinetud( formsemestre.id, etudid, @@ -932,20 +951,20 @@ def do_formsemestre_bulletinetud( if formsemestre.formation.is_apc(): etudiant = Identite.query.get(etudid) r = bulletin_but.BulletinBUT(formsemestre) - I = r.bulletin_etud_complet(etudiant, version=version) + infos = r.bulletin_etud_complet(etudiant, version=version) else: - I = formsemestre_bulletinetud_dict(formsemestre.id, etudid) - etud = I["etud"] + infos = formsemestre_bulletinetud_dict(formsemestre.id, etudid) + etud = infos["etud"] if format == "html": htm, _ = sco_bulletins_generator.make_formsemestre_bulletinetud( - I, version=version, format="html" + infos, version=version, format="html" ) - return htm, I["filigranne"] + return htm, infos["filigranne"] elif format == "pdf" or format == "pdfpart": bul, filename = sco_bulletins_generator.make_formsemestre_bulletinetud( - I, + infos, version=version, format="pdf", stand_alone=(format != "pdfpart"), @@ -953,10 +972,10 @@ def do_formsemestre_bulletinetud( if format == "pdf": return ( scu.sendPDFFile(bul, filename), - I["filigranne"], + infos["filigranne"], ) # unused ret. value else: - return bul, I["filigranne"] + return bul, infos["filigranne"] elif format == "pdfmail": # format pdfmail: envoie le pdf par mail a l'etud, et affiche le html @@ -965,7 +984,7 @@ def do_formsemestre_bulletinetud( raise AccessDenied("Vous n'avez pas le droit d'effectuer cette opération !") pdfdata, filename = sco_bulletins_generator.make_formsemestre_bulletinetud( - I, version=version, format="pdf" + infos, version=version, format="pdf" ) if prefer_mail_perso: @@ -975,21 +994,21 @@ def do_formsemestre_bulletinetud( if not recipient_addr: flash(f"{etud['nomprenom']} n'a pas d'adresse e-mail !") - return False, I["filigranne"] + return False, infos["filigranne"] else: - mail_bulletin(formsemestre.id, I, pdfdata, filename, recipient_addr) + mail_bulletin(formsemestre.id, infos, pdfdata, filename, recipient_addr) flash(f"mail envoyé à {recipient_addr}") - return True, I["filigranne"] + return True, infos["filigranne"] raise ValueError("do_formsemestre_bulletinetud: invalid format (%s)" % format) -def mail_bulletin(formsemestre_id, I, pdfdata, filename, recipient_addr): +def mail_bulletin(formsemestre_id, infos, pdfdata, filename, recipient_addr): """Send bulletin by email to etud If bul_mail_list_abs pref is true, put list of absences in mail body (text). """ - etud = I["etud"] + etud = infos["etud"] webmaster = sco_preferences.get_preference("bul_mail_contact_addr", formsemestre_id) dept = scu.unescape_html( sco_preferences.get_preference("DeptName", formsemestre_id) @@ -1016,7 +1035,7 @@ def mail_bulletin(formsemestre_id, I, pdfdata, filename, recipient_addr): etud["etudid"], with_evals=False, format="text" ) - subject = "Relevé de notes de %s" % etud["nomprenom"] + subject = f"""Relevé de notes de {etud["nomprenom"]}""" recipients = [recipient_addr] sender = sco_preferences.get_preference("email_from_addr", formsemestre_id) if copy_addr: @@ -1025,7 +1044,7 @@ def mail_bulletin(formsemestre_id, I, pdfdata, filename, recipient_addr): bcc = "" # Attach pdf - log("mail bulletin a %s" % recipient_addr) + log(f"""mail bulletin a {recipient_addr}""") email.send_email( subject, sender,