forked from ScoDoc/ScoDoc
191 lines
7.0 KiB
Python
191 lines
7.0 KiB
Python
# -*- mode: python -*-
|
|
# -*- coding: utf-8 -*-
|
|
|
|
##############################################################################
|
|
#
|
|
# Gestion scolarite IUT
|
|
#
|
|
# Copyright (c) 1999 - 2021 Emmanuel Viennet. All rights reserved.
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
#
|
|
# Emmanuel Viennet emmanuel.viennet@viennet.net
|
|
#
|
|
##############################################################################
|
|
|
|
##############################################################################
|
|
# Module "Avis de poursuite d'étude"
|
|
# conçu et développé par Cléo Baras (IUT de Grenoble)
|
|
##############################################################################
|
|
|
|
|
|
"""ScoDoc : interface des fonctions de gestion des avis de poursuites d'étude
|
|
|
|
"""
|
|
|
|
from sco_utils import *
|
|
from notes_log import log
|
|
import sco_formsemestre
|
|
import sco_formsemestre_status
|
|
import notes_table
|
|
from gen_tables import GenTable
|
|
import sco_codes_parcours
|
|
|
|
import pe_tools
|
|
from pe_tools import *
|
|
import pe_tagtable
|
|
import pe_semestretag
|
|
import pe_settag
|
|
import pe_jurype
|
|
import pe_avislatex
|
|
|
|
|
|
def _pe_view_sem_recap_form(context, formsemestre_id, REQUEST=None):
|
|
H = [
|
|
context.sco_header(REQUEST, page_title="Avis de poursuite d'études"),
|
|
"""<h2 class="formsemestre">Génération des avis de poursuites d'études</h2>
|
|
<p class="help">
|
|
Cette fonction génère un ensemble de fichiers permettant d'éditer des avis de poursuites d'études.
|
|
<br/>
|
|
De nombreux aspects sont paramétrables:
|
|
<a href="https://scodoc.org/AvisPoursuiteEtudes">
|
|
voir la documentation</a>.
|
|
</p>
|
|
<form method="post" action="pe_view_sem_recap" id="pe_view_sem_recap_form" enctype="multipart/form-data">
|
|
<div class="pe_template_up">
|
|
Les templates sont généralement installés sur le serveur ou dans le paramétrage de ScoDoc.<br/>
|
|
Au besoin, vous pouvez spécifier ici votre propre fichier de template (<tt>un_avis.tex</tt>):
|
|
<div class="pe_template_upb">Template: <input type="file" size="30" name="avis_tmpl_file"/></div>
|
|
<div class="pe_template_upb">Pied de page: <input type="file" size="30" name="footer_tmpl_file"/></div>
|
|
</div>
|
|
<input type="submit" value="Générer les documents"/>
|
|
<input type="hidden" name="formsemestre_id" value="{formsemestre_id}">
|
|
</form>
|
|
""".format(
|
|
formsemestre_id=formsemestre_id
|
|
),
|
|
]
|
|
return "\n".join(H) + context.sco_footer(REQUEST)
|
|
|
|
|
|
def pe_view_sem_recap(
|
|
context,
|
|
formsemestre_id,
|
|
avis_tmpl_file=None,
|
|
footer_tmpl_file=None,
|
|
mode_debug=False,
|
|
REQUEST=None,
|
|
):
|
|
"""Génération des avis de poursuite d'étude
|
|
|
|
mode_debug = Pour "squeezer" le calcul du jury pe (long)
|
|
et debugger uniquement la partie avis latex
|
|
"""
|
|
if REQUEST and REQUEST.method == "GET":
|
|
return _pe_view_sem_recap_form(context, formsemestre_id, REQUEST=REQUEST)
|
|
prefs = context.get_preferences(formsemestre_id=formsemestre_id)
|
|
|
|
semBase = sco_formsemestre.get_formsemestre(context, formsemestre_id)
|
|
|
|
jury = pe_jurype.JuryPE(context, semBase)
|
|
|
|
# Ajout avis LaTeX au même zip:
|
|
etudids = jury.syntheseJury.keys()
|
|
|
|
# Récupération du template latex, du footer latex et du tag identifiant les annotations relatives aux PE
|
|
# (chaines unicodes, html non quoté)
|
|
template_latex = ""
|
|
# template fourni via le formulaire Web
|
|
if avis_tmpl_file:
|
|
template_latex = avis_tmpl_file.read()
|
|
template_latex = template_latex.decode(SCO_ENCODING)
|
|
else:
|
|
# template indiqué dans préférences ScoDoc ?
|
|
template_latex = pe_avislatex.get_code_latex_from_scodoc_preference(
|
|
context, formsemestre_id, champ="pe_avis_latex_tmpl"
|
|
)
|
|
|
|
template_latex = template_latex.strip()
|
|
if not template_latex:
|
|
# pas de preference pour le template: utilise fichier du serveur
|
|
template_latex = pe_avislatex.get_templates_from_distrib("avis")
|
|
|
|
# Footer:
|
|
footer_latex = ""
|
|
# template fourni via le formulaire Web
|
|
if footer_tmpl_file:
|
|
footer_latex = footer_tmpl_file.read()
|
|
footer_latex = footer_latex.decode(SCO_ENCODING)
|
|
else:
|
|
footer_latex = pe_avislatex.get_code_latex_from_scodoc_preference(
|
|
context, formsemestre_id, champ="pe_avis_latex_footer"
|
|
)
|
|
footer_latex = footer_latex.strip()
|
|
if not footer_latex:
|
|
# pas de preference pour le footer: utilise fichier du serveur
|
|
footer_latex = pe_avislatex.get_templates_from_distrib(
|
|
"footer"
|
|
) # fallback: footer vides
|
|
|
|
tag_annotation_pe = pe_avislatex.get_code_latex_from_scodoc_preference(
|
|
context, formsemestre_id, champ="pe_tag_annotation_avis_latex"
|
|
)
|
|
|
|
# Ajout des annotations PE dans un fichier excel
|
|
sT = pe_avislatex.table_syntheseAnnotationPE(
|
|
context, jury.syntheseJury, tag_annotation_pe
|
|
)
|
|
if sT:
|
|
jury.add_file_to_zip(jury.NOM_EXPORT_ZIP + "_annotationsPE.xls", sT.excel())
|
|
|
|
latex_pages = {} # Dictionnaire de la forme nom_fichier => contenu_latex
|
|
for etudid in etudids:
|
|
[nom_fichier, contenu_latex] = pe_avislatex.get_avis_poursuite_par_etudiant(
|
|
context,
|
|
jury,
|
|
etudid,
|
|
template_latex,
|
|
tag_annotation_pe,
|
|
footer_latex,
|
|
prefs,
|
|
)
|
|
|
|
jury.add_file_to_zip(
|
|
("avis/" + nom_fichier + ".tex").encode(PE_LATEX_ENCODING),
|
|
contenu_latex.encode(PE_LATEX_ENCODING),
|
|
)
|
|
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))
|
|
|
|
# Ajoute image, LaTeX class file(s) and modeles
|
|
pe_tools.add_pe_stuff_to_zip(context, jury.zipfile, jury.NOM_EXPORT_ZIP)
|
|
data = jury.get_zipped_data()
|
|
size = len(data)
|
|
|
|
content_type = "application/zip"
|
|
if REQUEST != None:
|
|
REQUEST.RESPONSE.setHeader(
|
|
"content-disposition",
|
|
'attachement; filename="%s.zip"' % jury.NOM_EXPORT_ZIP,
|
|
)
|
|
REQUEST.RESPONSE.setHeader("content-type", content_type)
|
|
REQUEST.RESPONSE.setHeader("content-length", size)
|
|
return data
|