diff options
| author | Debulois <quentin@debulois.fr> | 2022-05-01 11:44:09 +0200 |
|---|---|---|
| committer | Debulois <quentin@debulois.fr> | 2022-05-01 11:44:09 +0200 |
| commit | 1eaf21fd423e5dedf1ed4361b0e9b6cbbcfc9fa0 (patch) | |
| tree | 6557511b23ec5a067db75483ad1e42d836010851 | |
| parent | afd6fb901b7e8f99cdb1bb0d2134cec2d6cebc3b (diff) | |
Ajout gestion des missions coté client & pro
| -rw-r--r-- | src/core/coreUser.py | 26 | ||||
| -rw-r--r-- | src/database/dbadmin.py | 64 | ||||
| -rw-r--r-- | src/database/dbmission.py | 113 | ||||
| -rw-r--r-- | src/database/dbsearch.py | 88 | ||||
| -rw-r--r-- | src/database/dbuser.py | 72 | ||||
| -rw-r--r-- | src/gui/globalMenu.py | 35 | ||||
| -rw-r--r-- | src/gui/pageHome.py | 10 | ||||
| -rw-r--r-- | src/gui/pageLogin.py | 4 | ||||
| -rw-r--r-- | src/gui/windowMissions.py | 153 | ||||
| -rw-r--r-- | src/gui/windowRecherche.py | 3 | ||||
| -rw-r--r-- | src/gui/windowUserInfo.py | 16 | ||||
| -rw-r--r-- | src/main.py | 6 | ||||
| -rw-r--r-- | src/setup.py | 5 |
13 files changed, 382 insertions, 213 deletions
diff --git a/src/core/coreUser.py b/src/core/coreUser.py index b8129d4..ec39b39 100644 --- a/src/core/coreUser.py +++ b/src/core/coreUser.py @@ -11,7 +11,7 @@ def core_login(mainWindow, email, password) -> None: res = user.check_user_credential(email, password) if res: search = dbsearch.DbSearch(mainWindow).get_user_account_by_userid(res) - QMessageBox.information( + QMessageBox.information( mainWindow, "Connexion", "Vous êtes connecté" @@ -28,13 +28,13 @@ def core_login(mainWindow, email, password) -> None: mainWindow.userStatus = "Client" pageHome.main(mainWindow, True) else: - QMessageBox.warning( + QMessageBox.warning( mainWindow, "Connexion", "Mauvaise combinaison mail & mot de passe" ) else: - QMessageBox.warning( + QMessageBox.warning( mainWindow, "Connexion", "Mauvais email" @@ -49,13 +49,13 @@ def core_logout(mainWindow) -> None: mainWindow.userInscrDate = "" mainWindow.userStatus = "" - QMessageBox.information( + QMessageBox.information( mainWindow, "Déconnection", "Vous êtes déconnecté." ) pageHome.main(mainWindow, True) - + def core_register(mainWindow, email, password, userStatus) -> None: user = dbuser.DbUser(mainWindow) @@ -66,7 +66,7 @@ def core_register(mainWindow, email, password, userStatus) -> None: # Si vide if not email: - QMessageBox.warning( + QMessageBox.warning( mainWindow, "Email invalide", "Veuillez renseigner un email" @@ -74,7 +74,7 @@ def core_register(mainWindow, email, password, userStatus) -> None: return if not password: - QMessageBox.warning( + QMessageBox.warning( mainWindow, "Mot de passe invalide", "Veuillez renseigner un mot de passe" @@ -82,7 +82,7 @@ def core_register(mainWindow, email, password, userStatus) -> None: return if userStatus == None: - QMessageBox.warning( + QMessageBox.warning( mainWindow, "Mauvais rôle", "Veuillez selectionner un rôle" @@ -91,7 +91,7 @@ def core_register(mainWindow, email, password, userStatus) -> None: # les regex if not re.fullmatch(regEmail, email): - QMessageBox.warning( + QMessageBox.warning( mainWindow, "Email invalid", "Email non conforme" @@ -102,7 +102,7 @@ def core_register(mainWindow, email, password, userStatus) -> None: or not re.search(regNumb, password)\ or not re.search(regUpper, password)\ or not re.search(regSpecial, password): - QMessageBox.warning( + QMessageBox.warning( mainWindow, "Mot de passe invalide", ("Le mot de passe doit avoir:\n" @@ -115,7 +115,7 @@ def core_register(mainWindow, email, password, userStatus) -> None: # si email deja présent if user.check_exist_email(email): - QMessageBox.warning( + QMessageBox.warning( mainWindow, "Email invalid", "Email déja utilisé" @@ -124,13 +124,13 @@ def core_register(mainWindow, email, password, userStatus) -> None: res = user.register_user(email, password, userStatus) if res: - QMessageBox.information( + QMessageBox.information( mainWindow, "Inscription", "Inscription réussie!" ) else: - QMessageBox.warning( + QMessageBox.warning( mainWindow, "Erreur bdd", "Erreur lors de l'inscritpion" diff --git a/src/database/dbadmin.py b/src/database/dbadmin.py index 7b00cd5..6fcd3f5 100644 --- a/src/database/dbadmin.py +++ b/src/database/dbadmin.py @@ -18,9 +18,9 @@ class DbAdmin(dbmain.DbMain): # Récupérer toutes les infos de la table userAccount def get_all_users_account(self) -> list: reqGetAll: str = """ - SELECT - * - FROM + SELECT + * + FROM """ + self.TABLEUSERACCOUNT self.exec_cmd(reqGetAll) result = self.cur.fetchall() @@ -33,10 +33,10 @@ class DbAdmin(dbmain.DbMain): # https:#stackoverflow.com/questions/1676551/best-way-to-test-if-a-row-exists-in-a-mysql-table reqCheckExistId: str = """ SELECT EXISTS( - SELECT 1 FROM - """ + self.TABLEUSERACCOUNT + """ - WHERE - userId = %s + SELECT 1 FROM + """ + self.TABLEUSERACCOUNT + """ + WHERE + userId = %s LIMIT 1 )""" self.exec_cmd(reqCheckExistId, [userId]) @@ -62,10 +62,10 @@ class DbAdmin(dbmain.DbMain): # Préparation et execution de la requète pour voir si la categorie existe en anglais reqCheckjobCategoryNameEn: str = """ SELECT EXISTS( - SELECT 1 FROM - """ + self.TABLEJOBCATEGORY + """ - WHERE - jobCategoryNameEn = %s + SELECT 1 FROM + """ + self.TABLEJOBCATEGORY + """ + WHERE + jobCategoryNameEn = %s LIMIT 1 )""" self.exec_cmd(reqCheckjobCategoryNameEn, [jobNameEn]) @@ -75,10 +75,10 @@ class DbAdmin(dbmain.DbMain): # Préparation et execution de la requète pour voir si la categorie existe en Français reqCheckjobCategoryNameFr: str = """ SELECT EXISTS( - SELECT 1 FROM - """ + self.TABLEJOBCATEGORY + """ - WHERE - jobCategoryNameFr = %s + SELECT 1 FROM + """ + self.TABLEJOBCATEGORY + """ + WHERE + jobCategoryNameFr = %s LIMIT 1 )""" self.exec_cmd(reqCheckjobCategoryNameFr, [jobNameFr]) @@ -87,10 +87,10 @@ class DbAdmin(dbmain.DbMain): if not reqResultFr[0][0]: # Préparation de la requète pour l'ajout reqjobCategoryNameAdd: str = """ - INSERT INTO + INSERT INTO """ + self.TABLEJOBCATEGORY + """ - (jobCategoryNameEn, jobCategoryNameFr) - VALUES + (jobCategoryNameEn, jobCategoryNameFr) + VALUES (%s ,%s)""" # Exécution de la requète self.exec_cmd(reqjobCategoryNameAdd, [jobNameEn, jobNameFr], True) @@ -108,10 +108,10 @@ class DbAdmin(dbmain.DbMain): # Préparation de la requète pour voir si l'utilisateur existe reqCheckExistId: str = """ SELECT EXISTS( - SELECT 1 FROM - """ + self.TABLEJOBCATEGORY + """ - WHERE - jobCategoryId = %s + SELECT 1 FROM + """ + self.TABLEJOBCATEGORY + """ + WHERE + jobCategoryId = %s LIMIT 1 )""" # Exécution de la requète, fetchall pour avoir le résultat @@ -121,9 +121,9 @@ class DbAdmin(dbmain.DbMain): if (reqResult[0][0]): # Préparation de la requète pour suppression reqDelJobCategory: str = """ - DELETE FROM - """ + self.TABLEJOBCATEGORY + """ - WHERE + DELETE FROM + """ + self.TABLEJOBCATEGORY + """ + WHERE jobCategoryId = %s""" # Exécution de la requète self.exec_cmd(reqDelJobCategory, [jobId], True) @@ -141,10 +141,10 @@ class DbAdmin(dbmain.DbMain): # Préparation de la requète pour voir si l'utilisateur existe reqCheckExistId: str = """ SELECT EXISTS( - SELECT 1 FROM - """ + self.TABLEMISSION + """ - WHERE - missionId = %s + SELECT 1 FROM + """ + self.TABLEMISSION + """ + WHERE + missionId = %s LIMIT 1 )""" # Exécution de la requète @@ -154,9 +154,9 @@ class DbAdmin(dbmain.DbMain): if (reqResult[0][0]): # Préparation de la requète pour suppression reqDelMission: str = """ - DELETE FROM - """ + self.TABLEMISSION + """ - WHERE + DELETE FROM + """ + self.TABLEMISSION + """ + WHERE missionId = %s""" # Exécution de la requète self.exec_cmd(reqDelMission, [missionId], True) diff --git a/src/database/dbmission.py b/src/database/dbmission.py index 7f6620e..9d23288 100644 --- a/src/database/dbmission.py +++ b/src/database/dbmission.py @@ -24,10 +24,10 @@ class DbMission(dbmain.DbMain): def register_mission(self, subject, clientId, proId, jobId): # Préparation de la requète pour enregistrement de la mission reqAddMission = """ - INSERT INTO """ + self.TABLEMISSION + """ - (date, subject, clientId, proId, jobCategoryId) - VALUES - (?, ?, ?, ?, ?)""" + INSERT INTO """ + self.TABLEMISSION + """ + (date, subject, clientId, proId, jobCategoryId) + VALUES + (%s, %s, %s, %s, %s)""" # Exécution de la requète self.exec_cmd(reqAddMission, [datetime.now().strftime("%Y-%m-%d %H:%M:%S"), @@ -43,54 +43,53 @@ class DbMission(dbmain.DbMain): def accept_mission_by_missionid(self, missionId): # Préparation de la requète pour enregistrement de la mission reqAddMission = """ - UPDATE - """ + self.TABLEMISSION + """ + UPDATE + """ + self.TABLEMISSION + """ SET - acceptedByPro = ? - WHERE - missionId = ?""" + acceptedByPro = %s + WHERE + missionId = %s""" # Exécution de la requète - self.exec_cmd(reqAddMission, [datetime.now().strftime("%Y-%m-%d %H:%M:%S"), missionId]) + self.exec_cmd(reqAddMission, [datetime.now().strftime("%Y-%m-%d %H:%M:%S"), missionId], True) return 1 def validate_mission_pro_by_missionid(self, missionId): # Préparation de la requète pour enregistrement de la mission reqAddMission = """ - UPDATE - """ + self.TABLEMISSION + """ + UPDATE + """ + self.TABLEMISSION + """ SET - validatedByPro = ? - WHERE - missionId = ?""" + validatedByPro = %s + WHERE + missionId = %s""" # Exécution de la requète - self.exec_cmd(reqAddMission, [datetime.now().strftime("%Y-%m-%d %H:%M:%S"), missionId]) + self.exec_cmd(reqAddMission, [datetime.now().strftime("%Y-%m-%d %H:%M:%S"), missionId], True) return 1 def validate_mission_client_by_missionid(self, missionId): # Préparation de la requète pour enregistrement de la mission reqAddMission = """ - UPDATE - """ + self.TABLEMISSION + """ + UPDATE + """ + self.TABLEMISSION + """ SET - validatedByClient = ? - WHERE - missionId = ?""" + validatedByClient = %s + WHERE + missionId = %s""" # Exécution de la requète - self.exec_cmd(reqAddMission, [datetime.now().strftime("%Y-%m-%d %H:%M:%S"), missionId]) + self.exec_cmd(reqAddMission, [datetime.now().strftime("%Y-%m-%d %H:%M:%S"), missionId], True) return 1 - def review_mission(self, missionId, review, note): + def review_mission(self, missionId: int, review: str, note: int) -> None: # Préparation de la requète pour enregistrement de la mission reqAddMission = """ - UPDATE - """ + self.TABLEMISSION + """ + UPDATE + """ + self.TABLEMISSION + """ SET - review = ?, note = ? - WHERE - missionId = ?""" + review = %s, note = %s + WHERE + missionId = %s""" # Exécution de la requète - self.exec_cmd(reqAddMission, [review, note, missionId]) - return 1 + self.exec_cmd(reqAddMission, [review, note, missionId], True) # **************************************************************************** # RECUPERATION DES INFORMATIONS RELATIVES AUX MISSIONS @@ -98,18 +97,18 @@ class DbMission(dbmain.DbMain): # Récupérations des missions d'un pro par son id def get_mission_by_proid(self, proId): reqGetMissionsProId = """ - SELECT + SELECT missionId, date, subject, note, review, - acceptedByPro, validatedByClient, - validatedByPro, jobCategoryId, proId, lastname - FROM + acceptedByPro, validatedByClient, + validatedByPro, jobCategoryId, proId, lastname + FROM """ + self.TABLEMISSION + """ - LEFT JOIN - """ + self.TABLEUSERINFO + """ - ON + LEFT JOIN + """ + self.TABLEUSERINFO + """ + ON """ + self.TABLEMISSION + """.proId = """ + self.TABLEUSERINFO + """.userId - WHERE - proId = ?""" + WHERE + proId = %s""" self.exec_cmd(reqGetMissionsProId, [proId]) result = self.cur.fetchall() return result @@ -117,18 +116,18 @@ class DbMission(dbmain.DbMain): # Récupérations des missions d'un client par son id def get_mission_by_clientid(self, clientId): reqGetMissionsClientId = """ - SELECT + SELECT missionId, date, subject, note, review, - acceptedByPro, validatedByClient, - validatedByPro, jobCategoryId, proId, lastname - FROM + acceptedByPro, validatedByClient, + validatedByPro, jobCategoryId, proId, lastname + FROM """ + self.TABLEMISSION + """ - LEFT JOIN - """ + self.TABLEUSERINFO + """ - ON + LEFT JOIN + """ + self.TABLEUSERINFO + """ + ON """ + self.TABLEMISSION + """.proId = """ + self.TABLEUSERINFO + """.userId - WHERE - clientId = ?""" + WHERE + clientId = %s""" self.exec_cmd(reqGetMissionsClientId, [clientId]) result = self.cur.fetchall() return result @@ -136,9 +135,9 @@ class DbMission(dbmain.DbMain): # Récupérations des missions d'un client par son id def get_all_missions(self): reqGetAllMission = """ - SELECT - * - FROM + SELECT + * + FROM """ + self.TABLEMISSION self.exec_cmd(reqGetAllMission) result = self.cur.fetchall() @@ -147,14 +146,14 @@ class DbMission(dbmain.DbMain): # Compte le nombre de mission d'un consultant par son nom def count_pro_missions_by_proid(self, proId): reqCountMission = """ - SELECT COUNT(*) FROM + SELECT COUNT(*) FROM """ + self.TABLEMISSION + """ - INNER JOIN - """ + self.TABLEUSERINFO + """ - ON + INNER JOIN + """ + self.TABLEUSERINFO + """ + ON """ + self.TABLEMISSION + """.proId = """ + self.TABLEUSERINFO + """.userId - WHERE - proId = ?""" + WHERE + proId = %s""" self.exec_cmd(reqCountMission, [proId]) result = self.cur.fetchall() return result diff --git a/src/database/dbsearch.py b/src/database/dbsearch.py index 3089bf1..0561c9d 100644 --- a/src/database/dbsearch.py +++ b/src/database/dbsearch.py @@ -20,11 +20,11 @@ class DbSearch(dbmain.DbMain): # Récupération des infos d'un compte par son id def get_user_account_by_userid(self, userId: int) -> list: reqSearchUser = """ - SELECT + SELECT userId, email, inscriptionDate, userStatus - FROM + FROM """ + self.TABLEUSERACCOUNT + """ - WHERE + WHERE userId = %s""" self.exec_cmd(reqSearchUser, [userId]) return self.cur.fetchall() @@ -32,13 +32,13 @@ class DbSearch(dbmain.DbMain): # Récupération des infos d'un utilisateur par son id def get_user_info_by_userid(self, userId: int) -> list: reqGetUserInfo = """ - SELECT - userId, lastname, firstname, degree, + SELECT + userId, lastname, firstname, degree, capability, description, phoneNumber, - adress, zipCode, city - FROM - """ + self.TABLEUSERINFO + """ - WHERE + adress, zipCode, city + FROM + """ + self.TABLEUSERINFO + """ + WHERE userId = %s""" self.exec_cmd(reqGetUserInfo, [userId]) return self.cur.fetchall() @@ -48,16 +48,16 @@ class DbSearch(dbmain.DbMain): # **************************************************************************** def get_all_pro_by_jobid(self, jobId): reqSearchConsultant = """ - SELECT - """ + self.TABLEUSERINFO + """.userId, - lastname, firstname, capability - FROM + SELECT + """ + self.TABLEUSERINFO + """.userId, + lastname, firstname, capability + FROM """ + self.TABLEUSERINFO + """ INNER JOIN """ + self.TABLEUSERJOB + """ ON """ + self.TABLEUSERINFO + """.userId = """ + self.TABLEUSERJOB + """.userId - WHERE + WHERE jobCategoryId = %s""" self.exec_cmd(reqSearchConsultant, [jobId]) return self.cur.fetchall() @@ -65,18 +65,18 @@ class DbSearch(dbmain.DbMain): # Récupération des infos d'un pro par son nom def get_pro_info_by_lastname(self, lastname): reqSearchConsultant = """ - SELECT - """ + self.TABLEUSERINFO + """.userId, - lastname, firstname, capability - FROM + SELECT + """ + self.TABLEUSERINFO + """.userId, + lastname, firstname, capability + FROM """ + self.TABLEUSERINFO + """ - INNER JOIN - """ + self.TABLEUSERACCOUNT + """ - ON + INNER JOIN + """ + self.TABLEUSERACCOUNT + """ + ON """ + self.TABLEUSERINFO + """.userId = """ + self.TABLEUSERACCOUNT + """.userId - WHERE - userStatus = '1' - AND + WHERE + userStatus = '1' + AND lastname LIKE CONCAT('%', %s, '%')""" self.exec_cmd(reqSearchConsultant, [lastname]) return self.cur.fetchall() @@ -84,16 +84,16 @@ class DbSearch(dbmain.DbMain): # Récupération des emploies associés à un pro def get_pro_job_by_proid(self, proId): reqGetAll = """ - SELECT - """ + self.TABLEUSERJOB + """.jobCategoryId, - jobCategoryNameEn, jobCategoryNameFr - FROM + SELECT + """ + self.TABLEUSERJOB + """.jobCategoryId, + jobCategoryNameEn, jobCategoryNameFr + FROM """ + self.TABLEUSERJOB + """ - INNER JOIN + INNER JOIN """ + self.TABLEJOBCATEGORY + """ - ON + ON """ + self.TABLEUSERJOB + """.jobCategoryId = """ + self.TABLEJOBCATEGORY + """.jobCategoryId - WHERE + WHERE userId = %s""" self.exec_cmd(reqGetAll, [proId]) return self.cur.fetchall() @@ -101,15 +101,15 @@ class DbSearch(dbmain.DbMain): # Récupération des notes d'un consultant par son nom def get_pro_note_by_proid(self, proId): reqCountMission = """ - SELECT - note - FROM + SELECT + note + FROM """ + self.TABLEMISSION + """ - INNER JOIN - """ + self.TABLEUSERINFO + """ - ON + INNER JOIN + """ + self.TABLEUSERINFO + """ + ON """ + self.TABLEMISSION + """.proId = """ + self.TABLEUSERINFO + """.userId - WHERE + WHERE proId = %s""" self.exec_cmd(reqCountMission, [proId]) return self.cur.fetchall() @@ -120,9 +120,9 @@ class DbSearch(dbmain.DbMain): # Récupérer toutes les infos de la table jobCategory def get_job_all(self) -> list: reqGetAllJobs = """ - SELECT - * - FROM + SELECT + * + FROM """ + self.TABLEJOBCATEGORY self.exec_cmd(reqGetAllJobs) return self.cur.fetchall() @@ -130,9 +130,9 @@ class DbSearch(dbmain.DbMain): # Récupérer toutes les infos de la table jobCategory def get_job_by_jobid(self, jobId: int) -> list: reqGetJobinfo = """ - SELECT - * - FROM + SELECT + * + FROM """ + self.TABLEJOBCATEGORY + """ WHERE jobCategoryId = %s""" diff --git a/src/database/dbuser.py b/src/database/dbuser.py index a57845c..9fbfeb6 100644 --- a/src/database/dbuser.py +++ b/src/database/dbuser.py @@ -18,7 +18,7 @@ class DbUser(dbmain.DbMain): # **************************************************************************** # GESTION DES UTILISATEURS # **************************************************************************** - # Enregistrement d'un nouvel utilisateur + # Enregistrement d'un nouvel utilisateur def register_user(self, email: str, password: str, userStatus: int) -> int: # On vérifie si l'email existe deja dans la bdd exist = self.check_exist_email(email) @@ -28,10 +28,10 @@ class DbUser(dbmain.DbMain): passwordHash = self.crypt_pass(password) # Préparation de la requète reqAddUser = """ - INSERT INTO - """ + self.TABLEUSERACCOUNT + """ - (email, password, inscriptionDate, userStatus) - VALUES + INSERT INTO + """ + self.TABLEUSERACCOUNT + """ + (email, password, inscriptionDate, userStatus) + VALUES (%s, %s, %s, %s)""" # Execution de la requète self.exec_cmd( @@ -52,11 +52,11 @@ class DbUser(dbmain.DbMain): 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 + SELECT + userId, password + FROM """ + self.TABLEUSERACCOUNT + """ - WHERE + WHERE email = %s """ # Execution de la requète self.exec_cmd(reqCheckCredential, [email]) @@ -71,32 +71,32 @@ class DbUser(dbmain.DbMain): isPro: bool, oldJobs: list = None, newJobs: list = None) -> None: # Préparation de la requète pour mise à jour des infos reqAddInfoClient = """ - REPLACE INTO - """ + self.TABLEUSERINFO + """ + REPLACE INTO + """ + self.TABLEUSERINFO + """ (lastname, firstname, phoneNumber, adress, zipCode, city, userId) - VALUES + VALUES (%s, %s, %s, %s, %s, %s, %s)""" reqAddInfoPro = """ - REPLACE INTO - """ + self.TABLEUSERINFO + """ + 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 + INSERT INTO + """ + self.TABLEUSERJOB + """ + (jobCategoryId, userId) + VALUES (%s, %s)""" reqRemoveInfoProJobs = """ - DELETE FROM - """ + self.TABLEUSERJOB + """ - WHERE + DELETE FROM + """ + self.TABLEUSERJOB + """ + WHERE jobCategoryId = %s - AND + AND userId = %s""" if not isPro: userInfos.append(userId) @@ -118,11 +118,11 @@ class DbUser(dbmain.DbMain): 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 + SELECT + userId, tokenAutoLogin + FROM + """ + self.TABLEUSERACCOUNT + """ + WHERE email = %s""" # Exécution de la requète self.exec_cmd(reqCheckToken, [email]) @@ -135,11 +135,11 @@ class DbUser(dbmain.DbMain): 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 + UPDATE + """ + self.TABLEUSERACCOUNT + """ + SET tokenAutoLogin = %s - WHERE + WHERE email = %s""" # Execution de la requète self.exec_cmd(reqUpdateToken, [token, email]) @@ -148,11 +148,11 @@ class DbUser(dbmain.DbMain): 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 + UPDATE + """ + self.TABLEUSERACCOUNT + """ + SET + tokenAutoLogin = NULL + WHERE email = %s""" # Execution de la requète self.exec_cmd(reqDeleteToken, [email]) diff --git a/src/gui/globalMenu.py b/src/gui/globalMenu.py index 36a88c4..4625a54 100644 --- a/src/gui/globalMenu.py +++ b/src/gui/globalMenu.py @@ -3,33 +3,46 @@ from os.path import join from pathlib import Path from PyQt5.QtGui import QIcon from PyQt5.QtWidgets import QAction -from src.gui import windowAPropos, windowAdmin, windowUserInfo +from src.gui import windowAPropos, windowAdmin, windowUserInfo, windowMissions def init(mainWindow): - logo = join(Path(__file__).parent, "ressources", "icon.ico") + logo: str = join(Path(__file__).parent, "ressources", "icon.ico") mainWindow.setWindowIcon(QIcon(logo)) mainWindow.setWindowTitle("Alphajob") - menu = mainWindow.menuBar() + menu: object = mainWindow.menuBar() menu.clear() # Clear au cas où if mainWindow.userConnected and mainWindow.userStatus == "Admin": - menuAdmin = menu.addMenu("Admin") - btnEmplois = QAction("Gestion des emplois", mainWindow) + menuAdmin: object = menu.addMenu("Admin") + btnEmplois: object = QAction("Gestion des emplois", mainWindow) + btnUsers: object = QAction("Gestion des Utilisateurs", mainWindow) + btnMissions: object = QAction("Gestion des missions", mainWindow) btnEmplois.triggered.connect(lambda: windowAdmin.admin_emplois(mainWindow)) - btnUsers = QAction("Gestion des Utilisateurs", mainWindow) btnUsers.triggered.connect(lambda: windowAdmin.admin_users(mainWindow)) - btnMissions = QAction("Gestion des missions", mainWindow) btnMissions.triggered.connect(lambda: windowAdmin.admin_missions(mainWindow)) menuAdmin.addAction(btnEmplois) menuAdmin.addAction(btnUsers) menuAdmin.addAction(btnMissions) elif mainWindow.userConnected and ( mainWindow.userStatus == "Pro" or mainWindow.userStatus == "Client"): - menuUserInfos = menu.addMenu("Mes infos") - btnMesInfos = QAction("Gérer ses infos", mainWindow) + # Infos + menuUserInfos: object = menu.addMenu("Mes infos") + btnMesInfos: object = QAction("Gérer ses infos", mainWindow) btnMesInfos.triggered.connect(lambda: windowUserInfo.modif_infos(mainWindow)) menuUserInfos.addAction(btnMesInfos) + # Missions + menuMissions: object = menu.addMenu("Mes missions") + btnPendingMission: object = QAction("Missions en attente", mainWindow) + btnOngoignMission: object = QAction("Missions en cours", mainWindow) + btnCompletedMission: object = QAction("Missions en terminées", mainWindow) + btnPendingMission.triggered.connect(lambda: windowMissions.main(mainWindow, "pending")) + btnOngoignMission.triggered.connect(lambda: windowMissions.main(mainWindow, "ongoing")) + btnCompletedMission.triggered.connect(lambda: windowMissions.main(mainWindow, "completed")) + menuMissions.addAction(btnPendingMission) + menuMissions.addAction(btnOngoignMission) + menuMissions.addAction(btnCompletedMission) - menuOptions = menu.addMenu("Options") - btnApropos = QAction("A propos", mainWindow) + + menuOptions: object = menu.addMenu("Options") + btnApropos: object = QAction("A propos", mainWindow) btnApropos.triggered.connect(lambda: windowAPropos.main(mainWindow)) menuOptions.addAction(btnApropos) diff --git a/src/gui/pageHome.py b/src/gui/pageHome.py index 98a504f..03f8d81 100644 --- a/src/gui/pageHome.py +++ b/src/gui/pageHome.py @@ -1,7 +1,7 @@ from PyQt5.QtWidgets import ( QGroupBox, QPushButton, - QComboBox, QLineEdit, + QComboBox, QLineEdit, QHBoxLayout, QWidget, QVBoxLayout, QLabel ) @@ -47,7 +47,7 @@ def main(mainWindow, reloadMenu = False) -> None: inputRechercheNom = QLineEdit() btnRechercheNom = QPushButton("Rechercher") btnRechercheNom.clicked.connect( - lambda: + lambda: core_search_name( mainWindow, inputRechercheNom.text() @@ -60,9 +60,9 @@ def main(mainWindow, reloadMenu = False) -> None: comboRechercheCat.addItem("{0}".format(i[2]), i[0]) btnRechercheCat = QPushButton("Rechercher") btnRechercheCat.clicked.connect( - lambda: + lambda: core_search_id( - mainWindow, + mainWindow, comboRechercheCat.currentData() ) ) @@ -95,7 +95,7 @@ def main(mainWindow, reloadMenu = False) -> None: if hasattr(mainWindow, "mainWidget"): mainWindow.mainWidget.deleteLater() - + mainWindow.mainWidget = QWidget() mainWindow.mainWidget.setLayout(layoutMain) mainWindow.setCentralWidget(mainWindow.mainWidget) diff --git a/src/gui/pageLogin.py b/src/gui/pageLogin.py index 083ae84..e255dfb 100644 --- a/src/gui/pageLogin.py +++ b/src/gui/pageLogin.py @@ -32,7 +32,7 @@ def main(mainWindow) -> None: leditPassword.setEchoMode(QLineEdit.Password) btnConnexion = QPushButton("Connexion") btnConnexion.clicked.connect( - lambda: + lambda: core_login( mainWindow, leditMail.text(), @@ -46,7 +46,7 @@ def main(mainWindow) -> None: LayoutInfoConnexion.addWidget(labPassword, 1, 0) LayoutInfoConnexion.addWidget(leditPassword, 1, 1) LayoutInfoConnexion.addWidget(btnConnexion, 2, 1) - + layoutGroupConnexion = QHBoxLayout() layoutGroupConnexion.addStretch() layoutGroupConnexion.addLayout(LayoutInfoConnexion) diff --git a/src/gui/windowMissions.py b/src/gui/windowMissions.py new file mode 100644 index 0000000..d6fe57b --- /dev/null +++ b/src/gui/windowMissions.py @@ -0,0 +1,153 @@ + +from PyQt5.QtWidgets import ( + QDialog, QGroupBox, QLabel, + QVBoxLayout, QHBoxLayout, + QPushButton, QMessageBox, + QLineEdit, QComboBox +) +from src.database.dbmission import DbMission + + +def review_mission(dial: object, dbmission: object, missionId: int) -> None: + dialReview = QDialog(parent=dial) + + lineNote = QHBoxLayout() + labNote = QLabel("Note: ") + cmbNote = QComboBox() + for i in range(6): + cmbNote.addItem(str(i), i) + lineNote.addWidget(labNote) + lineNote.addStretch() + lineNote.addWidget(cmbNote) + + lineReview = QHBoxLayout() + labReview = QLabel("Avis: ") + inpReview = QLineEdit() + lineReview.addWidget(labReview) + lineReview.addStretch() + lineReview.addWidget(inpReview) + + lineBtn = QHBoxLayout() + btnValider = QPushButton("Valider") + btnValider.clicked.connect( + lambda: + [dbmission.review_mission(missionId, inpReview.text(), cmbNote.currentData()), + dbmission.validate_mission_client_by_missionid(missionId), + QMessageBox.information( + dial, + "Mission", + "La mission a été validée" + ), + dialReview.close()] + ) + lineBtn.addStretch() + lineBtn.addWidget(btnValider) + lineBtn.addStretch() + + + layReview = QVBoxLayout() + layReview.addLayout(lineNote) + layReview.addLayout(lineReview) + layReview.addLayout(lineBtn) + + grpMain = QGroupBox("Donnez votre avis") + grpMain.setLayout(layReview) + layMain = QVBoxLayout() + layMain.addWidget(grpMain) + + dialReview.setLayout(layMain) + dialReview.show() + + +def validate_mission(mainWindow: object, dial: object, missionId: int, status: str) -> None: + dbmission: object = DbMission(mainWindow) + if status == "acceptedByPro": + dbmission.accept_mission_by_missionid(missionId) + QMessageBox.information( + dial, + "Mission", + "La mission a bien été acceptée" + ) + elif status == "validatedByPro": + dbmission.validate_mission_pro_by_missionid(missionId) + QMessageBox.information( + dial, + "Mission", + "La mission a été validée" + ) + elif status == "validatedByClient": + review_mission(dial, dbmission, missionId) + + dial.close() + + +def get_missions_status(mainWindow: object, status: str) -> list: + dbmission: object = DbMission(mainWindow) + if mainWindow.userStatus == "Pro": + missionsAll: list = dbmission.get_mission_by_proid(mainWindow.userId) + elif mainWindow.userStatus == "Client": + missionsAll: list = dbmission.get_mission_by_clientid(mainWindow.userId) + + if status == "pending": + missionsPending = [list(i) for i in missionsAll if i[5] == None] + return missionsPending + elif status == "ongoing": + missionsOngoing = [list(i) for i in missionsAll if i[5] != None and (i[6] == None or i[7] == None)] + return missionsOngoing + elif status == "completed": + missionsCompleted = [list(i) for i in missionsAll if (i[6] != None and i[7] != None)] + return missionsCompleted + + +def main(mainWindow: object, status: str) -> None: + missions: list = get_missions_status(mainWindow, status) + dial: object = QDialog(parent = mainWindow) + + linesMission: list = [] + for mission in missions: + line = QHBoxLayout() + labMission = QLabel(" - ".join([str(i) for i in mission[1:] if i != None])) + line.addWidget(labMission) + if status == "pending" and mainWindow.userStatus == "Pro": + btnValidate = QPushButton("Valider") + btnValidate.clicked.connect( + lambda checked, missionId=mission[0]: + validate_mission(mainWindow, dial, missionId, "acceptedByPro") + ) + line.addStretch() + line.addWidget(btnValidate) + elif status == "ongoing" and mainWindow.userStatus == "Pro" and mission[7] == None: + btnValidate = QPushButton("Valider") + btnValidate.clicked.connect( + lambda checked, missionId=mission[0]: + validate_mission(mainWindow, dial, missionId, "validatedByPro") + ) + line.addStretch() + line.addWidget(btnValidate) + elif status == "ongoing" and mainWindow.userStatus == "Client" and mission[6] == None: + btnValidate = QPushButton("Valider") + btnValidate.clicked.connect( + lambda checked, missionId=mission[0]: + validate_mission(mainWindow, dial, missionId, "validatedByClient") + ) + line.addStretch() + line.addWidget(btnValidate) + + linesMission.append(line) + + layMission = QVBoxLayout() + for i in linesMission: + layMission.addLayout(i) + + if status == "pending": + grpMain = QGroupBox("Missions en attente") + elif status == "ongoing": + grpMain = QGroupBox("Missions en cours") + elif status == "completed": + grpMain = QGroupBox("Missions terminées") + + grpMain.setLayout(layMission) + layMain = QVBoxLayout() + layMain.addWidget(grpMain) + dial.setLayout(layMain) + dial.show() diff --git a/src/gui/windowRecherche.py b/src/gui/windowRecherche.py index c86bcc9..dd71f08 100644 --- a/src/gui/windowRecherche.py +++ b/src/gui/windowRecherche.py @@ -23,11 +23,10 @@ def more_infos(mainWindow, proId): "Ville", ] text: list = [] - print(resRecherche) for i in range(len(resRecherche)): text.append(f"{label[i]}: {resRecherche[i]}") - QMessageBox.information( + QMessageBox.information( mainWindow, "Informations du pro", "\n".join(text) diff --git a/src/gui/windowUserInfo.py b/src/gui/windowUserInfo.py index ccdcb27..e0a9b08 100644 --- a/src/gui/windowUserInfo.py +++ b/src/gui/windowUserInfo.py @@ -15,7 +15,7 @@ def add_job(jobName: str, jobId: int, listMyJobs: list, layMyJobs: object) -> No labJob: object = QLabel(jobName) btnRemoveJob: object = QPushButton("Supprimer") btnRemoveJob.clicked.connect( - lambda checked, jId=jobId, layItem=lineMyJobs: [ + lambda checked, jId=jobId, layItem=lineMyJobs: [ listMyJobs.remove(jId), delete_job(layItem) ] @@ -25,6 +25,7 @@ def add_job(jobName: str, jobId: int, listMyJobs: list, layMyJobs: object) -> No lineMyJobs.addWidget(btnRemoveJob) layMyJobs.addLayout(lineMyJobs) + def delete_job(layLineJob: object) -> None: lab: object = layLineJob.itemAt(0).widget() btn: object = layLineJob.itemAt(2).widget() @@ -32,6 +33,7 @@ def delete_job(layLineJob: object) -> None: btn.deleteLater() layLineJob.deleteLater() + def validate(mainWindow: object, dial: object, layoutLines: list, oldJobs: list = None, newJobs: list = None) -> None: user: object = DbUser(mainWindow = mainWindow) userInfos: list = [] @@ -59,7 +61,7 @@ def validate(mainWindow: object, dial: object, layoutLines: list, oldJobs: list "Mes informations", "Modification enregistrée" ) - + # https://stackoverflow.com/questions/3077192/get-a-layouts-widgets-in-pyqt def modif_infos(mainWindow: object) -> None: @@ -117,7 +119,7 @@ def modif_infos(mainWindow: object) -> None: layoutLines[i].addWidget(QLineEdit(maxLength=6)) else: layoutLines[i].addWidget(QLineEdit(maxLength=128)) - + if mainWindow.userStatus == "Pro": allJobs: object = search.get_job_all() labSelectJobs: object = QLabel("Les emplois:") @@ -133,7 +135,7 @@ def modif_infos(mainWindow: object) -> None: cmbAllJobs.currentData(), newJobs, layMyJobs - ) + ) ) lineSelectJobs.addWidget(labSelectJobs) lineSelectJobs.addStretch() @@ -163,14 +165,14 @@ def modif_infos(mainWindow: object) -> None: modifLayout: object = QVBoxLayout() for i in layoutLines: modifLayout.addLayout(layoutLines[i]) - + btnModif: object = QPushButton("modifer") btnModif.clicked.connect( - lambda: + lambda: validate( mainWindow, dial, - layoutLines, + layoutLines, oldJobs, newJobs ) if mainWindow.userStatus == "Pro" diff --git a/src/main.py b/src/main.py index bbff713..8ea9c2c 100644 --- a/src/main.py +++ b/src/main.py @@ -11,10 +11,10 @@ class mainWindow(QMainWindow): mysqlReachable: bool = False - userConnected: bool = False - userId: str = "" + userConnected: bool = True + userId: str = "24" userEmail: str = "" - userStatus: str = "" + userStatus: str = "Client" userInscrDate: str = "" def __init__(self) -> None: diff --git a/src/setup.py b/src/setup.py index 56e2478..db06109 100644 --- a/src/setup.py +++ b/src/setup.py @@ -1,4 +1,7 @@ from os import system -system("pyinstaller -w -i ./gui/ressources/icon.ico main.py") + +res = system("pyinstaller -w -i .\\gui\\ressources\\icon.ico main.py") +if res == 0: + system(".\\dist\\main\\main.exe") |
