Esempio n. 1
0
def concours_select_delete():

    if request.method == 'GET':
        try:

            # OM 2020.04.09 Objet contenant toutes les méthodes pour gérer (CRUD) les données.
            obj_actions_concours = GestionConcours()
            # OM 2019.04.04 Récupérer la valeur de "idconcoursDeleteHTML" du formulaire html "concoursDelete.html"
            id_concours_delete = request.args.get('id_concours_delete_html')

            # Constitution d'un dictionnaire et insertion dans la BD
            valeur_delete_dictionnaire = {
                "value_id_concours": id_concours_delete
            }

            # OM 2019.04.02 La commande MySql est envoyée à la BD
            data_id_concours = obj_actions_concours.delete_select_concours_data(
                valeur_delete_dictionnaire)
            flash(f"EFFACER et c'est terminé pour cette \"POV\" valeur !!!")

        except (Exception, pymysql.err.OperationalError,
                pymysql.ProgrammingError, pymysql.InternalError,
                pymysql.IntegrityError, TypeError) as erreur:
            # Communiquer qu'une erreur est survenue.
            # DEBUG bon marché : Pour afficher un message dans la console.
            print(f"Erreur concours_delete {erreur.args[0], erreur.args[1]}")
            # C'est une erreur à signaler à l'utilisateur de cette application WEB.
            flash(f"Erreur concours_delete {erreur.args[0], erreur.args[1]}")

    # Envoie la page "HTML" au serveur.
    return render_template('concours/concours_delete.html',
                           data=data_id_concours)
Esempio n. 2
0
def concours_delete():

    # OM 2019.04.02 Pour savoir si les données d'un formulaire sont un affichage ou un envoi de donnée par des champs utilisateurs.
    if request.method == 'POST':
        try:
            # OM 2020.04.09 Objet contenant toutes les méthodes pour gérer (CRUD) les données.
            obj_actions_concours = GestionConcours()
            # OM 2019.04.02 Récupérer la valeur de "id_concours" du formulaire html "concoursAfficher.html"
            id_concours_delete = request.form['id_concours_delete_html']
            # Constitution d'un dictionnaire et insertion dans la BD
            valeur_delete_dictionnaire = {
                "value_id_concours": id_concours_delete
            }

            data_concours = obj_actions_concours.delete_concours_data(
                valeur_delete_dictionnaire)
            # OM 2019.04.02 On va afficher la liste des concours des concours
            # OM 2019.04.02 Envoie la page "HTML" au serveur. On passe un message d'information dans "message_html"

            # On affiche les concours
            return redirect(
                url_for('concours_afficher', order_by='ASC',
                        id_concours_sel=0))

        except (pymysql.err.OperationalError, pymysql.ProgrammingError,
                pymysql.InternalError, pymysql.IntegrityError,
                TypeError) as erreur:
            # OM 2020.04.09 Traiter spécifiquement l'erreur MySql 1451
            # Cette erreur 1451, signifie qu'on veut effacer un "concours" de concours qui est associé dans "t_concours_concours".
            if erreur.args[0] == 1451:
                # C'est une erreur à signaler à l'utilisateur de cette application WEB.
                flash(
                    'IMPOSSIBLE d\'effacer !!! Cette valeur est associée à des concours !'
                )
                # DEBUG bon marché : Pour afficher un message dans la console.
                print(
                    f"IMPOSSIBLE d'effacer !! Ce concours est associé à des concours dans la t_concours_concours !!! : {erreur}"
                )
                # Afficher la liste des concours des concours
                return redirect(url_for('concours_afficher'))
            else:
                # Communiquer qu'une autre erreur que la 1062 est survenue.
                # DEBUG bon marché : Pour afficher un message dans la console.
                print(
                    f"Erreur concours_delete {erreur.args[0], erreur.args[1]}")
                # C'est une erreur à signaler à l'utilisateur de cette application WEB.
                flash(
                    f"Erreur concours_delete {erreur.args[0], erreur.args[1]}")

            # OM 2019.04.02 Envoie la page "HTML" au serveur.
    return render_template('concours/concours_afficher.html',
                           data=data_concours)
Esempio n. 3
0
def concours_edit():
    # OM 2020.04.07 Les données sont affichées dans un formulaire, l'affichage de la sélection
    # d'une seule ligne choisie par le bouton "edit" dans le formulaire "concours_afficher.html"
    if request.method == 'GET':
        try:
            # Récupérer la valeur de "id_concours" du formulaire html "concours_afficher.html"
            # l'utilisateur clique sur le lien "edit" et on récupére la valeur de "id_concours"
            # grâce à la variable "id_concours_edit_html"
            # <a href="{{ url_for('concours_edit', id_concours_edit_html=row.id_concours) }}">Edit</a>
            id_concours_edit = request.values['id_concours_edit_html']

            # Pour afficher dans la console la valeur de "id_concours_edit", une façon simple de se rassurer,
            # sans utiliser le DEBUGGER
            print(id_concours_edit)

            # Constitution d'un dictionnaire et insertion dans la BD
            valeur_select_dictionnaire = {
                "value_id_concours": id_concours_edit
            }

            # OM 2020.04.09 Objet contenant toutes les méthodes pour gérer (CRUD) les données.
            obj_actions_concours = GestionConcours()

            # OM 2019.04.02 La commande MySql est envoyée à la BD
            data_id_concours = obj_actions_concours.edit_concours_data(
                valeur_select_dictionnaire)
            print("dataIdconcours ", data_id_concours, "type ",
                  type(data_id_concours))
            # Message ci-après permettent de donner un sentiment rassurant aux utilisateurs.
            flash(f"Editer le concours d'un per !!!")

        except (Exception, pymysql.err.OperationalError,
                pymysql.ProgrammingError, pymysql.InternalError,
                pymysql.IntegrityError, TypeError) as erreur:

            # On indique un problème, mais on ne dit rien en ce qui concerne la résolution.
            print("Problème avec la BD ! : %s", erreur)
            # OM 2020.04.09 On dérive "Exception" dans "MaBdErreurConnexion" fichier "erreurs.py"
            # Ainsi on peut avoir un message d'erreur personnalisé.
            raise MaBdErreurConnexion(
                f"RGG Exception {msg_erreurs['ErreurConnexionBD']['message']}"
                f"et son status {msg_erreurs['ErreurConnexionBD']['status']}")

    return render_template("concours/concours_edit.html",
                           data=data_id_concours)
Esempio n. 4
0
def concours_afficher(order_by, id_concours_sel):
    # OM 2020.04.09 Pour savoir si les données d'un formulaire sont un affichage
    # ou un envoi de donnée par des champs du formulaire HTML.
    if request.method == "GET":
        try:
            # OM 2020.04.09 Objet contenant toutes les méthodes pour gérer (CRUD) les données.
            obj_actions_concours = GestionConcours()
            # Récupère les données grâce à une requête MySql définie dans la classe Gestionconcours()
            # Fichier data_gestion_concours.py
            # "order_by" permet de choisir l'ordre d'affichage des concours.
            data_concours = obj_actions_concours.concours_afficher_data(
                order_by, id_concours_sel)
            # DEBUG bon marché : Pour afficher un message dans la console.
            print(" data concours", data_concours, "type ",
                  type(data_concours))

            # Différencier les messages si la table est vide.
            if not data_concours and id_concours_sel == 0:
                flash("""La table "t_concours" est vide. !!""", "warning")
            elif not data_concours and id_concours_sel > 0:
                # Si l'utilisateur change l'id_concours dans l'URL et que le concours n'existe pas,
                flash(f"Le concours demandé n'existe pas !!", "warning")
            else:
                # Dans tous les autres cas, c'est que la table "t_concours" est vide.
                # OM 2020.04.09 La ligne ci-dessous permet de donner un sentiment rassurant aux utilisateurs.
                flash(f"Données concours affichés !!", "success")

        except Exception as erreur:
            print(f"RGG Erreur générale.")
            # 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é.
            # flash(f"RGG Exception {erreur}")
            raise Exception(f"RGG Erreur générale. {erreur}")
            # raise MaBdErreurOperation(f"RGG Exception {msg_erreurs['ErreurNomBD']['message']} {erreur}")

    # OM 2020.04.07 Envoie la page "HTML" au serveur.
    return render_template("concours/concours_afficher.html",
                           data=data_concours)
Esempio n. 5
0
def concours_add():
    # OM 2019.03.25 Pour savoir si les données d'un formulaire sont un affichage
    # ou un envoi de donnée par des champs utilisateurs.
    if request.method == "POST":
        try:
            # OM 2020.04.09 Objet contenant toutes les méthodes pour gérer (CRUD) les données.
            obj_actions_concours = GestionConcours()
            # OM 2020.04.09 Récupère le contenu du champ dans le formulaire HTML "concours_add.html"
            date_concours_add = request.form['date_concours_html']
            type_concours_add = request.form['type_concours_html']
            stand_de_tir_add = request.form['stand_de_tir_html']

            # OM 2019.04.04 On ne doit pas accepter des valeurs vides, des valeurs avec des chiffres,
            # des valeurs avec des caractères qui ne sont pas des lettres.
            # Accepte le trait d'union ou l'apostrophe, et l'espace entre deux mots, mais pas plus d'une occurence.
            if not re.match("", date_concours_add):
                # OM 2019.03.28 Message humiliant à l'attention de l'utilisateur.
                flash(
                    f"Une entrée...incorrecte !! Pas de chiffres, de caractères spéciaux, d'espace à double, "
                    f"de double apostrophe, de double trait union et ne doit pas être vide.",
                    "Danger")
                # On doit afficher à nouveau le formulaire "concours_add.html" à cause des erreurs de "claviotage"
                return render_template("concours/concours_add.html")
            else:

                # Constitution d'un dictionnaire et insertion dans la BD
                valeurs_insertion_dictionnaire = {
                    "value_date_concours": date_concours_add,
                    "value_fk_type_concours": type_concours_add,
                    "value_fk_stand_de_tir": stand_de_tir_add
                }
                obj_actions_concours.add_concours_data(
                    valeurs_insertion_dictionnaire)

                # OM 2019.03.25 Les 2 lignes ci-après permettent de donner un sentiment rassurant aux utilisateurs.
                flash(f"Données insérées !!", "Sucess")
                print(f"Données insérées !!")
                # On va interpréter la "route" 'concours_afficher', car l'utilisateur
                # doit voir le nouveau concours qu'il vient d'insérer.
                return redirect(
                    url_for('concours_afficher',
                            id_concours_sel=0,
                            order_by="ASC"))

        # OM 2020.04.16 ATTENTION à l'ordre des excepts très important de respecter l'ordre.
        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"RGG pei {msg_erreurs['ErreurDoublonValue']['message']} et son status {msg_erreurs['ErreurDoublonValue']['status']}"
            )

        # OM 2020.04.16 ATTENTION à l'ordre des excepts très important de respecter l'ordre.
        except (pymysql.err.OperationalError, pymysql.ProgrammingError,
                pymysql.InternalError, TypeError) as erreur:
            flash(f"Autre erreur {erreur}")
            raise MonErreur(f"Autre erreur")

        except Exception as erreur:
            # OM 2020.04.09 On dérive "Exception" dans "MaBdErreurConnexion" fichier "erreurs.py"
            # Ainsi on peut avoir un message d'erreur personnalisé.
            raise MaBdErreurConnexion(
                f"RGG Exception {msg_erreurs['ErreurConnexionBD']['message']} et son status {msg_erreurs['ErreurConnexionBD']['status']}"
            )

        # OM 2020.04.16 ATTENTION à l'ordre des excepts très important de respecter l'ordre.
    # OM 2020.04.07 Envoie la page "HTML" au serveur.
    return render_template("concours/concours_add.html")
Esempio n. 6
0
def concours_update():
    # DEBUG bon marché : Pour afficher les méthodes et autres de la classe "flask.request"
    print(dir(request))
    # OM 2020.04.07 Les données sont affichées dans un formulaire, l'affichage de la sélection
    # d'une seule ligne choisie par le bouton "edit" dans le formulaire "concours_afficher.html"
    # Une fois que l'utilisateur à modifié la valeur du concours alors il va appuyer sur le bouton "UPDATE"
    # donc en "POST"
    if request.method == 'POST':
        try:
            # DEBUG bon marché : Pour afficher les valeurs contenues dans le formulaire
            print("request.values ", request.values)

            # Récupérer la valeur de "id_concours" du formulaire html "concours_edit.html"
            # l'utilisateur clique sur le lien "edit" et on récupére la valeur de "id_concours"
            # grâce à la variable "id_concours_edit_html"
            # <a href="{{ url_for('concours_edit', id_concours_edit_html=row.id_concours) }}">Edit</a>
            id_concours_edit = request.values['id_concours_edit_html']
            date_concours_edit = request.values['date_concours_edit_html']
            type_concours_edit = request.values['type_concours_edit_html']
            stand_de_tir_edit = request.values['stand_de_tir_edit_html']

            # Récupère le contenu du champ "intitule_concours" dans le formulaire HTML "concoursEdit.html"

            valeur_edit_list = [{
                'value_id_concours': id_concours_edit,
                'value_date_concours': date_concours_edit,
                'value_type_concours': type_concours_edit,
                'value_stand_de_tir': stand_de_tir_edit
            }]
            # On ne doit pas accepter des valeurs vides, des valeurs avec des chiffres,
            # des valeurs avec des caractères qui ne sont pas des lettres.
            # Accepte le trait d'union ou l'apostrophe, et l'espace entre deux mots, mais pas plus d'une occurence.
            if not re.match("(.*?)", date_concours_edit):
                # En cas d'erreur, conserve la saisie fausse, afin que l'utilisateur constate sa misérable faute
                # Récupère le contenu du champ "intitule_concours" dans le formulaire HTML "concoursEdit.html"
                #nom_pers = request.values['name_edit_intitule_concours_html']
                # Message humiliant à l'attention de l'utilisateur.
                flash(
                    f"Une entrée...incorrecte !! Pas de chiffres, de caractères spéciaux, d'espace à double, "
                    f"de double apostrophe, de double trait union et ne doit pas être vide.",
                    "Danger")

                # On doit afficher à nouveau le formulaire "concours_edit.html" à cause des erreurs de "claviotage"
                # Constitution d'une liste pour que le formulaire d'édition "concours_edit.html" affiche à nouveau
                # la possibilité de modifier l'entrée
                # Exemple d'une liste : [{'id_concours': 13, 'intitule_concours': 'philosophique'}]
                valeur_edit_list = [{
                    'value_id_concours': id_concours_edit,
                    'value_date_concours': date_concours_edit,
                    'value_type_concours': type_concours_edit,
                    'value_stand_de_tir': stand_de_tir_edit
                }]

                # DEBUG bon marché :
                # Pour afficher le contenu et le type de valeurs passées au formulaire "concours_edit.html"
                print(valeur_edit_list, "type ..", type(valeur_edit_list))
                return render_template('concours/concours_edit.html',
                                       data=valeur_edit_list)
            else:
                # Constitution d'un dictionnaire et insertion dans la BD
                valeur_update_dictionnaire = {
                    'value_id_concours': id_concours_edit,
                    'value_date_concours': date_concours_edit,
                    'value_type_concours': type_concours_edit,
                    'value_stand_de_tir': stand_de_tir_edit
                }

                # OM 2020.04.09 Objet contenant toutes les méthodes pour gérer (CRUD) les données.
                obj_actions_concours = GestionConcours()

                # La commande MySql est envoyée à la BD
                data_id_concours = obj_actions_concours.update_concours_data(
                    valeur_update_dictionnaire)
                # DEBUG bon marché :
                print("dataIdconcours ", data_id_concours, "type ",
                      type(data_id_concours))
                # Message ci-après permettent de donner un sentiment rassurant aux utilisateurs.
                flash(f"Editer le concours d'un per !!!")
                # On affiche les concours
                return redirect(url_for('concours_afficher'))

        except (Exception, pymysql.err.OperationalError,
                pymysql.ProgrammingError, pymysql.InternalError,
                pymysql.IntegrityError, TypeError) as erreur:

            print(erreur.args)
            flash(f"problème concours update{erreur.args[0]}")
            # En cas de problème, mais surtout en cas de non respect
            # des régles "REGEX" dans le champ "name_edit_intitule_concours_html" alors on renvoie le formulaire "EDIT"
            return render_template('concours/concours_edit.html',
                                   data=valeur_edit_list)

    return render_template("concours/concours_update.html")
def gf_edit_concours_personne_selected ():
    if request.method == "GET":
        try:

            # OM 2020.04.09 Objet contenant toutes les méthodes pour gérer (CRUD) les données.
            obj_actions_concours = GestionConcours()
            # Récupère les données grâce à une requête MySql définie dans la classe Gestionconcours()
            # Fichier data_gestion_concours.py
            # Pour savoir si la table "t_concours" est vide, ainsi on empêche l’affichage des tags
            # dans le render_template(concours_personne_modifier_tags_dropbox.html)
            data_concours_all = obj_actions_concours.concours_afficher_data('ASC', 0)

            # OM 2020.04.09 Objet contenant toutes les méthodes pour gérer (CRUD) les données de la table intermédiaire.
            obj_actions_concours = Gestionconcourspersonne()

            # OM 2020.04.21 Récupère la valeur de "id_personne" du formulaire html "concours_personne_afficher.html"
            # l'utilisateur clique sur le lien "Modifier concours de ce personne" et on récupère la valeur de "id_personne" grâce à la variable "id_personne_concours_edit_html"
            # <a href="{{ url_for('gf_edit_concours_personne_selected', id_personne_concours_edit_html=row.id_personne) }}">Modifier les concours de ce personne</a>
            id_personne_concours_edit = request.values['id_personne_concours_edit_html']

            # OM 2020.04.21 Mémorise l'id du personne dans une variable de session
            # (ici la sécurité de l'application n'est pas engagée)
            # il faut éviter de stocker des données sensibles dans des variables de sessions.
            session['session_id_personne_concours_edit'] = id_personne_concours_edit

            # Constitution d'un dictionnaire pour associer l'id du personne sélectionné avec un nom de variable
            valeur_id_personne_selected_dictionnaire = {"value_id_personne_selected": id_personne_concours_edit}

            # Récupère les données grâce à 3 requêtes MySql définie dans la classe Gestionconcourspersonne()
            # 1) Sélection du personne choisi
            # 2) Sélection des concours "déjà" attribués pour le personne.
            # 3) Sélection des concours "pas encore" attribués pour le personne choisi.
            # Fichier data_gestion_concours_personne.py
            # ATTENTION à l'ordre d'assignation des variables retournées par la fonction "concours_personne_afficher_data"
            data_concours_personne_selected, data_concours_personne_non_attribues, data_concours_personne_attribues = \
                obj_actions_concours.concours_personne_afficher_data(valeur_id_personne_selected_dictionnaire)

            lst_data_personne_selected = [item['id_personne'] for item in data_concours_personne_selected]
            # DEBUG bon marché : Pour afficher le résultat et son type.
            print("lst_data_personne_selected  ", lst_data_personne_selected,
                  type(lst_data_personne_selected))

            # Dans le composant "tags-selector-tagselect" on doit connaître
            # les concours qui ne sont pas encore sélectionnés.
            lst_data_concours_personne_non_attribues = [item['id_concours'] for item in data_concours_personne_non_attribues]
            session['session_lst_data_concours_personne_non_attribues'] = lst_data_concours_personne_non_attribues
            # DEBUG bon marché : Pour afficher le résultat et son type.
            print("lst_data_concours_personne_non_attribues  ", lst_data_concours_personne_non_attribues,
                  type(lst_data_concours_personne_non_attribues))

            # Dans le composant "tags-selector-tagselect" on doit connaître
            # les concours qui sont déjà sélectionnés.
            lst_data_concours_personne_old_attribues = [item['id_concours'] for item in data_concours_personne_attribues]
            session['session_lst_data_concours_personne_old_attribues'] = lst_data_concours_personne_old_attribues
            # DEBUG bon marché : Pour afficher le résultat et son type.
            print("lst_data_concours_personne_old_attribues  ", lst_data_concours_personne_old_attribues,
                  type(lst_data_concours_personne_old_attribues))

            # DEBUG bon marché : Pour afficher le résultat et son type.
            print(" data data_concours_personne_selected", data_concours_personne_selected, "type ", type(data_concours_personne_selected))
            print(" data data_concours_personne_non_attribues ", data_concours_personne_non_attribues, "type ",
                  type(data_concours_personne_non_attribues))
            print(" data_concours_personne_attribues ", data_concours_personne_attribues, "type ",
                  type(data_concours_personne_attribues))

            # Extrait les valeurs contenues dans la table "t_concours", colonne "date_concours"
            # Le composant javascript "tagify" pour afficher les tags n'a pas besoin de l'id_concours
            lst_data_concours_personne_non_attribues = [item['date_concours'] for item in data_concours_personne_non_attribues]
            # DEBUG bon marché : Pour afficher le résultat et son type.
            print("lst_all_concours gf_edit_concours_personne_selected ", lst_data_concours_personne_non_attribues,
                  type(lst_data_concours_personne_non_attribues))

            # Différencier les messages si la table est vide.
            if lst_data_personne_selected == [None]:
                flash(f"""Le personne demandé n'existe pas. Ou la table "t_concours_personne" est vide. !!""", "warning")
            else:
                # OM 2020.04.09 La ligne ci-dessous permet de donner un sentiment rassurant aux utilisateurs.
                flash(f"Données concours affichées dans concourspersonne!!", "success")

        except Exception as erreur:
            print(f"RGGF Erreur générale.")
            # 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é.
            # flash(f"RGG Exception {erreur}")
            raise Exception(f"RGGF Erreur générale. {erreur}")
            # raise MaBdErreurOperation(f"RGG Exception {msg_erreurs['ErreurNomBD']['message']} {erreur}")

    # OM 2020.04.21 Envoie la page "HTML" au serveur.
    return render_template("personne_concours/concours_personne_modifier_tags_dropbox.html",
                           data_concours=data_concours_all,
                           data_personne_selected=data_concours_personne_selected,
                           data_concours_attribues=data_concours_personne_attribues,
                           data_concours_non_attribues=data_concours_personne_non_attribues)