Module bloc1Pack.HTML_global_formV1
Générer un fichier HTML qui contient un formulaire contenant :
- la liste des départements
- un choix binaire « PRIMAIRE » « SECONDAIRE » (voir colonne C) qui affiche en dessous la liste des établissements du département choisi par l’utilisateur et du niveau demandé (sous la forme d’un tableau comme spécifié au point précédent).
- Le tableau doit être trié selon :
- les régions (colonne AB), index 27
- puis les départements (colonne AA), index 25
- puis le code de la commune (colonne I), index 8
- puis le nom de l’établissement (colonne B) index 1
- La ligne des titres doit visuellement se démarquer
- Les autres lignes doivent être alternativement sur fond gris clair et blanc
Notes
Dans cette version, l'ensemble des lignes du tableau est généré dans le DOM puis cachées, l'affichage est ensuite géré dynamiquement via des scripts javascript mais l'ensemble des lignes reste dans le DOM.
Expand source code
#!/usr/bin/python3
#-*- coding: utf8 -*-
# @author : Sébastien LOZANO
"""Générer un fichier HTML qui contient un formulaire contenant :
* la liste des départements
* un choix binaire « PRIMAIRE » « SECONDAIRE » (voir colonne C)
qui affiche en dessous la liste des établissements du département choisi par l’utilisateur
et du niveau demandé (sous la forme d’un tableau comme spécifié au point précédent).
* Le tableau doit être trié selon :
* les régions (colonne AB), index 27
* puis les départements (colonne AA), index 25
* puis le code de la commune (colonne I), index 8
* puis le nom de l’établissement (colonne B) index 1
* La ligne des titres doit visuellement se démarquer
* Les autres lignes doivent être alternativement sur fond gris clair et blanc
`Notes`
Dans cette version, l'ensemble des lignes du tableau est généré dans le DOM puis cachées, l'affichage est ensuite
géré dynamiquement via des scripts javascript mais l'ensemble des lignes reste dans le DOM.
"""
pass
# On fait les imports nécessaires selon le contexte
if __name__ == "__main__":
import PY_functions as b1f
import HTML_constantes as html_const
else:
import bloc1Pack.PY_functions as b1f
import bloc1Pack.HTML_constantes as html_const
############################################################################################################
# Importation des bibliotheques
############################################################################################################
from operator import itemgetter # Pour la gestion du tri des listes de tuples
import os # Pour générer la documentation
############################################################################################################
# Générer un fichier HTML qui contient un formulaire contenant :
#===> la liste des départements
#===> un choix binaire « PRIMAIRE » « SECONDAIRE » (voir colonne C)
#===> qui affiche en dessous la liste des établissements du département choisi par l’utilisateur
# et du niveau demandé (sous la forme d’un tableau comme spécifié au point précédent).
#===> Le tableau doit être trié selon :
# ===> les régions (colonne AB), index 27
# ===> puis les départements (colonne AA), index 25
# ===> puis le code de la commune (colonne I), index 8
# ===> puis le nom de l’établissement (colonne B) index 1
# Le tri pourra se faire avec la fonction de tri de Python, prenant en argument
# une fonction de comparaison ad hoc.
#===> La ligne des titres doit visuellement se démarquer
#===> Les autres lignes doivent être alternativement sur fond gris clair et blanc
############################################################################################################
# On commence par trier les données comme demandé avec la fonction de tri de python
# On supprime l'entete
list_of_tuples_tab_trie = b1f.global_list_of_tuples_tab[1:]
# Puis on trie
list_of_tuples_tab_trie = sorted(list_of_tuples_tab_trie,key=itemgetter(27,25,8,1))
#Décommenter pour tester avec une partie des données seulement
#list_of_tuples_tab_trie = list_of_tuples_tab_trie[0:7000]
#list_of_tuples_tab_trie = list_of_tuples_tab_trie[0:70]
# Gestion des catégories selon la colonne 19 nature_uai_libe
# On récupère toutes les dénominations
etab_all_nature_uai_libe=[]
for elt in list_of_tuples_tab_trie:
etab_all_nature_uai_libe.append(elt[19])
# Pour compter les etablissements secondaires et primaires et vérifier qu'il n'y a pas d'oubli
sec=0
pri=0
# Pour les dénominations oubliées au cas où
etab_nature_uai_libe_oubli=[]
# Pour stocker les libellés des établissements du secondaire
etab_sec_nature_uai_libe = []
# Pour stocker les libellés des établissements du primaire
etab_pri_nature_uai_libe = []
for elt in etab_all_nature_uai_libe:
if ("lycee" in elt.lower() or "college" in elt.lower() or "professionnel" in elt.lower()):
sec+=1
etab_sec_nature_uai_libe.append(elt.lower())
elif ("ecole" in elt.lower()):
pri+=1
etab_pri_nature_uai_libe.append(elt.lower())
else:
sec+=1
etab_sec_nature_uai_libe.append(elt.lower())
etab_nature_uai_libe_oubli.append(elt.lower())
# On enlève les doublons éventuels de la liste des oublis
etab_nature_uai_libe_oubli_sans_doublons = []
for elt in etab_nature_uai_libe_oubli:
if (elt not in etab_nature_uai_libe_oubli_sans_doublons):
etab_nature_uai_libe_oubli_sans_doublons.append(elt)
if __name__ == "__main__":
############ Pour savoir le nombre d'établissements traités ############
print("""
=====================================================================================================
Sortie pour connaître le nombre d'établissements traités et leur catégorie primaire ou secondaire
=====================================================================================================
nb de ligne du tuple global : {} ; total etab : {}
nb d'etablissement catégorie secondaire : {} ; nb d'établissements catégorie primaire : {}
nb d'établissements sans catégorie primaire/sceondaire: {}
=====================================================================================================
""".format(
len(list_of_tuples_tab_trie),
len(etab_all_nature_uai_libe),
sec,
pri,
len(etab_all_nature_uai_libe)-pri-sec,
)
)
######### FIN ##############
def dataPrimaireSecondaire(chaine: str):
"""Fonction pour écrire un attribut universel de données correspondant au type d'étblissement.
Primaire/Secondaire afin de permettre le choix binaire.
`Paramètres`
* chaine : Une chaine de caractères avec le contenu de la colonne '19'.
`Sorties`
* sortie : Une chaine de caractère valant 'primaire' ou 'secondaire'.
"""
pass
# On initialise la chaine de sortie
sortie = ''
for elt in etab_sec_nature_uai_libe:
if chaine.lower() in elt:
sortie = "secondaire"
for elt in etab_pri_nature_uai_libe:
if chaine.lower() in elt:
sortie = "primaire"
return sortie
def main():
# On crée le dossier qui va accueillir les fichiers HTML si il n'existe pas
if not os.path.exists("./pagesWeb/"):
os.mkdir("./pagesWeb/")
#On ouvre en écriture le fichier html qui va recevoir le code
fichierHTML3 = open("./pagesWeb/tableauFormV1.html", "w")
# On ajoute le doctype et le head
for elt in html_const.docTypeHeadStyle:
fichierHTML3.writelines(elt)
# On ouvre le body avec un spinner pour faire patienter le temps de chargement
fichierHTML3.writelines([
"<body onload=\"hideSpinner();\">\n"
])
# On ajoute les éléments de la barre de navigation
for elt in html_const.barreDeNavigation:
fichierHTML3.writelines(elt)
# On ajoute une partie spécifique
fichierHTML3.writelines([
"""<h2>TABLEAU AVEC FORMULAIRE - VERSION 1<br>
<span id="spinnerText">
Attendez la fin du chargement de la page avant de sélectionner un département.<br>
Je sais c'est un peu long !
</span>
</h2>\n
<div id=\"spinner\"></div>
<h3>Version avec un tableau statique et des lignes initialement cachées</h3>
"""
])
# On ajoute un formulaire avec la liste des départements et le choix binaire "PRIMAIRE" "SECONDAIRE"
# pour le debug : print(list_of_tuples_tab_trie[0:2])
# On recupère la liste des départements
departements = b1f.extract_col(list_of_tuples_tab_trie,26)
#On supprime les doublons
departements_sans_doublons = []
for dep in departements :
if (dep not in departements_sans_doublons) and (dep != 'libelle_departement') :
departements_sans_doublons.append(dep)
# On range les département par ordre alphabétique
departements_sans_doublons.sort()
# pour le debug : print(departements_sans_doublons[0:2])
# début du formulaire
fichierHTML3.writelines([
"""
<form name=\"departements\" method=\"get\">
\t<select name=\"liste_dep\" id=\"liste_dep\" onchange=\"filtrerDept(this);majColor();\">
\t\t<option value=\"Selectionnez un departement ... \">Sélectionnez un département ... </option>\t
"""
])
# On crée la liste déroulante avec tous les départements
for dep in departements_sans_doublons :
fichierHTML3.writelines([
"\t\t<option value=\""+dep+"\">"+dep+"</option>\n",
])
# On crée le choix binaire "PRIMAIRE" "SECONDAIRE"
fichierHTML3.writelines([
"""
\t</select>
<input type=\"radio\" name=\"pri_sec\" id=\"primaire\" value=\"primaire\" data-prisec=\"primaire\" onchange=\"filtrerPriSec(this);majColor();\">
<label for="primaire">primaire</label>
<input type=\"radio\" name=\"pri_sec\" id=\"secondaire\" value=\"secondaire\" data-prisec=\"secondaire\" onchange=\"filtrerPriSec(this);majColor();\">
<label for="secondaire">secondaire</label>
<input type=\"button\" value=\"Tous les établissements\" onclick=\"filtrerDept(document.getElementById('liste_dep'));majColor();\">
</form>\n
<br>\n
"""
])
# On crée le tableau
fichierHTML3.writelines([
"<table>\n",
])
# On affiche les entetes
fichierHTML3.writelines(["<tr>"])
for colonnes in b1f.global_list_of_tuples_tab[0]:
fichierHTML3.writelines(["<th>{}</th>".format(colonnes)])
fichierHTML3.writelines(["</tr>\n"])
# On affiche le reste
# compteur de ligne pour la couleur du background
cpt = 1
for lignes in list_of_tuples_tab_trie:
if (cpt%2 == 0):
fichierHTML3.writelines(["<tr style=\"display: none;\" class=\"evenNthChildBackground\" data-prisec=\"{}\" data-dept=\"{}\">".format(dataPrimaireSecondaire(lignes[19]),lignes[26])])
else:
fichierHTML3.writelines(["<tr style=\"display: none;\" class=\"oddNthChildBackground\" data-prisec=\"{}\" data-dept=\"{}\">".format(dataPrimaireSecondaire(lignes[19]),lignes[26])])
cpt+=1
for colonnes in lignes:
fichierHTML3.writelines(["<td>{}</td>".format(colonnes)])
fichierHTML3.writelines(["</tr>\n"])
# On ferme le body et on écrit les script javascript
fichierHTML3.writelines([
"""
</table>\n
<script type="text/javascript">\n
// Pour gérer l'affichage du spinner et du texte pour faire patienter
function hideSpinner() {
document.getElementById('spinner').style.display = 'none';
document.getElementById('spinnerText').style.display = 'none';
};
// Pour filtrer les établissements du primaire ou du secondaire
function filtrerPriSec(elem) {
// Récupérer le data du radio primaire/secondaire
var data_prisec = elem.dataset.prisec;
// Récupérer le texte selectionné de la liste déroulante
var data_dept = document.getElementById('liste_dep').options[document.getElementById('liste_dep').selectedIndex].text;
// Récupérer l'état du radio
var radioState = false;
var prisec = document.forms[0].elements["pri_sec"];
for (var i=0;i<prisec.length;i++) {
if (prisec[i].checked == true) {
radioState = true;
};
};
// Parcourir toutes les lignes du tableau
var row = document.getElementsByTagName('tr');
// Afficher l'entete donc on commence la boucle à 1
for (var i = 1; i < row.length; i++) {
// si le select est à Sélectionnez un département ... on affiche rien
if (data_dept == "Sélectionnez un département ...") {
row[i].style.display = "none"
} else {
// Si le radio est à zero on affiche toutes les lignes du departement
if (radioState == false) {
// Cacher toutes les lignes dont le data_dept ne correspond pas
if(row[i].dataset.dept != data_dept) row[i].style.display = 'none';
// Afficher toutes les lignes dont le data-dept correspond si jamais elles étaient cachées
if(row[i].dataset.dept == data_dept) row[i].style.display = 'table-row';
} else {
// Cacher les lignes qui n'ont pas le bon data primaire/secondaire ou pas le bon data_dept
if(row[i].dataset.prisec != data_prisec || row[i].dataset.dept != data_dept) row[i].style.display = 'none';
// Afficher celles qui ont les deux bons si jamais elles avaient été cachées
if(row[i].dataset.prisec == data_prisec && row[i].dataset.dept == data_dept) row[i].style.display = 'table-row';
};
};
};
};
// Pour filtrer les établissements d'un département donné
function filtrerDept(elem) {
// Remettre le radio à zéro
var prisec = document.forms[0].elements["pri_sec"];
for (var i=0;i<prisec.length;i++) {
prisec[i].checked = false;
};
// Récupérer le texte du select
var data_dept = elem.options[elem.selectedIndex].text;
// Parcourir toutes les lignes du tableau
var row = document.getElementsByTagName('tr');
// Afficher l'entete donc on commence la boucle à 1
for (var i = 1; i < row.length; i++) {
// si le select est à Sélectionnez un département ... on affiche tout
if (data_dept == "Sélectionnez un département ...") {
row[i].style.display = "none"
} else {
// Cacher les lignes qui n'ont pas le bon data_dept
if(row[i].dataset.dept != data_dept) row[i].style.display = 'none';
// Afficher celles qui ont le bon si jamais elles avaient été cachées
if(row[i].dataset.dept == data_dept) row[i].style.display = 'table-row';
};
};
};
// Pour mettre à jour la couleur des background des lignes du tableau
function majColor() {
// on mets à jour tous les background des lignes du tableau
row = document.getElementsByTagName(\"tr\");
// Un compteur pour la parité de la ligne
cpt = 1;
for (var i =1; i<row.length; i++) {
// si la ligne est affichée on modifie le style en fonction de la partié de cpt,
if (row[i].style.display == 'table-row') {
if (cpt%2 == 0 && row[i].classList.contains("oddNthChildBackground")) {
row[i].classList.remove("oddNthChildBackground")
row[i].classList.add("evenNthChildBackground")
};
if (cpt%2 == 1 && row[i].classList.contains("evenNthChildBackground")) {
row[i].classList.remove("evenNthChildBackground")
row[i].classList.add("oddNthChildBackground")
};
cpt+=1;
};
};
};
</script>
</body>\n
</html>\n
"""
])
#On ferme le fichier
fichierHTML3.close()
if __name__ == "__main__":
main()
Functions
def dataPrimaireSecondaire(chaine: str)
-
Fonction pour écrire un attribut universel de données correspondant au type d'étblissement. Primaire/Secondaire afin de permettre le choix binaire.
Paramètres
* chaine : Une chaine de caractères avec le contenu de la colonne '19'.
Sorties
* sortie : Une chaine de caractère valant 'primaire' ou 'secondaire'.
Expand source code
def dataPrimaireSecondaire(chaine: str): """Fonction pour écrire un attribut universel de données correspondant au type d'étblissement. Primaire/Secondaire afin de permettre le choix binaire. `Paramètres` * chaine : Une chaine de caractères avec le contenu de la colonne '19'. `Sorties` * sortie : Une chaine de caractère valant 'primaire' ou 'secondaire'. """ pass # On initialise la chaine de sortie sortie = '' for elt in etab_sec_nature_uai_libe: if chaine.lower() in elt: sortie = "secondaire" for elt in etab_pri_nature_uai_libe: if chaine.lower() in elt: sortie = "primaire" return sortie
def main()
-
Expand source code
def main(): # On crée le dossier qui va accueillir les fichiers HTML si il n'existe pas if not os.path.exists("./pagesWeb/"): os.mkdir("./pagesWeb/") #On ouvre en écriture le fichier html qui va recevoir le code fichierHTML3 = open("./pagesWeb/tableauFormV1.html", "w") # On ajoute le doctype et le head for elt in html_const.docTypeHeadStyle: fichierHTML3.writelines(elt) # On ouvre le body avec un spinner pour faire patienter le temps de chargement fichierHTML3.writelines([ "<body onload=\"hideSpinner();\">\n" ]) # On ajoute les éléments de la barre de navigation for elt in html_const.barreDeNavigation: fichierHTML3.writelines(elt) # On ajoute une partie spécifique fichierHTML3.writelines([ """<h2>TABLEAU AVEC FORMULAIRE - VERSION 1<br> <span id="spinnerText"> Attendez la fin du chargement de la page avant de sélectionner un département.<br> Je sais c'est un peu long ! </span> </h2>\n <div id=\"spinner\"></div> <h3>Version avec un tableau statique et des lignes initialement cachées</h3> """ ]) # On ajoute un formulaire avec la liste des départements et le choix binaire "PRIMAIRE" "SECONDAIRE" # pour le debug : print(list_of_tuples_tab_trie[0:2]) # On recupère la liste des départements departements = b1f.extract_col(list_of_tuples_tab_trie,26) #On supprime les doublons departements_sans_doublons = [] for dep in departements : if (dep not in departements_sans_doublons) and (dep != 'libelle_departement') : departements_sans_doublons.append(dep) # On range les département par ordre alphabétique departements_sans_doublons.sort() # pour le debug : print(departements_sans_doublons[0:2]) # début du formulaire fichierHTML3.writelines([ """ <form name=\"departements\" method=\"get\"> \t<select name=\"liste_dep\" id=\"liste_dep\" onchange=\"filtrerDept(this);majColor();\"> \t\t<option value=\"Selectionnez un departement ... \">Sélectionnez un département ... </option>\t """ ]) # On crée la liste déroulante avec tous les départements for dep in departements_sans_doublons : fichierHTML3.writelines([ "\t\t<option value=\""+dep+"\">"+dep+"</option>\n", ]) # On crée le choix binaire "PRIMAIRE" "SECONDAIRE" fichierHTML3.writelines([ """ \t</select> <input type=\"radio\" name=\"pri_sec\" id=\"primaire\" value=\"primaire\" data-prisec=\"primaire\" onchange=\"filtrerPriSec(this);majColor();\"> <label for="primaire">primaire</label> <input type=\"radio\" name=\"pri_sec\" id=\"secondaire\" value=\"secondaire\" data-prisec=\"secondaire\" onchange=\"filtrerPriSec(this);majColor();\"> <label for="secondaire">secondaire</label> <input type=\"button\" value=\"Tous les établissements\" onclick=\"filtrerDept(document.getElementById('liste_dep'));majColor();\"> </form>\n <br>\n """ ]) # On crée le tableau fichierHTML3.writelines([ "<table>\n", ]) # On affiche les entetes fichierHTML3.writelines(["<tr>"]) for colonnes in b1f.global_list_of_tuples_tab[0]: fichierHTML3.writelines(["<th>{}</th>".format(colonnes)]) fichierHTML3.writelines(["</tr>\n"]) # On affiche le reste # compteur de ligne pour la couleur du background cpt = 1 for lignes in list_of_tuples_tab_trie: if (cpt%2 == 0): fichierHTML3.writelines(["<tr style=\"display: none;\" class=\"evenNthChildBackground\" data-prisec=\"{}\" data-dept=\"{}\">".format(dataPrimaireSecondaire(lignes[19]),lignes[26])]) else: fichierHTML3.writelines(["<tr style=\"display: none;\" class=\"oddNthChildBackground\" data-prisec=\"{}\" data-dept=\"{}\">".format(dataPrimaireSecondaire(lignes[19]),lignes[26])]) cpt+=1 for colonnes in lignes: fichierHTML3.writelines(["<td>{}</td>".format(colonnes)]) fichierHTML3.writelines(["</tr>\n"]) # On ferme le body et on écrit les script javascript fichierHTML3.writelines([ """ </table>\n <script type="text/javascript">\n // Pour gérer l'affichage du spinner et du texte pour faire patienter function hideSpinner() { document.getElementById('spinner').style.display = 'none'; document.getElementById('spinnerText').style.display = 'none'; }; // Pour filtrer les établissements du primaire ou du secondaire function filtrerPriSec(elem) { // Récupérer le data du radio primaire/secondaire var data_prisec = elem.dataset.prisec; // Récupérer le texte selectionné de la liste déroulante var data_dept = document.getElementById('liste_dep').options[document.getElementById('liste_dep').selectedIndex].text; // Récupérer l'état du radio var radioState = false; var prisec = document.forms[0].elements["pri_sec"]; for (var i=0;i<prisec.length;i++) { if (prisec[i].checked == true) { radioState = true; }; }; // Parcourir toutes les lignes du tableau var row = document.getElementsByTagName('tr'); // Afficher l'entete donc on commence la boucle à 1 for (var i = 1; i < row.length; i++) { // si le select est à Sélectionnez un département ... on affiche rien if (data_dept == "Sélectionnez un département ...") { row[i].style.display = "none" } else { // Si le radio est à zero on affiche toutes les lignes du departement if (radioState == false) { // Cacher toutes les lignes dont le data_dept ne correspond pas if(row[i].dataset.dept != data_dept) row[i].style.display = 'none'; // Afficher toutes les lignes dont le data-dept correspond si jamais elles étaient cachées if(row[i].dataset.dept == data_dept) row[i].style.display = 'table-row'; } else { // Cacher les lignes qui n'ont pas le bon data primaire/secondaire ou pas le bon data_dept if(row[i].dataset.prisec != data_prisec || row[i].dataset.dept != data_dept) row[i].style.display = 'none'; // Afficher celles qui ont les deux bons si jamais elles avaient été cachées if(row[i].dataset.prisec == data_prisec && row[i].dataset.dept == data_dept) row[i].style.display = 'table-row'; }; }; }; }; // Pour filtrer les établissements d'un département donné function filtrerDept(elem) { // Remettre le radio à zéro var prisec = document.forms[0].elements["pri_sec"]; for (var i=0;i<prisec.length;i++) { prisec[i].checked = false; }; // Récupérer le texte du select var data_dept = elem.options[elem.selectedIndex].text; // Parcourir toutes les lignes du tableau var row = document.getElementsByTagName('tr'); // Afficher l'entete donc on commence la boucle à 1 for (var i = 1; i < row.length; i++) { // si le select est à Sélectionnez un département ... on affiche tout if (data_dept == "Sélectionnez un département ...") { row[i].style.display = "none" } else { // Cacher les lignes qui n'ont pas le bon data_dept if(row[i].dataset.dept != data_dept) row[i].style.display = 'none'; // Afficher celles qui ont le bon si jamais elles avaient été cachées if(row[i].dataset.dept == data_dept) row[i].style.display = 'table-row'; }; }; }; // Pour mettre à jour la couleur des background des lignes du tableau function majColor() { // on mets à jour tous les background des lignes du tableau row = document.getElementsByTagName(\"tr\"); // Un compteur pour la parité de la ligne cpt = 1; for (var i =1; i<row.length; i++) { // si la ligne est affichée on modifie le style en fonction de la partié de cpt, if (row[i].style.display == 'table-row') { if (cpt%2 == 0 && row[i].classList.contains("oddNthChildBackground")) { row[i].classList.remove("oddNthChildBackground") row[i].classList.add("evenNthChildBackground") }; if (cpt%2 == 1 && row[i].classList.contains("evenNthChildBackground")) { row[i].classList.remove("evenNthChildBackground") row[i].classList.add("oddNthChildBackground") }; cpt+=1; }; }; }; </script> </body>\n </html>\n """ ]) #On ferme le fichier fichierHTML3.close()