WIP: Bulletins BUT courts pdf

This commit is contained in:
Emmanuel Viennet 2023-08-30 16:03:36 +02:00
parent 2227c85250
commit 01bf344270
4 changed files with 26 additions and 26 deletions

View File

@ -4,11 +4,9 @@
# See LICENSE # See LICENSE
############################################################################## ##############################################################################
"""Génération bulletin BUT synthétique en une page """Génération bulletin BUT HTML synthétique en une page
On génère du HTML. Il sera si possible traduit en PDF par weasyprint. On génère du HTML à partir d'un template Jinja.
Le HTML est lui même généré à partir d'un template Jinja.
## Données ## Données

View File

@ -213,7 +213,8 @@ class BulletinGeneratorStandardBUT(BulletinGeneratorStandard):
self.ue_std_rows(rows, ue, title_bg) self.ue_std_rows(rows, ue, title_bg)
@staticmethod @staticmethod
def affichage_bonus_malus(ue: dict) -> list: def affichage_bonus_malus(ue: dict) -> list[str]:
"liste de chaînes affichant les bonus et malus"
fields_bmr = [] fields_bmr = []
# lecture des bonus sport culture et malus (ou bonus autre) (0 si valeur non numérique) # lecture des bonus sport culture et malus (ou bonus autre) (0 si valeur non numérique)
try: try:

View File

@ -31,15 +31,15 @@
Tout accès à ReportLab doit donc être précédé d'un PDFLOCK.acquire() Tout accès à ReportLab doit donc être précédé d'un PDFLOCK.acquire()
et terminé par un PDFLOCK.release() et terminé par un PDFLOCK.release()
En ScoDoc 9, ce n'est pas nécessaire car on est multiptocessus / monothread. En ScoDoc 9, ce n'est pas nécessaire car on est multiprocessus / monothread.
""" """
import datetime
import html import html
import io import io
import os import os
import queue import queue
import re import re
import threading import threading
import time
import traceback import traceback
import unicodedata import unicodedata
@ -345,7 +345,7 @@ class ScoDocPageTemplate(PageTemplate):
def footer_string(self) -> str: def footer_string(self) -> str:
"""String contenu du pied de page""" """String contenu du pied de page"""
d = _makeTimeDict() d = _make_datetime_dict()
d["scodoc_name"] = sco_version.SCONAME d["scodoc_name"] = sco_version.SCONAME
d["server_url"] = self.server_name d["server_url"] = self.server_name
return SU(self.footer_template % d) return SU(self.footer_template % d)
@ -410,15 +410,16 @@ class BulletinDocTemplate(BaseDocTemplate):
self.filigranne = flowable.filigranne self.filigranne = flowable.filigranne
def _makeTimeDict(): def _make_datetime_dict() -> dict:
# ... suboptimal but we don't care "a dict with date elements for templates"
now = datetime.datetime.now()
return { return {
"day": time.strftime("%d"), "day": now.day,
"month": time.strftime("%m"), "month": now.month,
"year": time.strftime("%y"), "year": now.year,
"Year": time.strftime("%Y"), "Year": now.year,
"hour": time.strftime("%H"), "hour": now.hour,
"minute": time.strftime("%M"), "minute": now.minute,
} }

View File

@ -1347,40 +1347,40 @@ def confirm_dialog(
def objects_renumber(db, obj_list) -> None: def objects_renumber(db, obj_list) -> None:
"""fixe les numeros des objets d'une liste de modèles """fixe les numeros des objets d'une liste de modèles
pour ne pas changer son ordre""" pour ne pas changer son ordre"""
log(f"objects_renumber") log("objects_renumber")
for i, obj in enumerate(obj_list): for i, obj in enumerate(obj_list):
obj.numero = i obj.numero = i
db.session.add(obj) db.session.add(obj)
db.session.commit() db.session.commit()
def comp_ranks(T: list[tuple]) -> dict[int, str]: def comp_ranks(tab: list[tuple]) -> dict[int, str]:
"""Calcul rangs à partir d'une liste ordonnée de tuples [ (valeur, ..., etudid) ] """Calcul rangs à partir d'une liste ordonnée de tuples [ (valeur, ..., etudid) ]
(valeur est une note numérique), en tenant compte des ex-aequos (valeur est une note numérique), en tenant compte des ex-aequos
Le resultat est: { etudid : rang } rang est une chaine decrivant le rang Le resultat est: { etudid : rang } rang est une chaine decrivant le rang
""" """
rangs = {} # { etudid : rang } (rang est une chaine) rangs = {} # { etudid : rang } (rang est une chaine)
nb_ex = 0 # nb d'ex-aequo consécutifs en cours nb_ex = 0 # nb d'ex-aequo consécutifs en cours
for i in range(len(T)): for i, row in enumerate(tab):
# test ex-aequo # test ex-aequo
if i < len(T) - 1: if i < len(tab) - 1:
next = T[i + 1][0] next_val = tab[i + 1][0]
else: else:
next = None next_val = None
moy = T[i][0] moy = row[0]
if nb_ex: if nb_ex:
srang = "%d ex" % (i + 1 - nb_ex) srang = "%d ex" % (i + 1 - nb_ex)
if moy == next: if moy == next_val:
nb_ex += 1 nb_ex += 1
else: else:
nb_ex = 0 nb_ex = 0
else: else:
if moy == next: if moy == next_val:
srang = "%d ex" % (i + 1 - nb_ex) srang = "%d ex" % (i + 1 - nb_ex)
nb_ex = 1 nb_ex = 1
else: else:
srang = "%d" % (i + 1) srang = "%d" % (i + 1)
rangs[T[i][-1]] = srang # str(i+1) rangs[row[-1]] = srang
return rangs return rangs