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
##############################################################################
"""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.
Le HTML est lui même généré à partir d'un template Jinja.
On génère du HTML à partir d'un template Jinja.
## Données

View File

@ -213,7 +213,8 @@ class BulletinGeneratorStandardBUT(BulletinGeneratorStandard):
self.ue_std_rows(rows, ue, title_bg)
@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 = []
# lecture des bonus sport culture et malus (ou bonus autre) (0 si valeur non numérique)
try:

View File

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

View File

@ -1347,40 +1347,40 @@ def confirm_dialog(
def objects_renumber(db, obj_list) -> None:
"""fixe les numeros des objets d'une liste de modèles
pour ne pas changer son ordre"""
log(f"objects_renumber")
log("objects_renumber")
for i, obj in enumerate(obj_list):
obj.numero = i
db.session.add(obj)
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) ]
(valeur est une note numérique), en tenant compte des ex-aequos
Le resultat est: { etudid : rang } rang est une chaine decrivant le rang
"""
rangs = {} # { etudid : rang } (rang est une chaine)
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
if i < len(T) - 1:
next = T[i + 1][0]
if i < len(tab) - 1:
next_val = tab[i + 1][0]
else:
next = None
moy = T[i][0]
next_val = None
moy = row[0]
if nb_ex:
srang = "%d ex" % (i + 1 - nb_ex)
if moy == next:
if moy == next_val:
nb_ex += 1
else:
nb_ex = 0
else:
if moy == next:
if moy == next_val:
srang = "%d ex" % (i + 1 - nb_ex)
nb_ex = 1
else:
srang = "%d" % (i + 1)
rangs[T[i][-1]] = srang # str(i+1)
rangs[row[-1]] = srang
return rangs