diff --git a/app/pe/pe_avislatex.py b/app/pe/pe_avislatex.py
index a1cf300bc..b98218eea 100644
--- a/app/pe/pe_avislatex.py
+++ b/app/pe/pe_avislatex.py
@@ -33,8 +33,8 @@
import os
import codecs
import re
-from app.pe import pe_jurype
from app.pe import pe_tagtable
+from app.pe import pe_jurype
from app.pe import pe_tools
import app.scodoc.sco_utils as scu
@@ -48,7 +48,7 @@ from app.scodoc import sco_etud
DEBUG = False # Pour debug et repérage des prints à changer en Log
DONNEE_MANQUANTE = (
- u"" # Caractère de remplacement des données manquantes dans un avis PE
+ "" # Caractère de remplacement des données manquantes dans un avis PE
)
# ----------------------------------------------------------------------------------------
@@ -102,17 +102,17 @@ def comp_latex_parcourstimeline(etudiant, promo, taille=17):
result: chaine unicode (EV:)
"""
codelatexDebut = (
- u"""
+ """"
\\begin{parcourstimeline}{**debut**}{**fin**}{**nbreSemestres**}{%d}
"""
% taille
)
- modeleEvent = u"""
+ modeleEvent = """
\\parcoursevent{**nosem**}{**nomsem**}{**descr**}
"""
- codelatexFin = u"""
+ codelatexFin = """
\\end{parcourstimeline}
"""
reslatex = codelatexDebut
@@ -125,13 +125,13 @@ def comp_latex_parcourstimeline(etudiant, promo, taille=17):
for no_sem in range(etudiant["nbSemestres"]):
descr = modeleEvent
nom_semestre_dans_parcours = parcours[no_sem]["nom_semestre_dans_parcours"]
- descr = descr.replace(u"**nosem**", str(no_sem + 1))
+ descr = descr.replace("**nosem**", str(no_sem + 1))
if no_sem % 2 == 0:
- descr = descr.replace(u"**nomsem**", nom_semestre_dans_parcours)
- descr = descr.replace(u"**descr**", u"")
+ descr = descr.replace("**nomsem**", nom_semestre_dans_parcours)
+ descr = descr.replace("**descr**", "")
else:
- descr = descr.replace(u"**nomsem**", u"")
- descr = descr.replace(u"**descr**", nom_semestre_dans_parcours)
+ descr = descr.replace("**nomsem**", "")
+ descr = descr.replace("**descr**", nom_semestre_dans_parcours)
reslatex += descr
reslatex += codelatexFin
return reslatex
@@ -166,7 +166,7 @@ def get_code_latex_avis_etudiant(
result: chaine unicode
"""
if not donnees_etudiant or not un_avis_latex: # Cas d'un template vide
- return annotationPE if annotationPE else u""
+ return annotationPE if annotationPE else ""
# Le template latex (corps + footer)
code = un_avis_latex + "\n\n" + footer_latex
@@ -189,17 +189,17 @@ def get_code_latex_avis_etudiant(
)
# La macro parcourstimeline
- elif tag_latex == u"parcourstimeline":
+ elif tag_latex == "parcourstimeline":
valeur = comp_latex_parcourstimeline(
donnees_etudiant, donnees_etudiant["promo"]
)
# Le tag annotationPE
- elif tag_latex == u"annotation":
+ elif tag_latex == "annotation":
valeur = annotationPE
# Le tag bilanParTag
- elif tag_latex == u"bilanParTag":
+ elif tag_latex == "bilanParTag":
valeur = get_bilanParTag(donnees_etudiant)
# Les tags "simples": par ex. nom, prenom, civilite, ...
@@ -249,14 +249,14 @@ def get_annotation_PE(etudid, tag_annotation_pe):
]["comment_u"]
annotationPE = exp.sub(
- u"", annotationPE
+ "", annotationPE
) # Suppression du tag d'annotation PE
- annotationPE = annotationPE.replace(u"\r", u"") # Suppression des \r
+ annotationPE = annotationPE.replace("\r", "") # Suppression des \r
annotationPE = annotationPE.replace(
- u"
", u"\n\n"
+ "
", "\n\n"
) # Interprète les retours chariots html
return annotationPE
- return u"" # pas d'annotations
+ return "" # pas d'annotations
# ----------------------------------------------------------------------------------------
@@ -282,7 +282,7 @@ def str_from_syntheseJury(donnees_etudiant, aggregat, groupe, tag_scodoc, champ)
):
donnees_numeriques = donnees_etudiant[aggregat][groupe][tag_scodoc]
if champ == "rang":
- valeur = u"%s/%d" % (
+ valeur = "%s/%d" % (
donnees_numeriques[
pe_tagtable.TableTag.FORMAT_DONNEES_ETUDIANTS.index("rang")
],
@@ -303,9 +303,9 @@ def str_from_syntheseJury(donnees_etudiant, aggregat, groupe, tag_scodoc, champ)
if isinstance(
donnees_numeriques[indice_champ], float
): # valeur numérique avec formattage unicode
- valeur = u"%2.2f" % donnees_numeriques[indice_champ]
+ valeur = "%2.2f" % donnees_numeriques[indice_champ]
else:
- valeur = u"%s" % donnees_numeriques[indice_champ]
+ valeur = "%s" % donnees_numeriques[indice_champ]
return valeur
@@ -356,29 +356,27 @@ def get_bilanParTag(donnees_etudiant, groupe="groupe"):
("\\textit{" + rang + "}") if note else ""
) # rang masqué si pas de notes
- code_latex = u"\\begin{tabular}{|c|" + "|c" * (len(entete)) + "|}\n"
- code_latex += u"\\hline \n"
+ code_latex = "\\begin{tabular}{|c|" + "|c" * (len(entete)) + "|}\n"
+ code_latex += "\\hline \n"
code_latex += (
- u" & "
+ " & "
+ " & ".join(["\\textbf{" + intitule + "}" for (agg, intitule, _) in entete])
+ " \\\\ \n"
)
- code_latex += u"\\hline"
- code_latex += u"\\hline \n"
+ code_latex += "\\hline"
+ code_latex += "\\hline \n"
for (i, ligne_val) in enumerate(valeurs["note"]):
titre = lignes[i] # règle le pb d'encodage
+ code_latex += "\\textbf{" + titre + "} & " + " & ".join(ligne_val) + "\\\\ \n"
code_latex += (
- u"\\textbf{" + titre + u"} & " + " & ".join(ligne_val) + u"\\\\ \n"
- )
- code_latex += (
- u" & "
- + u" & ".join(
- [u"{\\scriptsize " + clsmt + u"}" for clsmt in valeurs["rang"][i]]
+ " & "
+ + " & ".join(
+ ["{\\scriptsize " + clsmt + "}" for clsmt in valeurs["rang"][i]]
)
- + u"\\\\ \n"
+ + "\\\\ \n"
)
- code_latex += u"\\hline \n"
- code_latex += u"\\end{tabular}"
+ code_latex += "\\hline \n"
+ code_latex += "\\end{tabular}"
return code_latex
@@ -397,21 +395,15 @@ def get_avis_poursuite_par_etudiant(
nom = jury.syntheseJury[etudid]["nom"].replace(" ", "-")
prenom = jury.syntheseJury[etudid]["prenom"].replace(" ", "-")
- nom_fichier = (
- u"avis_poursuite_"
- + pe_tools.remove_accents(nom)
- + "_"
- + pe_tools.remove_accents(prenom)
- + "_"
- + str(etudid)
+ nom_fichier = scu.sanitize_filename(
+ "avis_poursuite_%s_%s_%s" % (nom, prenom, etudid)
)
if pe_tools.PE_DEBUG:
pe_tools.pe_print("fichier latex =" + nom_fichier, type(nom_fichier))
# Entete (commentaire)
-
contenu_latex = (
- u"%% ---- Etudiant: " + civilite_str + " " + nom + " " + prenom + u"\n"
+ "%% ---- Etudiant: " + civilite_str + " " + nom + " " + prenom + "\n"
)
# les annnotations
diff --git a/app/pe/pe_jurype.py b/app/pe/pe_jurype.py
index ca2e9e52c..a7d302ad8 100644
--- a/app/pe/pe_jurype.py
+++ b/app/pe/pe_jurype.py
@@ -1149,12 +1149,10 @@ class JuryPE(object):
# **********************************************
def calcul_anneePromoDUT_d_un_etudiant(self, etudid):
- """Calcule et renvoie la date de diplome prévue pour un étudiant fourni
- avec son etudid en fonction de sesSemestres de scolarisation
- et -1 s'il n'y a pas de semestre.
- """
+ """Calcule et renvoie la date de diplome prévue pour un étudiant fourni avec son etudid
+ en fonction de sesSemestres de scolarisation"""
sesSemestres = self.get_semestresDUT_d_un_etudiant(etudid)
- return max([get_annee_diplome_semestre(sem) for sem in sesSemestres] or -1)
+ return max([get_annee_diplome_semestre(sem) for sem in sesSemestres])
# *********************************************
# Fonctions d'affichage pour debug
diff --git a/app/pe/pe_tools.py b/app/pe/pe_tools.py
index 5be8e2d98..aef083982 100644
--- a/app/pe/pe_tools.py
+++ b/app/pe/pe_tools.py
@@ -167,8 +167,19 @@ def list_directory_filenames(path):
def add_local_file_to_zip(zipfile, ziproot, pathname, path_in_zip):
"""Read pathname server file and add content to zip under path_in_zip"""
rooted_path_in_zip = os.path.join(ziproot, path_in_zip)
- data = open(pathname).read()
- zipfile.writestr(rooted_path_in_zip, data)
+ zipfile.write(filename=pathname, arcname=rooted_path_in_zip)
+ # data = open(pathname).read()
+ # zipfile.writestr(rooted_path_in_zip, data)
+
+
+def add_refs_to_register(register, directory):
+ """Ajoute les fichiers trouvés dans directory au registre (dictionaire) sous la forme
+ filename => pathname
+ """
+ length = len(directory)
+ for pathname in list_directory_filenames(directory):
+ filename = pathname[length + 1 :]
+ register[filename] = pathname
def add_pe_stuff_to_zip(zipfile, ziproot):
@@ -179,30 +190,16 @@ def add_pe_stuff_to_zip(zipfile, ziproot):
Also copy logos
"""
+ register = {}
+ # first add standard (distrib references)
distrib_dir = os.path.join(REP_DEFAULT_AVIS, "distrib")
- distrib_pathnames = list_directory_filenames(
- distrib_dir
- ) # eg /opt/scodoc/tools/doc_poursuites_etudes/distrib/modeles/toto.tex
- l = len(distrib_dir)
- distrib_filenames = {x[l + 1 :] for x in distrib_pathnames} # eg modeles/toto.tex
-
+ add_refs_to_register(register=register, directory=distrib_dir)
+ # then add local references (some oh them may overwrite distrib refs)
local_dir = os.path.join(REP_LOCAL_AVIS, "local")
- local_pathnames = list_directory_filenames(local_dir)
- l = len(local_dir)
- local_filenames = {x[l + 1 :] for x in local_pathnames}
-
- for filename in distrib_filenames | local_filenames:
- if filename in local_filenames:
- add_local_file_to_zip(
- zipfile, ziproot, os.path.join(local_dir, filename), "avis/" + filename
- )
- else:
- add_local_file_to_zip(
- zipfile,
- ziproot,
- os.path.join(distrib_dir, filename),
- "avis/" + filename,
- )
+ add_refs_to_register(register=register, directory=local_dir)
+ # at this point register contains all refs (filename, pathname) to be saved
+ for filename, pathname in register.items():
+ add_local_file_to_zip(zipfile, ziproot, pathname, "avis/" + filename)
# Logos: (add to logos/ directory in zip)
logos_names = ["logo_header.jpg", "logo_footer.jpg"]
diff --git a/app/pe/pe_view.py b/app/pe/pe_view.py
index 3d9c718ec..14efdada3 100644
--- a/app/pe/pe_view.py
+++ b/app/pe/pe_view.py
@@ -43,7 +43,6 @@ from app.scodoc import html_sco_header
from app.scodoc import sco_preferences
from app.pe import pe_tools
-from app.pe.pe_tools import PE_LATEX_ENCODING
from app.pe import pe_jurype
from app.pe import pe_avislatex
@@ -90,7 +89,6 @@ def pe_view_sem_recap(
semBase = sco_formsemestre.get_formsemestre(formsemestre_id)
jury = pe_jurype.JuryPE(semBase)
-
# Ajout avis LaTeX au même zip:
etudids = list(jury.syntheseJury.keys())
@@ -150,18 +148,14 @@ def pe_view_sem_recap(
footer_latex,
prefs,
)
-
- jury.add_file_to_zip(
- ("avis/" + nom_fichier + ".tex").encode(PE_LATEX_ENCODING),
- contenu_latex.encode(PE_LATEX_ENCODING),
- )
+ jury.add_file_to_zip("avis/" + nom_fichier + ".tex", contenu_latex)
latex_pages[nom_fichier] = contenu_latex # Sauvegarde dans un dico
# Nouvelle version : 1 fichier par étudiant avec 1 fichier appelant créée ci-dessous
doc_latex = "\n% -----\n".join(
["\\include{" + nom + "}" for nom in sorted(latex_pages.keys())]
)
- jury.add_file_to_zip("avis/avis_poursuite.tex", doc_latex.encode(PE_LATEX_ENCODING))
+ jury.add_file_to_zip("avis/avis_poursuite.tex", doc_latex)
# Ajoute image, LaTeX class file(s) and modeles
pe_tools.add_pe_stuff_to_zip(jury.zipfile, jury.NOM_EXPORT_ZIP)
diff --git a/app/scodoc/gen_tables.py b/app/scodoc/gen_tables.py
index b49ab5dae..f6ac6c343 100644
--- a/app/scodoc/gen_tables.py
+++ b/app/scodoc/gen_tables.py
@@ -471,7 +471,10 @@ class GenTable(object):
def excel(self, wb=None):
"""Simple Excel representation of the table"""
- ses = sco_excel.ScoExcelSheet(sheet_name=self.xls_sheet_name, wb=wb)
+ if wb is None:
+ ses = sco_excel.ScoExcelSheet(sheet_name=self.xls_sheet_name, wb=wb)
+ else:
+ ses = wb.create_sheet(sheet_name=self.xls_sheet_name)
ses.rows += self.xls_before_table
style_bold = sco_excel.excel_make_style(bold=True)
style_base = sco_excel.excel_make_style()
@@ -486,8 +489,6 @@ class GenTable(object):
ses.append_single_cell_row(self.origin, style_base)
if wb is None:
return ses.generate()
- else:
- ses.generate()
def text(self):
"raw text representation of the table"