Logo en-tête
image placée en haut de certains documents documents PDF. Image actuelle:
-
{{ render_field(form.logo_header) }}
Logo pied de page
image placée en pied de page de certains documents documents PDF. Image actuelle:
-
{{ render_field(form.logo_footer) }}
diff --git a/app/views/scodoc.py b/app/views/scodoc.py
index 1722aca2..12a6ed03 100644
--- a/app/views/scodoc.py
+++ b/app/views/scodoc.py
@@ -30,6 +30,8 @@ Module main: page d'accueil, avec liste des départements
Emmanuel Viennet, 2021
"""
+import io
+
from app.auth.models import User
import os
@@ -38,7 +40,7 @@ from flask import abort, flash, url_for, redirect, render_template, send_file
from flask import request
from flask.app import Flask
import flask_login
-from flask_login.utils import login_required
+from flask_login.utils import login_required, current_user
from flask_wtf import FlaskForm
from flask_wtf.file import FileField, FileAllowed
from werkzeug.exceptions import BadRequest, NotFound
@@ -61,10 +63,14 @@ from app.decorators import (
scodoc,
permission_required_compat_scodoc7,
)
+from app.scodoc.imageresize import ImageScale
from app.scodoc.sco_exceptions import AccessDenied
+from app.scodoc.sco_logos import Logo
from app.scodoc.sco_permissions import Permission
from app.views import scodoc_bp as bp
+from PIL import Image as PILImage
+
@bp.route("/")
@bp.route("/ScoDoc")
@@ -240,13 +246,9 @@ def configuration():
if form.validate_on_submit():
ScoDocSiteConfig.set_bonus_sport_func(form.bonus_sport_func_name.data)
if form.logo_header.data:
- sco_logos.store_image(
- form.logo_header.data, os.path.join(scu.SCODOC_LOGOS_DIR, "logo_header")
- )
+ sco_logos.write_logo(stream=form.logo_header.data, name="header")
if form.logo_footer.data:
- sco_logos.store_image(
- form.logo_footer.data, os.path.join(scu.SCODOC_LOGOS_DIR, "logo_footer")
- )
+ sco_logos.write_logo(stream=form.logo_footer.data, name="footer")
app.clear_scodoc_cache()
flash(f"Configuration enregistrée")
return redirect(url_for("scodoc.index"))
@@ -259,29 +261,81 @@ def configuration():
)
-def _return_logo(logo_type="header", scodoc_dept=""):
+SMALL_SIZE = (300, 300)
+
+
+def _return_logo(name="header", dept_id="", small=False, strict: bool = True):
# stockée dans /opt/scodoc-data/config/logos donc servie manuellement ici
- filename = sco_logos.get_logo_filename(logo_type, scodoc_dept)
- if filename:
- extension = os.path.splitext(filename)[1]
- return send_file(filename, mimetype=f"image/{extension}")
+ # génération d'une url
+ # url = url_for(
+ # "scodoc.get_logo_small",
+ # name=name,
+ # dept_id=dept_id,
+ # global_if_not_found=global_if_not_found,
+ # )
+ logo = sco_logos.find_logo(name, dept_id, strict)
+ if logo is not None:
+ suffix = logo.suffix
+ if small:
+ with PILImage.open(logo.filepath) as im:
+ im.thumbnail(SMALL_SIZE)
+ stream = io.BytesIO()
+ # on garde le même format (on pourrait plus simplement générer systématiquement du JPEG)
+ fmt = { # adapt suffix to be compliant with PIL save format
+ "PNG": "PNG",
+ "JPG": "JPEG",
+ "JPEG": "JPEG",
+ }[suffix.upper()]
+ im.save(stream, fmt)
+ stream.seek(0)
+ return send_file(stream, mimetype=f"image/{fmt}")
+ else:
+ return send_file(logo.filepath, mimetype=f"image/{suffix}")
else:
- return ""
+ abort(404)
-@bp.route("/ScoDoc/logo_header")
-@bp.route("/ScoDoc/