# -*- mode: python -*- # -*- coding: utf-8 -*- ############################################################################## # # Gestion scolarite IUT # # Copyright (c) 1999 - 2023 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 flask import send_file, request from app.scodoc.sco_exceptions import ScoValueError import app.scodoc.sco_utils as scu from app.scodoc import sco_formsemestre from app.scodoc import html_sco_header from app.scodoc import sco_preferences from app.pe import pe_tools from app.pe import pe_jurype from app.pe import pe_avislatex def _pe_view_sem_recap_form(formsemestre_id): H = [ html_sco_header.sco_header(page_title="Avis de poursuite d'études"), f"""<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" target="_blank" rel="noopener"> 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> """, ] return "\n".join(H) + html_sco_header.sco_footer() # called from the web, POST or GET def pe_view_sem_recap( formsemestre_id, avis_tmpl_file=None, footer_tmpl_file=None, ): """Génération des avis de poursuite d'étude""" if request.method == "GET": return _pe_view_sem_recap_form(formsemestre_id) prefs = sco_preferences.SemPreferences(formsemestre_id=formsemestre_id) semBase = sco_formsemestre.get_formsemestre(formsemestre_id) jury = pe_jurype.JuryPE(semBase) # Ajout avis LaTeX au même zip: etudids = list(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: try: template_latex = avis_tmpl_file.read().decode("utf-8") except UnicodeDecodeError as e: raise ScoValueError( "Données (template) invalides (caractères non UTF8 ?)" ) from e else: # template indiqué dans préférences ScoDoc ? template_latex = pe_avislatex.get_code_latex_from_scodoc_preference( 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().decode("utf-8") else: footer_latex = pe_avislatex.get_code_latex_from_scodoc_preference( 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( formsemestre_id, champ="pe_tag_annotation_avis_latex" ) # Ajout des annotations PE dans un fichier excel sT = pe_avislatex.table_syntheseAnnotationPE(jury.syntheseJury, tag_annotation_pe) if sT: jury.add_file_to_zip( jury.NOM_EXPORT_ZIP + "_annotationsPE" + scu.XLSX_SUFFIX, 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( jury, etudid, template_latex, tag_annotation_pe, footer_latex, prefs, ) 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) # Ajoute image, LaTeX class file(s) and modeles pe_tools.add_pe_stuff_to_zip(jury.zipfile, jury.NOM_EXPORT_ZIP) data = jury.get_zipped_data() return send_file( data, mimetype="application/zip", download_name=scu.sanitize_filename(jury.NOM_EXPORT_ZIP + ".zip"), as_attachment=True, )