forked from ScoDoc/ScoDoc
WIP: Bulletins BUT courts pdf
This commit is contained in:
parent
2227c85250
commit
01bf344270
@ -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
|
||||||
|
|
||||||
|
@ -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:
|
||||||
|
@ -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,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -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 } où rang est une chaine decrivant le rang
|
Le resultat est: { etudid : rang } où 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
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user