diff options
| author | Debulois <quentin@debulois.fr> | 2022-04-29 11:15:04 +0200 |
|---|---|---|
| committer | Debulois <quentin@debulois.fr> | 2022-04-29 11:15:04 +0200 |
| commit | afd6fb901b7e8f99cdb1bb0d2134cec2d6cebc3b (patch) | |
| tree | f114b68fc1ede894da52e688ce29054b2774edc4 | |
| parent | 503d62407ce57bebfec5e7134b603d50e58c48da (diff) | |
Ajout de la gestion de ses infos
| -rw-r--r-- | src/core/coreUser.py | 4 | ||||
| -rw-r--r-- | src/database/dbuser.py | 46 | ||||
| -rw-r--r-- | src/gui/globalMenu.py | 17 | ||||
| -rw-r--r-- | src/gui/pageHome.py | 8 | ||||
| -rw-r--r-- | src/gui/windowUserInfo.py | 193 | ||||
| -rw-r--r-- | src/main.py | 24 | ||||
| -rw-r--r-- | src/main.spec | 51 | ||||
| -rw-r--r-- | src/setup.py | 4 |
8 files changed, 295 insertions, 52 deletions
diff --git a/src/core/coreUser.py b/src/core/coreUser.py index de9ccb8..b8129d4 100644 --- a/src/core/coreUser.py +++ b/src/core/coreUser.py @@ -19,7 +19,7 @@ def core_login(mainWindow, email, password) -> None: mainWindow.userConnected = True mainWindow.userId = str(search[0][0]) mainWindow.userEmail = search[0][1] - mainWindow.userInscriptionDate = search[0][2] + mainWindow.userInscrDate = search[0][2] if search[0][3] == 0: mainWindow.userStatus = "Admin" elif search[0][3] == 1: @@ -46,7 +46,7 @@ def core_logout(mainWindow) -> None: mainWindow.userConnected = False mainWindow.userId = "" mainWindow.userEmail = "" - mainWindow.userInscriptionDate = "" + mainWindow.userInscrDate = "" mainWindow.userStatus = "" QMessageBox.information( diff --git a/src/database/dbuser.py b/src/database/dbuser.py index e71d936..a57845c 100644 --- a/src/database/dbuser.py +++ b/src/database/dbuser.py @@ -66,11 +66,10 @@ class DbUser(dbmain.DbMain): return result[0] # Mise à jour des infos d'un utilisateur - def update_user_infos(self, userInfos, userId, isPro, userJobs=None): + def update_user_infos( + self, userInfos: list, userId: int, + isPro: bool, oldJobs: list = None, newJobs: list = None) -> 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 + """ @@ -94,36 +93,23 @@ class DbUser(dbmain.DbMain): (%s, %s)""" reqRemoveInfoProJobs = """ DELETE FROM - """ + self.tableUserJob + """ + """ + 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)) + if not isPro: + userInfos.append(userId) + self.exec_cmd(reqAddInfoClient, userInfos, True) + else: + userInfos.append(userId) + self.exec_cmd(reqAddInfoPro, userInfos, True) + jobsAdded = [i for i in newJobs if i not in oldJobs] + jobsRemoved = [i for i in oldJobs if i not in newJobs] + for i in jobsAdded: + self.exec_cmd(reqAddInfoProJobs, [i, userId], True) + for i in jobsRemoved: + self.exec_cmd(reqRemoveInfoProJobs, [i, userId], True) # **************************************************************************** # GESTION DU TOKEN AUTOLOGIN diff --git a/src/gui/globalMenu.py b/src/gui/globalMenu.py index b558ef3..36a88c4 100644 --- a/src/gui/globalMenu.py +++ b/src/gui/globalMenu.py @@ -3,7 +3,7 @@ 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 +from src.gui import windowAPropos, windowAdmin, windowUserInfo def init(mainWindow): logo = join(Path(__file__).parent, "ressources", "icon.ico") @@ -11,10 +11,6 @@ def init(mainWindow): mainWindow.setWindowTitle("Alphajob") menu = mainWindow.menuBar() menu.clear() # Clear au cas où - menuOptions = menu.addMenu("Options") - btnApropos = QAction("A propos", mainWindow) - btnApropos.triggered.connect(lambda: windowAPropos.main(mainWindow)) - menuOptions.addAction(btnApropos) if mainWindow.userConnected and mainWindow.userStatus == "Admin": menuAdmin = menu.addMenu("Admin") btnEmplois = QAction("Gestion des emplois", mainWindow) @@ -26,3 +22,14 @@ def init(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) + btnMesInfos.triggered.connect(lambda: windowUserInfo.modif_infos(mainWindow)) + menuUserInfos.addAction(btnMesInfos) + + menuOptions = menu.addMenu("Options") + btnApropos = 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 016d374..98a504f 100644 --- a/src/gui/pageHome.py +++ b/src/gui/pageHome.py @@ -43,7 +43,8 @@ def main(mainWindow, reloadMenu = False) -> None: grpUtilisateur = QGroupBox("Gestion de l'utilisateur") grpUtilisateur.setLayout(layoutUser) - inputRechercheNom = QLineEdit("Nom d'un pro") + labRechercheNom = QLabel("Par nom") + inputRechercheNom = QLineEdit() btnRechercheNom = QPushButton("Rechercher") btnRechercheNom.clicked.connect( lambda: @@ -52,6 +53,7 @@ def main(mainWindow, reloadMenu = False) -> None: inputRechercheNom.text() ) ) + labRechercheCat = QLabel("Par emploi") comboRechercheCat = QComboBox() alljobs = classSearch.get_job_all() for i in alljobs: @@ -66,9 +68,11 @@ def main(mainWindow, reloadMenu = False) -> None: ) layoutRechercheNom = QVBoxLayout() + layoutRechercheNom.addWidget(labRechercheNom) layoutRechercheNom.addWidget(inputRechercheNom) layoutRechercheNom.addWidget(btnRechercheNom) layoutRechercheCat = QVBoxLayout() + layoutRechercheCat.addWidget(labRechercheCat) layoutRechercheCat.addWidget(comboRechercheCat) layoutRechercheCat.addWidget(btnRechercheCat) @@ -79,7 +83,7 @@ def main(mainWindow, reloadMenu = False) -> None: layoutRecherche.addLayout(layoutRechercheCat) layoutRecherche.addStretch() - grpRecherche = QGroupBox("Recherche par nom ou emploi") + grpRecherche = QGroupBox("Recherche") grpRecherche.setLayout(layoutRecherche) layoutMain = QVBoxLayout() diff --git a/src/gui/windowUserInfo.py b/src/gui/windowUserInfo.py new file mode 100644 index 0000000..ccdcb27 --- /dev/null +++ b/src/gui/windowUserInfo.py @@ -0,0 +1,193 @@ + +from PyQt5.QtWidgets import ( + QDialog, QGroupBox, QLabel, + QLineEdit, QVBoxLayout, QHBoxLayout, + QPushButton, QComboBox, QMessageBox +) +from src.database.dbuser import DbUser +from src.database.dbsearch import DbSearch + + +def add_job(jobName: str, jobId: int, listMyJobs: list, layMyJobs: object) -> None: + if jobId not in listMyJobs: + listMyJobs.append(jobId) + lineMyJobs: object = QHBoxLayout() + labJob: object = QLabel(jobName) + btnRemoveJob: object = QPushButton("Supprimer") + btnRemoveJob.clicked.connect( + lambda checked, jId=jobId, layItem=lineMyJobs: [ + listMyJobs.remove(jId), + delete_job(layItem) + ] + ) + lineMyJobs.addWidget(labJob) + lineMyJobs.addStretch() + lineMyJobs.addWidget(btnRemoveJob) + layMyJobs.addLayout(lineMyJobs) + +def delete_job(layLineJob: object) -> None: + lab: object = layLineJob.itemAt(0).widget() + btn: object = layLineJob.itemAt(2).widget() + lab.deleteLater() + 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 = [] + for i in layoutLines: + if i != "selectJobs" and i != "myJobs": + lineInput: object = layoutLines[i].itemAt(2).widget() + userInfos.append(lineInput.text()) + + if mainWindow.userStatus == "Pro": + isPro: bool = True + else: + isPro: bool = False + + if "" in userInfos: + QMessageBox.warning( + dial, + "Mes informations", + "Veuillez renseigner tous les champs" + ) + return + + user.update_user_infos(userInfos, mainWindow.userId, isPro, oldJobs, newJobs) + QMessageBox.information( + dial, + "Mes informations", + "Modification enregistrée" + ) + + +# https://stackoverflow.com/questions/3077192/get-a-layouts-widgets-in-pyqt +def modif_infos(mainWindow: object) -> None: + dial: object = QDialog(parent = mainWindow) + dial.setWindowTitle("Mes infos") + + search: object = DbSearch(mainWindow) + infos: list = search.get_user_info_by_userid(mainWindow.userId) + + if infos: + champsClients: dict = { + "Nom": infos[0][1], + "Prénom": infos[0][2], + "Téléphone": infos[0][6], + "Addresse": infos[0][7], + "Code postal": infos[0][8], + "ville": infos[0][9] + } + champsPro: dict = { + "Diplôme": infos[0][3], + "Capacités": infos[0][4], + "Description": infos[0][5] + } + else: + champsClients: list = [ + "Nom", + "Prénom", + "Téléphone", + "Addresse", + "Code postal", + "ville" + ] + champsPro: list =[ + "Diplôme", + "Capacités", + "Description" + ] + + layoutLines: list = {} + for i in champsClients: + layoutLines[i] = QHBoxLayout() + layoutLines[i].addWidget(QLabel(i)) + layoutLines[i].addStretch() + if infos: + if i == "Téléphone": + layoutLines[i].addWidget(QLineEdit(champsClients[i], maxLength=10)) + elif i == "Code postal": + layoutLines[i].addWidget(QLineEdit(champsClients[i], maxLength=6)) + else: + layoutLines[i].addWidget(QLineEdit(champsClients[i], maxLength=128)) + else: + if i == "Téléphone": + layoutLines[i].addWidget(QLineEdit(maxLength=10)) + elif i == "Code postal": + 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:") + cmbAllJobs: object = QComboBox() + lineSelectJobs: object = QHBoxLayout() + for i in allJobs: + cmbAllJobs.addItem(f"{i[2]}", i[0]) + btnSelectJobs = QPushButton("Ajouter") + btnSelectJobs.clicked.connect( + lambda : + add_job( + cmbAllJobs.currentText(), + cmbAllJobs.currentData(), + newJobs, + layMyJobs + ) + ) + lineSelectJobs.addWidget(labSelectJobs) + lineSelectJobs.addStretch() + lineSelectJobs.addWidget(cmbAllJobs) + lineSelectJobs.addStretch() + lineSelectJobs.addWidget(btnSelectJobs) + layoutLines["selectJobs"] = lineSelectJobs + + myJobs: object = search.get_pro_job_by_proid(mainWindow.userId) + layMyJobs: object = QVBoxLayout() + newJobs: list = [] + for i in myJobs: + add_job(i[2], i[0], newJobs, layMyJobs) + oldJobs: list = newJobs.copy() # Sinon pointer !!! + + layoutLines["myJobs"] = layMyJobs + + for i in champsPro: + layoutLines[i] = QHBoxLayout() + layoutLines[i].addWidget(QLabel(i)) + layoutLines[i].addStretch() + if infos: + layoutLines[i].addWidget(QLineEdit(champsPro[i], maxLength=256)) + else: + layoutLines[i].addWidget(QLineEdit(maxLength=256)) + + modifLayout: object = QVBoxLayout() + for i in layoutLines: + modifLayout.addLayout(layoutLines[i]) + + btnModif: object = QPushButton("modifer") + btnModif.clicked.connect( + lambda: + validate( + mainWindow, + dial, + layoutLines, + oldJobs, + newJobs + ) if mainWindow.userStatus == "Pro" + else validate( + mainWindow, + dial, + layoutLines + ) + ) + layoutBtn: object = QHBoxLayout() + layoutBtn.addStretch() + layoutBtn.addWidget(btnModif) + modifLayout.addLayout(layoutBtn) + + grpMain: object = QGroupBox("Mes infos") + grpMain.setLayout(modifLayout) + mainLayout: object = QVBoxLayout() + mainLayout.addWidget(grpMain) + dial.setLayout(mainLayout) + dial.show() diff --git a/src/main.py b/src/main.py index bc4950e..bbff713 100644 --- a/src/main.py +++ b/src/main.py @@ -1,24 +1,22 @@ -from sys import argv +import sys from PyQt5.QtWidgets import QMainWindow, QApplication from src.gui import pageHome from src.gui import globalMenu -""" -https://peps.python.org/pep-0008/ -'python a = lambda a, b: truc' = 'js a = (a, b) => {truc}' = Fonction anonyme -""" class mainWindow(QMainWindow): + VERSION = 0.1 - # Misc + mysqlReachable: bool = False - # Utilisateur + userConnected: bool = False - userId: str = "" - userEmail: str = "" - userInscriptionDate: str = "" - userStatus: str = "" + userId: str = "" + userEmail: str = "" + userStatus: str = "" + userInscrDate: str = "" + def __init__(self) -> None: super().__init__() # Déclenche l'"__init__" de QMainWindow globalMenu.init(self) @@ -29,9 +27,9 @@ if __name__ == "__main__": def main(): """Démarrage de l'app """ - APP = QApplication(argv) + APP = QApplication(sys.argv) GUI = mainWindow() GUI.show() - exit(APP.exec_()) + sys.exit(APP.exec_()) main() diff --git a/src/main.spec b/src/main.spec new file mode 100644 index 0000000..47ce1af --- /dev/null +++ b/src/main.spec @@ -0,0 +1,51 @@ +# -*- mode: python ; coding: utf-8 -*- + + +block_cipher = None + + +a = Analysis( + ['main.py'], + pathex=[], + binaries=[], + datas=[], + hiddenimports=[], + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + win_no_prefer_redirects=False, + win_private_assemblies=False, + cipher=block_cipher, + noarchive=False, +) +pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) + +exe = EXE( + pyz, + a.scripts, + [], + exclude_binaries=True, + name='main', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + console=False, + disable_windowed_traceback=False, + argv_emulation=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None, + icon='gui\\ressources\\icon.ico', +) +coll = COLLECT( + exe, + a.binaries, + a.zipfiles, + a.datas, + strip=False, + upx=True, + upx_exclude=[], + name='main', +) diff --git a/src/setup.py b/src/setup.py new file mode 100644 index 0000000..56e2478 --- /dev/null +++ b/src/setup.py @@ -0,0 +1,4 @@ + +from os import system + +system("pyinstaller -w -i ./gui/ressources/icon.ico main.py") |
