diff options
Diffstat (limited to 'src/database/dbuser.py')
| -rw-r--r-- | src/database/dbuser.py | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/src/database/dbuser.py b/src/database/dbuser.py new file mode 100644 index 0000000..e0a62fb --- /dev/null +++ b/src/database/dbuser.py @@ -0,0 +1,171 @@ + + +############################################################################ +# # +# Description: Ensemble de méthodes pour étendre dbmain # +# afin de gérer les utilisateurs # +# # +############################################################################ + +from datetime import datetime +from passlib.hash import sha512_crypt +# Import de dbmain +from . import dbmain + +# Extension de cette classe avec dbmain +class DbUser(dbmain.DbMain): + + # **************************************************************************** + # GESTION DES UTILISATEURS + # **************************************************************************** + # Enregistrement d'un nouvel utilisateur + def register_user(self, email, password, userStatus): + # On vérifie si l'email existe deja dans la bdd + exist = self.check_exist_email(email) + # Si non + if not exist: + # Chiffrement du pass + hash = self.crypt_pass(password) + # Préparation de la requète + reqAddUser = """"" + INSERT INTO + """ + self.TABLEUSERACCOUNT + """ + (email, password, inscriptionDate, userStatus) + VALUES + (%s, %s, %s, %s)""" + # Execution de la requète + self.exec_cmd(reqAddUser, + [email, + hash, + datetime.now().strftime("%Y-%m-%d %H:%M:%S"), + userStatus + ] + ) + # Retourne 1 pour réussite + return 1 + else: + # Retourne 0 pour échec + return 0 + + # Vérification de la combinaison email - pass pour authentification + def check_user_credential(self, email, password): + # Préparation de la requète pour récupérer les infos ou l'email est présent + reqCheckCredential = """ + SELECT + userId, password + FROM + """ + self.TABLEUSERACCOUNT + """ + WHERE + email = %s """ + # Execution de la requète + self.exec_cmd(reqCheckCredential, [email]) + result = self.cur.fetchone() + # Vérifiaction de correspondance email & pass + if result and sha512_crypt.verify(password, result[1]): + return result[0] + + # Mise à jour des infos d'un utilisateur + def update_user_infos(self, userInfos, userId, isPro, userJobs=None): + # Préparation de la requète pour mise à jour des infos + # J'ai préféré faire deux requètes distinctes et ne pas utiliser des valeurs + # passées par POST (key => value) pour gérer les noms des colonnes + # car je préfère les passer en "dur" dans mes requêtes (risque d'injection SQL%s). + reqAddInfoClient = """ + REPLACE INTO + """ + self.TABLEUSERINFO + """ + (lastname, firstname, phoneNumber, + adress, zipCode, city, userId) + VALUES + (%s, %s, %s, %s, %s, %s, %s)""" + reqAddInfoPro = """ + REPLACE INTO + """ + self.TABLEUSERINFO + """ + (lastname, firstname, phoneNumber, + adress, zipCode, city, degree, + capability, description, userId) + VALUES + (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)""" + reqAddInfoProJobs = """ + INSERT INTO + """ + self.TABLEUSERJOB + """ + (jobCategoryId, userId) + VALUES + (%s, %s)""" + reqRemoveInfoProJobs = """ + DELETE FROM + """ + self.tableUserJob + """ + WHERE + jobCategoryId = %s + AND + userId = %s""" + # if not isPro: + # # Exécution de la requète + # # https:#www.php.net/manual/fr/function.array-values.php + # # Pour passer de "dict" a "list" -> array_values() + # args = [i for i in userInfos] + # args.push(userId) + # self.exec_cmd(reqAddInfoClient, args) + # else: + # # https:#stackoverflow.com/questions/15986235/how-to-use-json-stringify-and-json-decode-properly + # # Récupération des emplois dans le JSON et supression de ces derniers de la liste + # selectedJobs = json_decode(html_entity_decode(userInfos["jobs"])) + # unset(userInfos["jobs"]) + # # array_value -> Qu'est ce qui est présent dans 1 mais pas dans 2 %s + # # Comparaison des jobs anciennement présent avec ceux sélectionnés, donc ajoutés. + # jobsAdded = array_values(array_diff(selectedJobs, userJobs)) + # # Comparaison des jobs deja présent avec ceux sélectionnés, donc ajoutés. + # jobsRemoved = array_values(array_diff(userJobs, selectedJobs)) + # # on continue classiquement avec les autres éléments + # args = array_values(userInfos) + # array_push(args, userId) + # self.exec_cmd(reqAddInfoPro, args) + # for i in jobsAdded: + # self.exec_cmd(reqAddInfoProJobs, array(jobsAdded[i], userId)) + # for i in jobsRemoved: + # self.exec_cmd(reqRemoveInfoProJobs, array(jobsRemoved[i], userId)) + + # **************************************************************************** + # GESTION DU TOKEN AUTOLOGIN + # **************************************************************************** + # Vérification de la combinaison email - jeton d'auto-login pour authentification + def check_token_autologin(self, email, token): + # Préparation de la requète pour récupérer les infos ou l'email est présent + reqCheckToken = """ + SELECT + userId, tokenAutoLogin + FROM + """ + self.TABLEUSERACCOUNT + """ + WHERE + email = %s""" + # Exécution de la requète + self.exec_cmd(reqCheckToken, [email]) + result = self.cur.fetchone() + # Vérifiaction de correspondance email & jeton d'auto-connection + if result and result[1] == token: + return result[0] + + # Mise à jour du jeton d'auto-login + def update_token_autologin(self, email, token): + # Préparation de la requète pour mise à jour du jeton d'auto-connection + reqUpdateToken = """ + UPDATE + """ + self.TABLEUSERACCOUNT + """ + SET + tokenAutoLogin = %s + WHERE + email = %s""" + # Execution de la requète + self.exec_cmd(reqUpdateToken, [token, email]) + + # Supression du jeton d'auto-login + def del_token_autologin(self, email): + # Préparation de la requète pour supression du jeton d'auto-connection + reqDeleteToken = """ + UPDATE + """ + self.TABLEUSERACCOUNT + """ + SET + tokenAutoLogin = NULL + WHERE + email = %s""" + # Execution de la requète + self.exec_cmd(reqDeleteToken, [email]) |
