Envoi par mail des bulletins PDF courts

This commit is contained in:
Emmanuel Viennet 2023-12-06 20:40:55 +01:00
parent 0f860f912c
commit 689b8610bf
6 changed files with 58 additions and 29 deletions

View File

@ -345,8 +345,8 @@ class BulletinBUT:
- Si force_publishing, rempli le bulletin même si bul_hide_xml est vrai - Si force_publishing, rempli le bulletin même si bul_hide_xml est vrai
(bulletins non publiés). (bulletins non publiés).
""" """
if version not in scu.BULLETINS_VERSIONS: if version not in scu.BULLETINS_VERSIONS_BUT:
raise ScoValueError("version de bulletin demandée invalide") raise ScoValueError("bulletin_etud: version de bulletin demandée invalide")
res = self.res res = self.res
formsemestre = res.formsemestre formsemestre = res.formsemestre
etat_inscription = etud.inscription_etat(formsemestre.id) etat_inscription = etud.inscription_etat(formsemestre.id)

View File

@ -83,12 +83,16 @@ def bulletin_but(formsemestre_id: int, etudid: int = None, fmt="html"):
) )
def bulletin_but_court_pdf_frag(etud: Identite, formsemestre: FormSemestre) -> bytes: def bulletin_but_court_pdf_frag(
etud: Identite, formsemestre: FormSemestre, stand_alone=False
) -> bytes:
"""Le code PDF d'un bulletin BUT court, à intégrer dans un document """Le code PDF d'un bulletin BUT court, à intégrer dans un document
(pour les classeurs de tous les bulletins) (pour les classeurs de tous les bulletins)
""" """
args = _build_bulletin_but_infos(etud, formsemestre) args = _build_bulletin_but_infos(etud, formsemestre)
return bulletin_but_court_pdf.make_bulletin_but_court_pdf(args, stand_alone=False) return bulletin_but_court_pdf.make_bulletin_but_court_pdf(
args, stand_alone=stand_alone
)
def _build_bulletin_but_infos( def _build_bulletin_but_infos(

View File

@ -346,7 +346,9 @@ def do_formsemestre_archive(
) )
if bul_version not in scu.BULLETINS_VERSIONS: if bul_version not in scu.BULLETINS_VERSIONS:
raise ScoValueError("version de bulletin demandée invalide") raise ScoValueError(
"do_formsemestre_archive: version de bulletin demandée invalide"
)
formsemestre = FormSemestre.get_formsemestre(formsemestre_id) formsemestre = FormSemestre.get_formsemestre(formsemestre_id)
res: NotesTableCompat = res_sem.load_formsemestre_results(formsemestre) res: NotesTableCompat = res_sem.load_formsemestre_results(formsemestre)
sem_archive_id = formsemestre_id sem_archive_id = formsemestre_id
@ -505,7 +507,7 @@ enregistrés et non modifiables, on peut les retrouver ultérieurement.
""", """,
] ]
F = [ F = [
f"""<p><em>Note: les documents sont aussi affectés par les réglages sur la page f"""<p><em>Note: les documents sont aussi affectés par les réglages sur la page
"<a class="stdlink" href="{ "<a class="stdlink" href="{
url_for("scolar.edit_preferences", scodoc_dept=g.scodoc_dept) url_for("scolar.edit_preferences", scodoc_dept=g.scodoc_dept)
}">Paramétrage</a>" }">Paramétrage</a>"

View File

@ -513,8 +513,8 @@ def _ue_mod_bulletin(
sco_users.user_info(modimpl["responsable_id"])["nomcomplet"], sco_users.user_info(modimpl["responsable_id"])["nomcomplet"],
) )
link_mod = f"""<a class="bull_link" href="{ link_mod = f"""<a class="bull_link" href="{
url_for("notes.moduleimpl_status", url_for("notes.moduleimpl_status",
scodoc_dept=g.scodoc_dept, scodoc_dept=g.scodoc_dept,
moduleimpl_id=modimpl["moduleimpl_id"] moduleimpl_id=modimpl["moduleimpl_id"]
) )
}" title="{mod["mod_descr_txt"]}">""" }" title="{mod["mod_descr_txt"]}">"""
@ -576,7 +576,7 @@ def _ue_mod_bulletin(
"name" "name"
] = f"""{e.description or ""} { ] = f"""{e.description or ""} {
e.descr_date() e.descr_date()
if e.date_debut and not is_complete if e.date_debut and not is_complete
else ""}""" else ""}"""
e_dict["target_html"] = url_for( e_dict["target_html"] = url_for(
"notes.evaluation_listenotes", "notes.evaluation_listenotes",
@ -985,6 +985,8 @@ def do_formsemestre_bulletinetud(
bul est str ou bytes au format demandé (html, pdf, pdfmail, pdfpart, xml, json) bul est str ou bytes au format demandé (html, pdf, pdfmail, pdfpart, xml, json)
et filigranne est un message à placer en "filigranne" (eg "Provisoire"). et filigranne est un message à placer en "filigranne" (eg "Provisoire").
""" """
from app.but import bulletin_but_court
fmt = fmt or "html" fmt = fmt or "html"
if fmt == "xml": if fmt == "xml":
bul = sco_bulletins_xml.make_xml_formsemestre_bulletinetud( bul = sco_bulletins_xml.make_xml_formsemestre_bulletinetud(
@ -1045,9 +1047,19 @@ def do_formsemestre_bulletinetud(
if not can_send_bulletin_by_mail(formsemestre.id): if not can_send_bulletin_by_mail(formsemestre.id):
raise AccessDenied("Vous n'avez pas le droit d'effectuer cette opération !") raise AccessDenied("Vous n'avez pas le droit d'effectuer cette opération !")
pdfdata, filename = sco_bulletins_generator.make_formsemestre_bulletin_etud( if version == "butcourt":
bul_dict, etud=etud, formsemestre=formsemestre, version=version, fmt="pdf" pdfdata = bulletin_but_court.bulletin_but_court_pdf_frag(
) etud, formsemestre, stand_alone=True
)
filename = scu.bul_filename(formsemestre, etud, prefix="bul-court")
else:
pdfdata, filename = sco_bulletins_generator.make_formsemestre_bulletin_etud(
bul_dict,
etud=etud,
formsemestre=formsemestre,
version=version,
fmt="pdf",
)
if prefer_mail_perso: if prefer_mail_perso:
recipient_addr = ( recipient_addr = (

View File

@ -222,7 +222,9 @@ def get_formsemestre_bulletins_pdf(formsemestre_id, version="selectedevals"):
else scu.BULLETINS_VERSIONS else scu.BULLETINS_VERSIONS
) )
if version not in versions: if version not in versions:
raise ScoValueError("version de bulletin demandée invalide !") raise ScoValueError(
"get_formsemestre_bulletins_pdf: version de bulletin demandée invalide !"
)
cached = sco_cache.SemBulletinsPDFCache.get(str(formsemestre_id) + "_" + version) cached = sco_cache.SemBulletinsPDFCache.get(str(formsemestre_id) + "_" + version)
if cached: if cached:
return cached[1], cached[0] return cached[1], cached[0]

View File

@ -288,7 +288,9 @@ def formsemestre_bulletinetud(
): ):
fmt = fmt or "html" fmt = fmt or "html"
if version not in scu.BULLETINS_VERSIONS_BUT: if version not in scu.BULLETINS_VERSIONS_BUT:
raise ScoValueError("version de bulletin demandée invalide") raise ScoValueError(
"formsemestre_bulletinetud: version de bulletin demandée invalide"
)
if not isinstance(etudid, int): if not isinstance(etudid, int):
raise ScoInvalidIdType("formsemestre_bulletinetud: etudid must be an integer !") raise ScoInvalidIdType("formsemestre_bulletinetud: etudid must be an integer !")
if formsemestre_id is not None and not isinstance(formsemestre_id, int): if formsemestre_id is not None and not isinstance(formsemestre_id, int):
@ -1881,13 +1883,14 @@ _EXPL_BULL = """Versions des bulletins:
@scodoc7func @scodoc7func
def formsemestre_bulletins_pdf_choice(formsemestre_id, version=None): def formsemestre_bulletins_pdf_choice(formsemestre_id, version=None):
"""Choix version puis envoi classeur bulletins pdf""" """Choix version puis envoi classeur bulletins pdf"""
formsemestre = FormSemestre.get_formsemestre(formsemestre_id)
if version: if version:
pdfdoc, filename = sco_bulletins_pdf.get_formsemestre_bulletins_pdf( pdfdoc, filename = sco_bulletins_pdf.get_formsemestre_bulletins_pdf(
formsemestre_id, version=version formsemestre_id, version=version
) )
return scu.sendPDFFile(pdfdoc, filename) return scu.sendPDFFile(pdfdoc, filename)
return formsemestre_bulletins_choice( return _formsemestre_bulletins_choice(
formsemestre_id, formsemestre,
title="Choisir la version des bulletins à générer", title="Choisir la version des bulletins à générer",
explanation=_EXPL_BULL, explanation=_EXPL_BULL,
) )
@ -1900,7 +1903,7 @@ def formsemestre_bulletins_pdf_choice(formsemestre_id, version=None):
def etud_bulletins_pdf(etudid, version="selectedevals"): def etud_bulletins_pdf(etudid, version="selectedevals"):
"Publie tous les bulletins d'un etudiants dans un classeur PDF" "Publie tous les bulletins d'un etudiants dans un classeur PDF"
if version not in scu.BULLETINS_VERSIONS: if version not in scu.BULLETINS_VERSIONS:
raise ScoValueError("version de bulletin demandée invalide") raise ScoValueError("etud_bulletins_pdf: version de bulletin demandée invalide")
pdfdoc, filename = sco_bulletins_pdf.get_etud_bulletins_pdf(etudid, version=version) pdfdoc, filename = sco_bulletins_pdf.get_etud_bulletins_pdf(etudid, version=version)
return scu.sendPDFFile(pdfdoc, filename) return scu.sendPDFFile(pdfdoc, filename)
@ -1927,15 +1930,20 @@ def formsemestre_bulletins_mailetuds_choice(
prefer_mail_perso=prefer_mail_perso, prefer_mail_perso=prefer_mail_perso,
) )
) )
formsemestre = FormSemestre.get_formsemestre(formsemestre_id)
expl_bull = """Versions des bulletins: expl_bull = """Versions des bulletins:
<ul> <ul>
<li><b>courte</b>: moyennes des modules</li> <li><b>courte</b>: moyennes des modules</li>
<li><b>intermédiaire</b>: moyennes des modules et notes des évaluations sélectionnées</li> <li><b>intermédiaire</b>: moyennes des modules et notes des évaluations sélectionnées</li>
<li><b>complète</b>: toutes les notes</li> <li><b>complète</b>: toutes les notes</li>
<ul>""" """
return formsemestre_bulletins_choice( if formsemestre.formation.is_apc():
formsemestre_id, expl_bull += """
<li><b>courte spéciale BUT</b>: un résumé en une page pour les BUTs</li>
"""
expl_bull += "</ul>"
return _formsemestre_bulletins_choice(
formsemestre,
title="Choisir la version des bulletins à envoyer par mail", title="Choisir la version des bulletins à envoyer par mail",
explanation="""Chaque étudiant (non démissionnaire ni défaillant) explanation="""Chaque étudiant (non démissionnaire ni défaillant)
ayant une adresse mail connue de ScoDoc ayant une adresse mail connue de ScoDoc
@ -1947,23 +1955,24 @@ def formsemestre_bulletins_mailetuds_choice(
# not published # not published
def formsemestre_bulletins_choice( def _formsemestre_bulletins_choice(
formsemestre_id, title="", explanation="", choose_mail=False formsemestre: FormSemestre, title="", explanation="", choose_mail=False
): ):
"""Choix d'une version de bulletin""" """Choix d'une version de bulletin"""
versions = (
scu.BULLETINS_VERSIONS_BUT
if formsemestre.formation.is_apc()
else scu.BULLETINS_VERSIONS
)
H = [ H = [
html_sco_header.html_sem_header(title), html_sco_header.html_sem_header(title),
f""" f"""
<form name="f" method="GET" action="{request.base_url}"> <form name="f" method="GET" action="{request.base_url}">
<input type="hidden" name="formsemestre_id" value="{formsemestre_id}"></input> <input type="hidden" name="formsemestre_id" value="{formsemestre.id}"></input>
""", """,
] ]
H.append("""<select name="version" class="noprint">""") H.append("""<select name="version" class="noprint">""")
for version, description in ( for version, description in versions.items():
("short", "Version courte"),
("selectedevals", "Version intermédiaire"),
("long", "Version complète"),
):
H.append(f"""<option value="{version}">{description}</option>""") H.append(f"""<option value="{version}">{description}</option>""")
H.append("""</select>&nbsp;&nbsp;<input type="submit" value="Générer"/>""") H.append("""</select>&nbsp;&nbsp;<input type="submit" value="Générer"/>""")