# -*- mode: python -*- # -*- coding: utf-8 -*- ############################################################################## # # Gestion scolarite IUT # # Copyright (c) 1999 - 2024 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 # ############################################################################## """Rapports sur lycées d'origine des étudiants d'un semestre. - statistiques decisions - suivi cohortes """ from operator import itemgetter from flask import url_for, g, request import app from app.scodoc import ( html_sco_header, sco_formsemestre, sco_groups_view, sco_preferences, sco_report, sco_etud, ) from app.models import FormSemestre from app.scodoc.gen_tables import GenTable import app.scodoc.sco_utils as scu import sco_version def formsemestre_table_etuds_lycees( formsemestre: FormSemestre, groups_infos, group_lycees=True, only_primo=False ): """Récupère liste d'etudiants avec etat et decision.""" sem = sco_formsemestre.get_formsemestre(formsemestre.id) etuds = sco_report.tsp_etud_list( formsemestre.id, groups_infos=groups_infos, only_primo=only_primo )[0] if only_primo: primostr = "primo-entrants du " else: primostr = "du " title = "Lycées des étudiants %ssemestre " % primostr + sem["titreannee"] return _table_etuds_lycees( etuds, group_lycees, title, sco_preferences.SemPreferences(formsemestre.id), ) def scodoc_table_etuds_lycees(fmt="html"): """Table avec _tous_ les étudiants des semestres non verrouillés de _tous_ les départements. """ cur_dept = g.scodoc_dept semdepts = sco_formsemestre.scodoc_get_all_unlocked_sems() etuds = [] try: for sem, dept in semdepts: app.set_sco_dept(dept.acronym) etuds += sco_report.tsp_etud_list(sem["formsemestre_id"])[0] finally: app.set_sco_dept(cur_dept) tab, etuds_by_lycee = _table_etuds_lycees( etuds, False, "Lycées de TOUS les étudiants", sco_preferences.SemPreferences(), no_links=True, ) tab.base_url = request.base_url t = tab.make_page(fmt=fmt, with_html_headers=False) if fmt != "html": return t H = [ html_sco_header.sco_header( page_title=tab.page_title, init_google_maps=True, init_qtip=True, javascripts=["js/etud_info.js", "js/map_lycees.js"], ), """<h2 class="formsemestre">Lycées d'origine des %d étudiants (%d semestres)</h2>""" % (len(etuds), len(semdepts)), t, """<div id="lyc_map_canvas"></div> """, js_coords_lycees(etuds_by_lycee), html_sco_header.sco_footer(), ] return "\n".join(H) def _table_etuds_lycees(etuds, group_lycees, title, preferences, no_links=False): etuds = [sco_etud.etud_add_lycee_infos(e) for e in etuds] etuds_by_lycee = scu.group_by_key(etuds, "codelycee") # if group_lycees: L = [etuds_by_lycee[codelycee][0] for codelycee in etuds_by_lycee] for l in L: l["nbetuds"] = len(etuds_by_lycee[l["codelycee"]]) L.sort(key=itemgetter("codepostallycee", "nomlycee")) columns_ids = ( "nbetuds", "codelycee", "codepostallycee", "villelycee", "nomlycee", ) bottom_titles = { "nbetuds": len(etuds), "nomlycee": "%d lycées" % len([x for x in etuds_by_lycee if etuds_by_lycee[x][0]["codelycee"]]), } else: L = etuds columns_ids = ( "civilite_str", "nom", "prenom", "codelycee", "codepostallycee", "villelycee", "nomlycee", ) bottom_titles = None if not no_links: for etud in etuds: fiche_url = url_for( "scolar.fiche_etud", scodoc_dept=g.scodoc_dept, etudid=etud["etudid"], ) etud["_nom_target"] = fiche_url etud["_prenom_target"] = fiche_url etud["_nom_td_attrs"] = 'id="%s" class="etudinfo"' % (etud["etudid"]) tab = GenTable( columns_ids=columns_ids, rows=L, titles={ "nbetuds": "Nb d'étudiants", "civilite_str": "", "nom": "Nom", "prenom": "Prénom", "etudid": "etudid", "codelycee": "Code Lycée", "codepostallycee": "Code postal", "nomlycee": "Lycée", "villelycee": "Commune", }, origin="Généré par %s le " % sco_version.SCONAME + scu.timedate_human_repr() + "", caption=title, page_title="Carte lycées d'origine", html_sortable=True, html_class="table_leftalign table_listegroupe", bottom_titles=bottom_titles, preferences=preferences, table_id="table_etuds_lycees", ) return tab, etuds_by_lycee def formsemestre_etuds_lycees( formsemestre_id, group_ids: list[int] = None, # si indiqué, ne prend que ces groupes fmt="html", only_primo=False, no_grouping=False, ): """Table des lycées d'origine""" formsemestre = FormSemestre.get_formsemestre(formsemestre_id) groups_infos = sco_groups_view.DisplayedGroupsInfos( group_ids, formsemestre_id=formsemestre.id, select_all_when_unspecified=True, ) tab, etuds_by_lycee = formsemestre_table_etuds_lycees( formsemestre, groups_infos, only_primo=only_primo, group_lycees=not no_grouping ) tab.base_url = "%s?formsemestre_id=%s" % (request.base_url, formsemestre_id) if only_primo: tab.base_url += "&only_primo=1" if no_grouping: tab.base_url += "&no_grouping=1" t = tab.make_page(fmt=fmt, with_html_headers=False) if fmt != "html": return t F = [ sco_report.tsp_form_primo_group( only_primo, no_grouping, formsemestre_id, fmt, groups_infos=groups_infos ) ] H = [ html_sco_header.sco_header( page_title=tab.page_title, init_google_maps=True, init_qtip=True, cssstyles=sco_groups_view.CSSSTYLES, javascripts=sco_groups_view.JAVASCRIPTS + ["js/etud_info.js", "js/map_lycees.js"], ), """<h2 class="formsemestre">Lycées d'origine des étudiants</h2>""", "\n".join(F), t, """<div id="lyc_map_canvas"></div> """, js_coords_lycees(etuds_by_lycee), html_sco_header.sco_footer(), ] return "\n".join(H) def qjs(txt): # quote for JS return txt.replace("'", r"\'").replace('"', r"\"") def js_coords_lycees(etuds_by_lycee): """Formatte liste des lycees en JSON pour Google Map""" L = [] for codelycee in etuds_by_lycee: if codelycee: lyc = etuds_by_lycee[codelycee][0] if not lyc.get("positionlycee", False): continue listeetuds = "<br>%d étudiants: " % len( etuds_by_lycee[codelycee] ) + ", ".join( [ '<a class="discretelink" href="%s" title="">%s</a>' % ( url_for( "scolar.fiche_etud", scodoc_dept=g.scodoc_dept, etudid=e["etudid"], ), qjs(e["nomprenom"]), ) for e in etuds_by_lycee[codelycee] ] ) pos = qjs(lyc["positionlycee"]) legend = "%s %s" % (qjs("%(nomlycee)s (%(villelycee)s)" % lyc), listeetuds) L.append( "{'position' : '%s', 'name' : '%s', 'number' : %d }" % (pos, legend, len(etuds_by_lycee[codelycee])) ) return """<script type="text/javascript"> var lycees_coords = [%s]; </script>""" % ",".join( L )