예제 #1
0
    def edit_genre_data(self, valeur_id_dictionnaire):
        try:
            print(valeur_id_dictionnaire)
            # OM 2020.04.07 C'EST LA QUE VOUS ALLEZ DEVOIR PLACER VOTRE PROPRE LOGIQUE MySql
            # Commande MySql pour afficher le genre sélectionné dans le tableau dans le formulaire HTML
            str_sql_id_genre = "SELECT id_genre, intitule_genre FROM t_genres WHERE id_genre = %(value_id_genre)s"

            # Du fait de l'utilisation des "context managers" on accède au curseur grâce au "with".
            # la subtilité consiste à avoir une méthode "mabd_execute" dans la classe "MaBaseDeDonnee"
            # ainsi quand elle aura terminé l'insertion des données le destructeur de la classe "MaBaseDeDonnee"
            # sera interprété, ainsi on fera automatiquement un commit
            with MaBaseDeDonnee().connexion_bd as mconn_bd:
                with mconn_bd as mc_cur:
                    mc_cur.execute(str_sql_id_genre, valeur_id_dictionnaire)
                    data_one = mc_cur.fetchall()
                    print("valeur_id_dictionnaire...", data_one)
                    return data_one

        except Exception as erreur:
            # OM 2020.03.01 Message en cas d'échec du bon déroulement des commandes ci-dessus.
            print(
                f"Problème edit_genre_data Data Gestions Genres numéro de l'erreur : {erreur}"
            )
            # flash(f"Flash. Problèmes Data Gestions Genres numéro de l'erreur : {erreur}", "danger")
            # OM 2020.04.09 On dérive "Exception" par le "@obj_mon_application.errorhandler(404)" fichier "run_mon_app.py"
            # Ainsi on peut avoir un message d'erreur personnalisé.
            raise Exception(
                "Raise exception... Problème edit_genre_data d'un genre Data Gestions Genres {erreur}"
            )
예제 #2
0
    def delete_select_genre_data (self, valeur_delete_dictionnaire):
        try:
            print(valeur_delete_dictionnaire)
            # OM 2019.04.02 Commande MySql pour la MODIFICATION de la valeur "CLAVIOTTEE" dans le champ "nameEditIntituleGenreHTML" du form HTML "GenresEdit.html"
            # le "%s" permet d'éviter des injections SQL "simples"
            # <td><input type = "text" name = "nameEditIntituleGenreHTML" value="{{ row.intitule_genre }}"/></td>

            # OM 2020.04.07 C'EST LA QUE VOUS ALLEZ DEVOIR PLACER VOTRE PROPRE LOGIQUE MySql
            # Commande MySql pour afficher le genre sélectionné dans le tableau dans le formulaire HTML
            str_sql_select_id_genre = "SELECT id_material, Material FROM t_material WHERE id_material = %(value_id_material)s"

            # Du fait de l'utilisation des "context managers" on accède au curseur grâce au "with".
            # la subtilité consiste à avoir une méthode "mabd_execute" dans la classe "MaBaseDeDonnee"
            # ainsi quand elle aura terminé l'insertion des données le destructeur de la classe "MaBaseDeDonnee"
            # sera interprété, ainsi on fera automatiquement un commit
            with MaBaseDeDonnee().connexion_bd as mconn_bd:
                with mconn_bd as mc_cur:
                    mc_cur.execute(str_sql_select_id_genre, valeur_delete_dictionnaire)
                    data_one = mc_cur.fetchall()
                    print("valeur_id_dictionnaire...", data_one)
                    return data_one

        except (Exception,
                pymysql.err.OperationalError,
                pymysql.ProgrammingError,
                pymysql.InternalError,
                pymysql.IntegrityError,
                TypeError) as erreur:
            # DEBUG bon marché : Pour afficher un message dans la console.
            print(f"Problème delete_select_genre_data Gestions Genres numéro de l'erreur : {erreur}")
            # C'est une erreur à signaler à l'utilisateur de cette application WEB.
            flash(f"Flash. Problème delete_select_genre_data numéro de l'erreur : {erreur}", "danger")
            raise Exception(
                "Raise exception... Problème delete_select_genre_data d\'un genre Data Gestions Genres {erreur}")
    def add_film(self, valeurs_insertion_dictionnaire):
        try:
            # # Définitions d'un dictionnaire pour passer les valeurs en paramètres de façon un "peu" sécurisée dans la BD
            # valeurs_insertion_dictionnaire = {'value_nom_film': valeur_ins_1, 'value_duree_film': valeur_ins_2,
            #                                   'date_sortie_film': valeur_ins_3}
            # Rssure la personne qui dévelloppe que les valeurs à insérer sont bien à disposition.
            print(valeurs_insertion_dictionnaire)
            str_sql_insert = "INSERT INTO t_films (id_film, nom_film, duree_film, description_film, " \
                             "cover_link_film, date_sortie_film) VALUES (NULL, %(value_nom_film)s, %(value_duree_film)s, " \
                             "%(value_description_film)s, %(value_cover_link_film)s, %(value_date_sortie_film)s)"
            with MaBaseDeDonnee() as ma_bd_curseur:
                # OM Méthode "execute" définie simplement pour raccourcir la ligne de code
                # ligne de code normale : ma_bd_moi.connexion_bd.cursor(str_sql_insert, valeurs_insertion_dictionnaire)
                ma_bd_curseur.execute(str_sql_insert, valeurs_insertion_dictionnaire)

        except Exception as erreur:
            # OM 2020.04.09 DIFFERENTS MOYENS D'INFORMER EN CAS D'ERREURS.
            # Message dans la console en cas d'échec du bon déroulement des commandes ci-dessus.
            print("Data Gestions Films ERREUR: {0}".format(erreur))
            print(f"Print console ... Data Gestions Films, numéro de l'erreur : {erreur}")
            # Petits messages "flash", échange entre Python et Jinja dans une page en HTML
            flash(f"Flash ... Data Gestions Films, numéro de l'erreur : {erreur}")
            # raise, permet de "lever" une exception et de personnaliser la page d'erreur
            # voir fichier "run_mon_app.py"

            print("erreur args.. ",erreur.args)
            code, msg = erreur.args
            print(" codes d'erreurs ---> ", error_codes.get(code, msg))
            # OM 2020.04.09 On dérive "Exception" par le "@obj_mon_application.errorhandler(404)" fichier "run_mon_app.py"
            # Ainsi on peut avoir un message d'erreur personnalisé.
            raise Exception(f"Raise exception... Data Gestions Films {erreur}")
예제 #4
0
    def update_genre_data (self, valeur_update_dictionnaire):
        try:
            print(valeur_update_dictionnaire)
            # OM 2019.04.02 Commande MySql pour la MODIFICATION de la valeur "CLAVIOTTEE" dans le champ "nameEditIntituleGenreHTML" du form HTML "GenresEdit.html"
            # le "%s" permet d'éviter des injections SQL "simples"
            # <td><input type = "text" name = "nameEditIntituleGenreHTML" value="{{ row.intitule_genre }}"/></td>
            str_sql_update_intitulegenre = "UPDATE t_material SET material = %(value_material)s WHERE id_material = %(value_id_material)s"

            # Du fait de l'utilisation des "context managers" on accède au curseur grâce au "with".
            # la subtilité consiste à avoir une méthode "mabd_execute" dans la classe "MaBaseDeDonnee"
            # ainsi quand elle aura terminé l'insertion des données le destructeur de la classe "MaBaseDeDonnee"
            # sera interprété, ainsi on fera automatiquement un commit
            with MaBaseDeDonnee().connexion_bd as mconn_bd:
                with mconn_bd as mc_cur:
                    mc_cur.execute(str_sql_update_intitulegenre, valeur_update_dictionnaire)

        except (Exception,
                pymysql.err.OperationalError,
                pymysql.ProgrammingError,
                pymysql.InternalError,
                pymysql.IntegrityError,
                TypeError) as erreur:
            # OM 2020.03.01 Message en cas d'échec du bon déroulement des commandes ci-dessus.
            print(f"Problème update_genre_data Data Gestions Genres numéro de l'erreur : {erreur}")
            # flash(f"Flash. Problèmes Data Gestions Genres numéro de l'erreur : {erreur}", "danger")
            # raise Exception('Raise exception... Problème update_genre_data d\'un genre Data Gestions Genres {}'.format(str(erreur)))
            if erreur.args[0] == 1062:
                flash(f"Flash. Cette valeur existe déjà : {erreur}", "danger")
                # Deux façons de communiquer une erreur causée par l'insertion d'une valeur à double.
                flash(f"'Doublon !!! Introduire une valeur différente", "warning")
                # Message en cas d'échec du bon déroulement des commandes ci-dessus.
                print(f"Problème update_genre_data Data Gestions Genres numéro de l'erreur : {erreur}")

                raise Exception("Raise exception... Problème update_genre_data d'un genre DataGestionsGenres {erreur}")
    def genres_films_delete(self, valeurs_insertion_dictionnaire):
        try:
            print(valeurs_insertion_dictionnaire)
            # OM 2020.04.07 C'EST LA QUE VOUS ALLEZ DEVOIR PLACER VOTRE PROPRE LOGIQUE MySql
            # Effacer une (des) association(s) existantes entre "id_film" et "id_genre" dans la "t_genre_film"
            strsql_delete_genre_film = """DELETE FROM t_user_material WHERE fk_material = %(value_fk_material)s AND fk_user = %(value_fk_user)s"""

            # Du fait de l'utilisation des "context managers" on accède au curseur grâce au "with".
            # la subtilité consiste à avoir une méthode "mabd_execute" dans la classe "MaBaseDeDonnee"
            # ainsi quand elle aura terminé l'insertion des données le destructeur de la classe "MaBaseDeDonnee"
            # sera interprété, ainsi on fera automatiquement un commit
            with MaBaseDeDonnee() as mconn_bd:
                mconn_bd.mabd_execute(strsql_delete_genre_film,
                                      valeurs_insertion_dictionnaire)
        except (Exception, pymysql.err.OperationalError,
                pymysql.ProgrammingError, pymysql.InternalError,
                pymysql.IntegrityError, TypeError) as erreur:
            # DEBUG bon marché : Pour afficher un message dans la console.
            print(
                f"Problème genres_films_delete Gestions Genres films numéro de l'erreur : {erreur}"
            )
            # C'est une erreur à signaler à l'utilisateur de cette application WEB.
            flash(
                f"Flash. Problème genres_films_delete Gestions Genres films  numéro de l'erreur : {erreur}",
                "danger")
            raise Exception(
                "Raise exception... Problème genres_films_delete Gestions Genres films  {erreur}"
            )
 def films_afficher_data(self):
     try:
         # OM 2020.04.07 C'EST LA QUE VOUS ALLEZ DEVOIR PLACER VOTRE PROPRE LOGIQUE MySql
         # la commande MySql classique est "SELECT * FROM t_films"
         # Pour "lever"(raise) une erreur s'il y a des erreurs sur les noms d'attributs dans la table
         # donc, je précise les champs à afficher
         strsql_films_afficher = """SELECT id_film, nom_film, duree_film, description_film,
                                     cover_link_film, date_sortie_film FROM t_films"""
         # Du fait de l'utilisation des "context managers" on accède au curseur grâce au "with".
         with MaBaseDeDonnee().connexion_bd.cursor() as mc_afficher:
             # Envoi de la commande MySql
             mc_afficher.execute(strsql_films_afficher)
             # Récupère les données de la requête.
             data_films = mc_afficher.fetchall()
             # Affichage dans la console
             print("data_films ", data_films, " Type : ", type(data_films))
             # Retourne les données du "SELECT"
             return data_films
     except pymysql.Error as erreur:
         print(f"DGF gad pymysql errror {erreur.args[0]} {erreur.args[1]}")
         raise  MaBdErreurPyMySl(f"DGG fad pymysql errror {msg_erreurs['ErreurPyMySql']['message']} {erreur.args[0]} {erreur.args[1]}")
     except Exception as erreur:
         print(f"DGF gad Exception {erreur.args}")
         raise MaBdErreurConnexion(f"DGG fad Exception {msg_erreurs['ErreurConnexionBD']['message']} {erreur.args}")
     except pymysql.err.IntegrityError as erreur:
         # OM 2020.04.09 On dérive "pymysql.err.IntegrityError" dans "MaBdErreurDoublon" fichier "erreurs.py"
         # Ainsi on peut avoir un message d'erreur personnalisé.
         # raise MaBdErreurDoublon(f"{msg_erreurs['ErreurDoublonValue']['message']} et son status {msg_erreurs['ErreurDoublonValue']['status']}")
         raise MaBdErreurConnexion(f"DGF fad pei {msg_erreurs['ErreurConnexionBD']['message']} {erreur.args[1]}")
예제 #7
0
    def UpdatePersoMail(self, idpersoEmail, id_personne, id_email):
        try:

            str_sql_update_intitulegenre = "UPDATE t_pers_mails SET fk_Pers = " + id_personne + ", fk_Mails =  " + id_email + " WHERE id_Pers_Mail = " + idpersoEmail

            with MaBaseDeDonnee().connexion_bd as mconn_bd:
                with mconn_bd as mc_cur:
                    mc_cur.execute(str_sql_update_intitulegenre)

        except (Exception, pymysql.err.OperationalError,
                pymysql.ProgrammingError, pymysql.InternalError,
                pymysql.IntegrityError, TypeError) as erreur:
            # OM 2020.03.01 Message en cas d'échec du bon déroulement des commandes ci-dessus.
            print(
                f"Problème update_genre_data Data Gestions Genres numéro de l'erreur : {erreur}"
            )
            # flash(f"Flash. Problèmes Data Gestions Genres numéro de l'erreur : {erreur}", "danger")
            # raise Exception('Raise exception... Problème update_genre_data d\'un genre Data Gestions Genres {}'.format(str(erreur)))
            if erreur.args[0] == 1062:
                flash(f"Flash. Cette valeur existe déjà : {erreur}", "warning")
                # Deux façons de communiquer une erreur causée par l'insertion d'une valeur à double.
                flash(f"Doublon !!! Introduire une valeur différente",
                      "warning")
                # Message en cas d'échec du bon déroulement des commandes ci-dessus.
                print(
                    f"Problème update_genre_data Data Gestions Genres numéro de l'erreur : {erreur}"
                )

                raise Exception(
                    "Raise exception... Problème update_genre_data d'un genre DataGestionsGenres {erreur}"
                )
예제 #8
0
 def genres_afficher_data(self):
     try:
         # OM 2020.04.07 C'EST LA QUE VOUS ALLEZ DEVOIR PLACER VOTRE PROPRE LOGIQUE MySql
         # la commande MySql classique est "SELECT * FROM t_genres"
         # Pour "lever"(raise) une erreur s'il y a des erreurs sur les noms d'attributs dans la table
         # donc, je précise les champs à afficher
         strsql_genres_afficher = """SELECT t_personnes.Nom_Pers, t_personnes.Prenom_Pers,t_mails.Nom_Mail FROM `t_pers_mails` inner join t_personnes on t_personnes.id_Pers = t_pers_mails.fk_Pers inner join t_mails on t_mails.id_Mails = t_pers_mails.fk_Mails ORDER BY t_personnes.Nom_Pers """
         # Du fait de l'utilisation des "context managers" on accède au curseur grâce au "with".
         with MaBaseDeDonnee().connexion_bd.cursor() as mc_afficher:
             # Envoi de la commande MySql
             mc_afficher.execute(strsql_genres_afficher)
             # Récupère les données de la requête.
             data_genres = mc_afficher.fetchall()
             # Affichage dans la console
             print("data_genres ", data_genres, " Type : ",
                   type(data_genres))
             # Retourne les données du "SELECT"
             return data_genres
     except pymysql.Error as erreur:
         print(f"DGG gad pymysql errror {erreur.args[0]} {erreur.args[1]}")
         raise MaBdErreurPyMySl(
             f"DGG gad pymysql errror {msg_erreurs['ErreurPyMySql']['message']} {erreur.args[0]} {erreur.args[1]}"
         )
     except Exception as erreur:
         print(f"DGG gad Exception {erreur.args}")
         raise MaBdErreurConnexion(
             f"DGG gad Exception {msg_erreurs['ErreurConnexionBD']['message']} {erreur.args}"
         )
     except pymysql.err.IntegrityError as erreur:
         # OM 2020.04.09 On dérive "pymysql.err.IntegrityError" dans le fichier "erreurs.py"
         # Ainsi on peut avoir un message d'erreur personnalisé.
         raise MaBdErreurConnexion(
             f"DGG gad pei {msg_erreurs['ErreurConnexionBD']['message']} {erreur.args[1]}"
         )
    def genres_films_afficher_data_concat(self, id_film_selected):
        print("id_film_selected  ", id_film_selected)
        try:
            # OM 2020.04.07 C'EST LA QUE VOUS ALLEZ DEVOIR PLACER VOTRE PROPRE LOGIQUE MySql
            # la commande MySql classique est "SELECT * FROM t_genres"
            # Pour "lever"(raise) une erreur s'il y a des erreurs sur les noms d'attributs dans la table
            # donc, je précise les champs à afficher

            strsql_genres_films_afficher_data_concat = """SELECT id_user, Nom, Prenom, UserNom,
                                                            GROUP_CONCAT(material) as UserMaterial FROM t_user_material AS T1
                                                            RIGHT JOIN t_user AS T2 ON T2.id_user = T1.fk_user
                                                            LEFT JOIN t_material AS T3 ON T3.id_material = T1.fk_material
                                                            GROUP BY id_user"""

            # Du fait de l'utilisation des "context managers" on accède au curseur grâce au "with".
            with MaBaseDeDonnee().connexion_bd.cursor() as mc_afficher:
                # le paramètre 0 permet d'afficher tous les films
                # Sinon le paramètre représente la valeur de l'id du film
                if id_film_selected == 0:
                    mc_afficher.execute(
                        strsql_genres_films_afficher_data_concat)
                else:
                    # Constitution d'un dictionnaire pour associer l'id du film sélectionné avec un nom de variable
                    valeur_id_film_selected_dictionnaire = {
                        "value_id_user_selected": id_film_selected
                    }
                    strsql_genres_films_afficher_data_concat += """ HAVING id_user= %(value_id_user_selected)s"""
                    # Envoi de la commande MySql
                    mc_afficher.execute(
                        strsql_genres_films_afficher_data_concat,
                        valeur_id_film_selected_dictionnaire)

                # Récupère les données de la requête.
                data_genres_films_afficher_concat = mc_afficher.fetchall()
                # Affichage dans la console
                print("dggf data_genres_films_afficher_concat ",
                      data_genres_films_afficher_concat, " Type : ",
                      type(data_genres_films_afficher_concat))

                # Retourne les données du "SELECT"
                return data_genres_films_afficher_concat

        except pymysql.Error as erreur:
            print(
                f"DGGF gfadc pymysql errror {erreur.args[0]} {erreur.args[1]}")
            raise MaBdErreurPyMySl(
                f"DGG gad pymysql errror {msg_erreurs['ErreurPyMySql']['message']} {erreur.args[0]} {erreur.args[1]}"
            )
        except Exception as erreur:
            print(f"DGGF gfadc Exception {erreur.args}")
            raise MaBdErreurConnexion(
                f"DGG gfadc Exception {msg_erreurs['ErreurConnexionBD']['message']} {erreur.args}"
            )
        except pymysql.err.IntegrityError as erreur:
            # OM 2020.04.09 On dérive "pymysql.err.IntegrityError" dans le fichier "erreurs.py"
            # Ainsi on peut avoir un message d'erreur personnalisé.
            raise MaBdErreurConnexion(
                f"DGGF gfadc pei {msg_erreurs['ErreurConnexionBD']['message']} {erreur.args[1]}"
            )
    def genres_afficher_data(self, valeur_order_by, id_genre_sel):
        try:
            print("valeur_order_by ", valeur_order_by, type(valeur_order_by))

            # Du fait de l'utilisation des "context managers" on accède au curseur grâce au "with".
            with MaBaseDeDonnee().connexion_bd.cursor() as mc_afficher:
                # Afficher soit la liste des genres dans l'ordre inverse ou simplement le genre sélectionné
                # par l'action edit
                if valeur_order_by == "ASC" and id_genre_sel == 0:
                    strsql_genres_afficher = """SELECT id_Pers, Nom_Pers, Prenom_Pers, RaisonSociale_Pers, NomRespo_Pers, PrenomRespo_Pers 
                                        FROM `t_personnes`"""
                    mc_afficher.execute(strsql_genres_afficher)
                elif valeur_order_by == "ASC":
                    # OM 2020.04.07 C'EST LA QUE VOUS ALLEZ DEVOIR PLACER VOTRE PROPRE LOGIQUE MySql
                    # la commande MySql classique est "SELECT * FROM t_genres"
                    # Pour "lever"(raise) une erreur s'il y a des erreurs sur les noms d'attributs dans la table
                    # donc, je précise les champs à afficher
                    # Constitution d'un dictionnaire pour associer l'id du genre sélectionné avec un nom de variable
                    valeur_id_genre_selected_dictionnaire = {
                        "value_id_genre_selected": id_genre_sel
                    }
                    strsql_genres_afficher = """SELECT id_Pers, Nom_Pers, Prenom_Pers, RaisonSociale_Pers, NomRespo_Pers, PrenomRespo_Pers 
                                        FROM `t_personnes`  WHERE id_Pers = %(value_id_genre_selected)s"""
                    # Envoi de la commande MySql
                    mc_afficher.execute(strsql_genres_afficher,
                                        valeur_id_genre_selected_dictionnaire)
                else:
                    strsql_genres_afficher = """SELECT id_Pers, Nom_Pers, Prenom_Pers, RaisonSociale_Pers, NomRespo_Pers, PrenomRespo_Pers 
                                        FROM `t_personnes` ORDER BY id_Pers DESC"""
                    # Envoi de la commande MySql
                    mc_afficher.execute(strsql_genres_afficher)
                # Récupère les données de la requête.
                data_genres = mc_afficher.fetchall()
                # Affichage dans la console
                print("data_genres ", data_genres, " Type : ",
                      type(data_genres))
                # Retourne les données du "SELECT"
                return data_genres
        except pymysql.Error as erreur:
            print(f"DGG gad pymysql errror {erreur.args[0]} {erreur.args[1]}")
            raise MaBdErreurPyMySl(
                f"DGG gad pymysql errror {msg_erreurs['ErreurPyMySql']['message']} {erreur.args[0]} {erreur.args[1]}"
            )
        except Exception as erreur:
            print(f"DGG gad Exception {erreur.args}")
            raise MaBdErreurConnexion(
                f"DGG gad Exception {msg_erreurs['ErreurConnexionBD']['message']} {erreur.args}"
            )
        except pymysql.err.IntegrityError as erreur:
            # OM 2020.04.09 On dérive "pymysql.err.IntegrityError" dans le fichier "erreurs.py"
            # Ainsi on peut avoir un message d'erreur personnalisé.
            raise MaBdErreurConnexion(
                f"DGG gad pei {msg_erreurs['ErreurConnexionBD']['message']} {erreur.args[1]}"
            )
    def __init__(self):
        try:
            print("dans le try de gestions films")
            # OM 2020.04.11 La connexion à la base de données est-elle active ?
            # Renvoie une erreur si la connexion est perdue.
            MaBaseDeDonnee().connexion_bd.ping(False)
        except Exception as erreur:
            flash("Dans Gestion films ...terrible erreur, il faut connecter une base de donnée", "Danger")
            # DEBUG bon marché : Pour afficher un message dans la console.
            print(f"Exception grave Classe constructeur GestionGenres {erreur.args[0]}")
            raise MaBdErreurConnexion(f"{msg_erreurs['ErreurConnexionBD']['message']} {erreur.args[0]}")

        print("Classe constructeur GestionFilms ")
예제 #12
0
    def add_genre_data (self, valeurs_insertion_dictionnaire):
        try:
            print(valeurs_insertion_dictionnaire)
            # OM 2020.04.07 C'EST LA QUE VOUS ALLEZ DEVOIR PLACER VOTRE PROPRE LOGIQUE MySql
            strsql_insert_genre = """INSERT INTO t_material (id_material, material) VALUES (NULL,%(value_material)s)"""
            # Du fait de l'utilisation des "context managers" on accède au curseur grâce au "with".
            # la subtilité consiste à avoir une méthode "mabd_execute" dans la classe "MaBaseDeDonnee"
            # ainsi quand elle aura terminé l'insertion des données le destructeur de la classe "MaBaseDeDonnee"
            # sera interprété, ainsi on fera automatiquement un commit
            with MaBaseDeDonnee() as mconn_bd:
                mconn_bd.mabd_execute(strsql_insert_genre, valeurs_insertion_dictionnaire)


        except pymysql.err.IntegrityError as erreur:
            # OM 2020.04.09 On dérive "pymysql.err.IntegrityError" dans "MaBdErreurDoublon" fichier "erreurs.py"
            # Ainsi on peut avoir un message d'erreur personnalisé.
            raise MaBdErreurDoublon(
                f"DGG pei erreur doublon {msg_erreurs['ErreurDoublonValue']['message']} et son status {msg_erreurs['ErreurDoublonValue']['status']}")
    def delete_genre_data(self, valeur_delete_dictionnaire):
        try:
            print(valeur_delete_dictionnaire)
            # OM 2019.04.02 Commande MySql pour EFFACER la valeur sélectionnée par le "bouton" du form HTML "GenresEdit.html"
            # le "%s" permet d'éviter des injections SQL "simples"
            # <td><input type = "text" name = "nameEditIntituleGenreHTML" value="{{ row.intitule_genre }}"/></td>
            str_sql_delete_intitulegenre = "DELETE FROM t_material WHERE id_material = %(value_id_material)s"

            # Du fait de l'utilisation des "context managers" on accède au curseur grâce au "with".
            # la subtilité consiste à avoir une méthode "mabd_execute" dans la classe "MaBaseDeDonnee"
            # ainsi quand elle aura terminé l'insertion des données le destructeur de la classe "MaBaseDeDonnee"
            # sera interprété, ainsi on fera automatiquement un commit
            with MaBaseDeDonnee().connexion_bd as mconn_bd:
                with mconn_bd as mc_cur:
                    mc_cur.execute(str_sql_delete_intitulegenre,
                                   valeur_delete_dictionnaire)
                    data_one = mc_cur.fetchall()
                    print("valeur_id_dictionnaire...", data_one)
                    return data_one
        except (Exception, pymysql.err.OperationalError,
                pymysql.ProgrammingError, pymysql.InternalError,
                pymysql.IntegrityError, TypeError) as erreur:
            # DEBUG bon marché : Pour afficher un message dans la console.
            print(
                f"Problème delete_genre_data Data Gestions Genres numéro de l'erreur : {erreur}"
            )
            flash(
                f"Flash. Problèmes Data Gestions Genres numéro de l'erreur : {erreur}",
                "danger")
            if erreur.args[0] == 1451:
                # OM 2020.04.09 Traitement spécifique de l'erreur 1451 Cannot delete or update a parent row: a foreign key constraint fails
                # en MySql le moteur INNODB empêche d'effacer un genre qui est associé à un film dans la table intermédiaire "t_genres_films"
                # il y a une contrainte sur les FK de la table intermédiaire "t_genres_films"
                # C'est une erreur à signaler à l'utilisateur de cette application WEB.
                flash(
                    f"Flash. IMPOSSIBLE d'effacer !!! Ce genre est associé à des films dans la t_genres_films !!! : {erreur}",
                    "danger")
                # DEBUG bon marché : Pour afficher un message dans la console.
                print(
                    f"IMPOSSIBLE d'effacer !!! Ce genre est associé à des films dans la t_genres_films !!! : {erreur}"
                )
            raise MaBdErreurDelete(
                f"DGG Exception {msg_erreurs['ErreurDeleteContrainte']['message']} {erreur}"
            )
    def genres_films_afficher_data(self, valeur_id_film_selected_dict):
        print("valeur_id_film_selected_dict...", valeur_id_film_selected_dict)
        try:

            # OM 2020.04.07 C'EST LA QUE VOUS ALLEZ DEVOIR PLACER VOTRE PROPRE LOGIQUE MySql
            # la commande MySql classique est "SELECT * FROM t_genres"
            # Pour "lever"(raise) une erreur s'il y a des erreurs sur les noms d'attributs dans la table
            # donc, je précise les champs à afficher

            strsql_film_selected = """SELECT id_user, Nom, Prenom, UserNom, GROUP_CONCAT(id_material) as UserMaterial FROM t_user_material AS T1
                                        INNER JOIN t_user AS T2 ON T2.id_user = T1.fk_user
                                        INNER JOIN t_material AS T3 ON T3.id_material = T1.fk_material
                                        WHERE id_user = %(value_id_user_selected)s"""

            strsql_genres_films_non_attribues = """SELECT id_material, material FROM t_material
                                                    WHERE id_material not in(SELECT id_material as idUserMaterial FROM t_user_material AS T1
                                                    INNER JOIN t_user AS T2 ON T2.id_user = T1.fk_user
                                                    INNER JOIN t_material AS T3 ON T3.id_material = T1.fk_material
                                                    WHERE id_user = %(value_id_user_selected)s)"""

            strsql_genres_films_attribues = """SELECT id_user, id_material, material FROM t_user_material AS T1
                                            INNER JOIN t_user AS T2 ON T2.id_user = T1.fk_user
                                            INNER JOIN t_material AS T3 ON T3.id_material = T1.fk_material
                                            WHERE id_user = %(value_id_user_selected)s"""

            # Du fait de l'utilisation des "context managers" on accède au curseur grâce au "with".
            with MaBaseDeDonnee().connexion_bd.cursor() as mc_afficher:
                # Envoi de la commande MySql
                mc_afficher.execute(strsql_genres_films_non_attribues,
                                    valeur_id_film_selected_dict)
                # Récupère les données de la requête.
                data_genres_films_non_attribues = mc_afficher.fetchall()
                # Affichage dans la console
                print("dfad data_genres_films_non_attribues ",
                      data_genres_films_non_attribues, " Type : ",
                      type(data_genres_films_non_attribues))

                # Envoi de la commande MySql
                mc_afficher.execute(strsql_film_selected,
                                    valeur_id_film_selected_dict)
                # Récupère les données de la requête.
                data_film_selected = mc_afficher.fetchall()
                # Affichage dans la console
                print("data_film_selected  ", data_film_selected, " Type : ",
                      type(data_film_selected))

                # Envoi de la commande MySql
                mc_afficher.execute(strsql_genres_films_attribues,
                                    valeur_id_film_selected_dict)
                # Récupère les données de la requête.
                data_genres_films_attribues = mc_afficher.fetchall()
                # Affichage dans la console
                print("data_genres_films_attribues ",
                      data_genres_films_attribues, " Type : ",
                      type(data_genres_films_attribues))

                # Retourne les données du "SELECT"
                return data_film_selected, data_genres_films_non_attribues, data_genres_films_attribues
        except pymysql.Error as erreur:
            print(
                f"DGGF gfad pymysql errror {erreur.args[0]} {erreur.args[1]}")
            raise MaBdErreurPyMySl(
                f"DGG gad pymysql errror {msg_erreurs['ErreurPyMySql']['message']} {erreur.args[0]} {erreur.args[1]}"
            )
        except Exception as erreur:
            print(f"DGGF gfad Exception {erreur.args}")
            raise MaBdErreurConnexion(
                f"DGG gad Exception {msg_erreurs['ErreurConnexionBD']['message']} {erreur.args}"
            )
        except pymysql.err.IntegrityError as erreur:
            # OM 2020.04.09 On dérive "pymysql.err.IntegrityError" dans le fichier "erreurs.py"
            # Ainsi on peut avoir un message d'erreur personnalisé.
            raise MaBdErreurConnexion(
                f"DGGF gfad pei {msg_erreurs['ErreurConnexionBD']['message']} {erreur.args[1]}"
            )