background image on pdf bulletins

This commit is contained in:
viennet 2020-10-21 22:56:25 +02:00
parent 9ce3af1c1d
commit 233a11ad14
6 changed files with 64 additions and 24 deletions

View File

@ -51,8 +51,7 @@ from sco_pdf import *
def mark_paras(L, tags):
"""Put each (string) element of L between <b>
"""
"""Put each (string) element of L between <b>"""
for tag in tags:
b = "<" + tag + ">"
c = "</" + tag.split()[0] + ">"
@ -584,8 +583,7 @@ class GenTable:
return repr(doc)
def json(self):
"""JSON representation of the table.
"""
"""JSON representation of the table."""
d = []
for row in self.rows:
r = {}
@ -639,7 +637,9 @@ class GenTable:
return "\n".join(H)
elif format == "pdf":
objects = self.pdf()
doc = pdf_basic_page(objects, title=title, preferences=self.preferences)
doc = pdf_basic_page(
objects, title=title, preferences=self.preferences, context=context
)
if publish:
return sendPDFFile(REQUEST, doc, filename + ".pdf")
else:

View File

@ -198,6 +198,7 @@ class BulletinGenerator:
document.addPageTemplates(
ScolarsPageTemplate(
document,
self.context,
author="%s %s (E. Viennet) [%s]"
% (SCONAME, SCOVERSION, self.description),
title="Bulletin %s de %s"

View File

@ -86,6 +86,7 @@ def pdfassemblebulletins(
document.addPageTemplates(
ScolarsPageTemplate(
document,
context,
author="%s %s (E. Viennet)" % (SCONAME, SCOVERSION),
title="Bulletin %s" % bul_title,
subject="Bulletin de note",
@ -136,7 +137,7 @@ def process_field(
# handle logos:
image_dir = SCODOC_LOGOS_DIR + "/logos_" + context.DeptId() + "/"
if not os.path.exists(image_dir):
image_dir = SCODOC_LOGOS_DIR + "/" # use global logos
image_dir = SCODOC_LOGOS_DIR + "/" # use global logos
text = re.sub(
r"<(\s*)logo(.*?)src\s*=\s*(.*?)>", r"<\1logo\2\3>", text
) # remove forbidden src attribute

View File

@ -159,6 +159,7 @@ class ScolarsPageTemplate(PageTemplate):
def __init__(
self,
document,
context=None,
pagesbookmarks={},
author=None,
title=None,
@ -178,6 +179,8 @@ class ScolarsPageTemplate(PageTemplate):
self.server_name = server_name
self.filigranne = filigranne
self.footer_template = footer_template
self.with_page_background = self.preferences["bul_pdf_with_background"]
self.background_image_filename = None
# Our doc is made of a single frame
left, top, right, bottom = [float(x) for x in margins]
content = Frame(
@ -188,9 +191,23 @@ class ScolarsPageTemplate(PageTemplate):
)
PageTemplate.__init__(self, "ScolarsPageTemplate", [content])
self.logo = None
# XXX COPIED from sco_pvpdf, to be refactored (no time now)
# Search background in dept specific dir, then in global config dir
for image_dir in (
SCODOC_LOGOS_DIR + "/logos_" + context.DeptId() + "/",
SCODOC_LOGOS_DIR + "/", # global logos
):
for suffix in LOGOS_IMAGES_ALLOWED_TYPES:
fn = image_dir + "/bul_pdf_background" + "." + suffix
if not self.background_image_filename and os.path.exists(fn):
self.background_image_filename = fn
# Also try to use PV background
fn = image_dir + "/letter_background" + "." + suffix
if not self.background_image_filename and os.path.exists(fn):
self.background_image_filename = fn
def beforeDrawPage(self, canvas, doc):
"""Draws a logo and an contribution message on each page.
"""Draws (optional) background, logo and contribution message on each page.
day : Day of the month as a decimal number [01,31]
month : Month as a decimal number [01,12].
@ -203,6 +220,12 @@ class ScolarsPageTemplate(PageTemplate):
"""
canvas.saveState()
# ---- Background image
if self.background_image_filename and self.with_page_background:
canvas.drawImage(
self.background_image_filename, 0, 0, doc.pagesize[0], doc.pagesize[1]
)
# ---- Logo: a small image, positionned at top left of the page
if self.logo is not None:
# draws the logo if it exists
@ -266,7 +289,7 @@ def _makeTimeDict():
def pdf_basic_page(
objects, title="", preferences=None
objects, title="", preferences=None, context=None
): # used by gen_table.make_page()
"""Simple convenience fonction: build a page from a list of platypus objects,
adding a title if specified.
@ -277,6 +300,7 @@ def pdf_basic_page(
document.addPageTemplates(
ScolarsPageTemplate(
document,
context,
title=title,
author="%s %s (E. Viennet)" % (SCONAME, SCOVERSION),
footer_template="Edité par %(scodoc_name)s le %(day)s/%(month)s/%(year)s à %(hour)sh%(minute)s",

View File

@ -1386,6 +1386,16 @@ Année scolaire: %(anneescolaire)s
"category": "bul",
},
),
(
"bul_pdf_with_background",
{
"initvalue": 0,
"title": "Mettre l'image de fond sur les bulletins",
"input_type": "boolcheckbox",
"labels": ["non", "oui"],
"category": "bul",
},
),
(
"SCOLAR_FONT_BUL_FIELDS",
{

View File

@ -164,7 +164,9 @@ def check_local_photos_availability(context, groups_infos, REQUEST, format=""):
nb_missing = 0
for t in groups_infos.members:
etudid = t["etudid"]
url = sco_photos.etud_photo_url(context, t, REQUEST=REQUEST) # -> copy distant files if needed
url = sco_photos.etud_photo_url(
context, t, REQUEST=REQUEST
) # -> copy distant files if needed
if not sco_photos.etud_photo_is_local(context, t):
nb_missing += 1
if nb_missing > 0:
@ -271,8 +273,7 @@ def trombino_copy_photos(context, group_ids=[], REQUEST=None, dialog_confirmed=F
def _get_etud_platypus_image(context, t, image_width=2 * cm):
"""Returns aplatypus object for the photo of student t
"""
"""Returns aplatypus object for the photo of student t"""
try:
path = sco_photos.photo_pathname(context, t, size="small")
if not path:
@ -364,7 +365,9 @@ def _trombino_pdf(context, groups_infos, REQUEST):
document = BaseDocTemplate(report)
document.addPageTemplates(
ScolarsPageTemplate(
document, preferences=context.get_preferences(sem["formsemestre_id"])
document,
context,
preferences=context.get_preferences(sem["formsemestre_id"]),
)
)
document.build(objects)
@ -445,7 +448,9 @@ def _listeappel_photos_pdf(context, groups_infos, REQUEST):
document = BaseDocTemplate(report)
document.addPageTemplates(
ScolarsPageTemplate(
document, preferences=context.get_preferences(sem["formsemestre_id"])
document,
context,
preferences=context.get_preferences(sem["formsemestre_id"]),
)
)
document.build(objects)
@ -509,7 +514,9 @@ def _listeappel_photos_pdf(context, groups_infos, REQUEST):
document = BaseDocTemplate(report)
document.addPageTemplates(
ScolarsPageTemplate(
document, preferences=context.get_preferences(sem["formsemestre_id"])
document,
context,
preferences=context.get_preferences(sem["formsemestre_id"]),
)
)
document.build(objects)
@ -519,8 +526,7 @@ def _listeappel_photos_pdf(context, groups_infos, REQUEST):
# --------------------- Upload des photos de tout un groupe
def photos_generate_excel_sample(context, group_ids=[], REQUEST=None):
"""Feuille excel pour import fichiers photos
"""
"""Feuille excel pour import fichiers photos"""
fmt = ImportScolars.sco_import_format()
data = ImportScolars.sco_import_generate_excel_sample(
fmt,
@ -541,8 +547,7 @@ def photos_generate_excel_sample(context, group_ids=[], REQUEST=None):
def photos_import_files_form(context, group_ids=[], REQUEST=None):
"""Formulaire pour importation photos
"""
"""Formulaire pour importation photos"""
groups_infos = sco_groups_view.DisplayedGroupsInfos(
context, group_ids, REQUEST=REQUEST
)
@ -596,8 +601,7 @@ def photos_import_files_form(context, group_ids=[], REQUEST=None):
def photos_import_files(
context, group_ids=[], xlsfile=None, zipfile=None, REQUEST=None
):
"""Importation des photos
"""
"""Importation des photos"""
groups_infos = sco_groups_view.DisplayedGroupsInfos(
context, group_ids, REQUEST=REQUEST
)