diff --git a/app/scodoc/gen_tables.py b/app/scodoc/gen_tables.py
index a9ed10aaf1..855545556a 100644
--- a/app/scodoc/gen_tables.py
+++ b/app/scodoc/gen_tables.py
@@ -58,6 +58,7 @@ from app.scodoc import sco_utils as scu
from app.scodoc import sco_excel
from app.scodoc import sco_pdf
from app.scodoc import sco_xml
+from app.scodoc.sco_exceptions import ScoPDFFormatError
from app.scodoc.sco_pdf import SU
from app import log
@@ -539,17 +540,18 @@ class GenTable(object):
#
# titles = ["%s" % x for x in self.get_titles_list()]
pdf_style_list = []
- Pt = [
- [Paragraph(SU(str(x)), CellStyle) for x in line]
- for line in (
- self.get_data_list(
- pdf_mode=True,
- pdf_style_list=pdf_style_list,
- with_titles=True,
- omit_hidden_lines=True,
- )
- )
- ]
+ data_list = self.get_data_list(
+ pdf_mode=True,
+ pdf_style_list=pdf_style_list,
+ with_titles=True,
+ omit_hidden_lines=True,
+ )
+ try:
+ Pt = [
+ [Paragraph(SU(str(x)), CellStyle) for x in line] for line in data_list
+ ]
+ except ValueError as exc:
+ raise ScoPDFFormatError(str(exc)) from exc
pdf_style_list += self.pdf_table_style
T = Table(Pt, repeatRows=1, colWidths=self.pdf_col_widths, style=pdf_style_list)
diff --git a/app/scodoc/sco_exceptions.py b/app/scodoc/sco_exceptions.py
index c563c93e6b..d975766efe 100644
--- a/app/scodoc/sco_exceptions.py
+++ b/app/scodoc/sco_exceptions.py
@@ -60,6 +60,21 @@ class ScoFormatError(ScoValueError):
pass
+class ScoPDFFormatError(ScoValueError):
+ "erreur génération PDF (templates platypus, ...)"
+
+ def __init__(self, msg, dest_url=None):
+ super().__init__(
+ f"""Erreur dans un format pdf:
+
{msg}
+ Vérifiez les paramètres (polices de caractères, balisage)
+ dans les paramètres ou préférences.
+
+ """,
+ dest_url=dest_url,
+ )
+
+
class ScoInvalidDept(ScoValueError):
"""departement invalide"""
diff --git a/app/scodoc/sco_groups_view.py b/app/scodoc/sco_groups_view.py
index 603627d14c..df4c55e981 100644
--- a/app/scodoc/sco_groups_view.py
+++ b/app/scodoc/sco_groups_view.py
@@ -815,7 +815,7 @@ def tab_absences_html(groups_infos, etat=None):
% (groups_infos.base_url, groups_infos.groups_titles),
"""Trombinoscope en PDF"""
% groups_infos.groups_query_args,
- """Trombinoscope en PDF (format "IUT de Tours", beta)"""
+ """Trombinoscope en PDF (format "IUT de Tours")"""
% groups_infos.groups_query_args,
"""Feuille relevé absences hebdomadaire (beta)"""
% groups_infos.groups_query_args,
diff --git a/app/scodoc/sco_preferences.py b/app/scodoc/sco_preferences.py
index 3dd413f504..a0d9b010b1 100644
--- a/app/scodoc/sco_preferences.py
+++ b/app/scodoc/sco_preferences.py
@@ -762,7 +762,7 @@ class BasePreferences(object):
{
"initvalue": "Helvetica",
"title": "Police de caractère principale",
- "explanation": "pour les pdf",
+ "explanation": "pour les pdf (Helvetica est recommandée)",
"size": 25,
"category": "pdf",
},
diff --git a/app/scodoc/sco_trombino_tours.py b/app/scodoc/sco_trombino_tours.py
index e7f2266fb8..3861bb74ff 100644
--- a/app/scodoc/sco_trombino_tours.py
+++ b/app/scodoc/sco_trombino_tours.py
@@ -44,6 +44,7 @@ from app.scodoc import sco_groups_view
from app.scodoc import sco_preferences
from app.scodoc import sco_trombino
from app.scodoc import sco_etud
+from app.scodoc.sco_exceptions import ScoPDFFormatError
from app.scodoc.sco_pdf import *
@@ -268,7 +269,10 @@ def pdf_trombino_tours(
preferences=sco_preferences.SemPreferences(),
)
)
- document.build(objects)
+ try:
+ document.build(objects)
+ except (ValueError, KeyError) as exc:
+ raise ScoPDFFormatError(str(exc)) from exc
data = report.getvalue()
return scu.sendPDFFile(data, filename)
diff --git a/app/views/users.py b/app/views/users.py
index af4a721ed4..cc9b9db01a 100644
--- a/app/views/users.py
+++ b/app/views/users.py
@@ -151,6 +151,8 @@ def user_info(user_name, format="json"):
@scodoc7func
def create_user_form(user_name=None, edit=0, all_roles=1):
"form. création ou edition utilisateur"
+ if user_name is not None: # scodoc7func converti en int !
+ user_name = str(user_name)
auth_dept = current_user.dept
from_mail = current_user.email
initvalues = {}
@@ -745,6 +747,8 @@ def user_info_page(user_name=None):
"""
from app.scodoc.sco_permissions_check import can_handle_passwd
+ if user_name is not None: # scodoc7func converti en int !
+ user_name = str(user_name)
# peut on divulguer ces infos ?
if not can_handle_passwd(current_user, allow_admindepts=True):
raise AccessDenied("Vous n'avez pas la permission de voir cette page")
@@ -753,7 +757,7 @@ def user_info_page(user_name=None):
if not user_name:
user = current_user
else:
- user = User.query.filter_by(user_name=str(user_name)).first()
+ user = User.query.filter_by(user_name=user_name).first()
if not user:
raise ScoValueError("invalid user_name")
@@ -802,6 +806,8 @@ def form_change_password(user_name=None):
"""Formulaire de changement mot de passe de l'utilisateur user_name.
Un utilisateur peut toujours changer son propre mot de passe.
"""
+ if user_name is not None: # scodoc7func converti en int !
+ user_name = str(user_name)
if not user_name:
user = current_user
else:
@@ -850,6 +856,8 @@ def form_change_password(user_name=None):
@scodoc7func
def change_password(user_name, password, password2):
"Change the password for user given by user_name"
+ if user_name is not None: # scodoc7func converti en int !
+ user_name = str(user_name)
u = User.query.filter_by(user_name=user_name).first()
# Check access permission
if not can_handle_passwd(u):
@@ -909,6 +917,8 @@ def change_password(user_name, password, password2):
@permission_required(Permission.ScoUsersAdmin)
def toggle_active_user(user_name: str = None):
"""Change active status of a user account"""
+ if user_name is not None: # scodoc7func converti en int !
+ user_name = str(user_name)
u = User.query.filter_by(user_name=user_name).first()
if not u:
raise ScoValueError("invalid user_name")
diff --git a/tools/import_scodoc7_dept.py b/tools/import_scodoc7_dept.py
index cedf0a9360..597b9baf69 100644
--- a/tools/import_scodoc7_dept.py
+++ b/tools/import_scodoc7_dept.py
@@ -389,6 +389,7 @@ def convert_object(
new_ref = None
elif is_table and table_name in {
"notes_semset_formsemestre",
+ "entreprise_contact",
}:
# pour anciennes installs où des relations n'avait pas été déclarées clés étrangères
# eg: notes_semset_formsemestre.semset_id n'était pas une clé