Il faut terminer la version minimum du TP précédent avant de commencer le projet
Voici une démonstration des fonctionnalités attendues pour le
travail à réaliser http://amillet1.pythonanywhere.com/
Faire les mêmes interfaces que lors des TPs précédents mais en utilisant les dux tableaux de données de votre sujet
Le projet est à rendre sur moodle (utiliser le lien suivant), clé d’inscription: R105 pour le samedi 1 novembre
Soigner l’ergonomie des interfaces
Faire attention que les contenus des pages affichées soient valides sur W3C
Respecter les consignes suivantes (surtout typographique) :
les noms des fonctions (méthodes) dans l’application doivent porter le nom de l’opération puis le nom de la table ; utiliser du snake_case : show_nom_table add_nom_table valid_add_nom_table delete_nom_table edit_nom_table valid_edit_nom_table …
les routes doivent porter le nom de la table
puis le nom de l’opération ( en kebab-case (appellé aussi spinal case)) : /nom-table/show
/nom-table/edit /nom-table/add …
créer dans le dossier templates un dossier de vue qui porte le nom de la table (utiliser du snake_case) : les noms sont indiqués dans chaque sujet
mettre aux fichiers des vues des noms de la
forme (add_table.html edit_table.html
show_table.html)
les noms des champs input(name) doivent porter le nom des clés (attribut) des dictionnaires que vous utilisez
Le contenu des dictionnaires n’est pas modifié (pénalité importante dans le cas contraire).
Toutes les valeurs du formulaire des champs INPUT doivent être affichées dans le messages “flash” lors de la soumission du formulaire.
Utilisez uniquement les fonctions
request, render_template, redirect, flash de l’objet
Flask dans le fichier app.py
Il faut utiliser le framework CSS Bootstrap en local (dans le
dossier static) et non avec des CDN
Remplacer table par les 2 noms des tables de votre sujet
ATTENTION : on ne doit pas retrouver le mot article dans votre code
L’affichage des 2 tableaux “Python” doit être sous forme de
tableaux pour afficher/ajouter/supprimer/modifier (CRUD
back-office)
Les 2 tableaux sources en Python ne sont jamais
modifiés
Les noms des champs INPUT dans les formulaires doivent porter le nom
des clés des tableaux python
Lors de la modification d’un enregistrement, afficher le contenu de l’enregistrement (la ligne sélectionnée) dans les champs INPUT du formulaire.
ATTENTION : utiliser le code vu en cours, l’utilisation d’une IA générative pour produire un code non conforme au TP vu en cours entraîne une grosse pénalité.
Une pénalité importante sera appliquée si les règles suivantes ne sont pas respectées :
next)with et
try en python (gestion des exceptions).url_for pour gérer une
route./route/<id>
au lieu des routes avec paramètres GET /route?id=
(paramètres de requête)ajouter un “favicon” pour toutes les pages (layout)
corps des pages :

/table/show et table2/show
/table/add et un pour modifier un enregistrement sur la
route /table/edit). Créer ces 2 formulaires pour chacune
des 2 tables.
Consignes CSS (styles) :
Filtre : texte
dans votre sujet )/table/add/<id> souvent proposée par les IA
génératives)/table/add ou
/table/edit selon l’opération
Exemple de code pour afficher le contenu du filtre
Pour comparer des réels c’est un peu plus compliqué

script de test du projet :
Un premier script extrait les archives
.tar.gz et .zip, ce script recherche un
dossier et copie un autre script test_projet.sh dans le
dossier. Le script test_projet.sh se trouve au même niveau
que le fichier app.py (une erreur est signalée dans le cas
contraire).
script de test :
#!/bin/bash
clear
echo -e "\033[0;32m \n**** listes des fonctions(snake_case: show_nom_table add_nom_table valid_add_nom_table delete_nom_table edit_nom_table valid_edit_nom_table) :"
grep "def " app.py | uniq -c
echo -e "\033[0;32m \n**** listes des fichiers (snake_case: add_table.html edit_table.html show_table.html) : "
ls templates/*
echo -e "\033[0;31m \n***** listes des routes (spinal case : /nom-table/show /nom-table/edit /nom-table/add ) \033[0m"
grep "@app.route" app.py
echo -e "\033[0;32m \n**** listes des paramètres POST (CamelCase : clés des dictionnaires, sauf la clé étrangére) :"
grep "request.form.get" app.py | uniq -c
echo -e " \033[0m"
code app.py &
killall python3
flask --debug --app app run --host 0.0.0.0