diff options
Diffstat (limited to 'src/app')
| -rw-r--r-- | src/app/__init__.py | 0 | ||||
| -rw-r--r-- | src/app/mainHome.py | 155 | ||||
| -rw-r--r-- | src/app/mainLogin.py | 113 | ||||
| -rw-r--r-- | src/app/mainLogout.py | 18 | ||||
| -rw-r--r-- | src/app/mainMenuBar.py | 52 | ||||
| -rw-r--r-- | src/app/mainRegister.py | 177 | ||||
| -rw-r--r-- | src/app/ressources/icon.ico | bin | 0 -> 41662 bytes | |||
| -rw-r--r-- | src/app/windowAPropos.py | 15 | ||||
| -rw-r--r-- | src/app/windowAdmin.py | 268 | ||||
| -rw-r--r-- | src/app/windowMissions.py | 156 | ||||
| -rw-r--r-- | src/app/windowRecherche.py | 150 | ||||
| -rw-r--r-- | src/app/windowUserInfo.py | 199 |
12 files changed, 1303 insertions, 0 deletions
diff --git a/src/app/__init__.py b/src/app/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/src/app/__init__.py diff --git a/src/app/mainHome.py b/src/app/mainHome.py new file mode 100644 index 0000000..a366c66 --- /dev/null +++ b/src/app/mainHome.py @@ -0,0 +1,155 @@ + +from PyQt5.QtWidgets import ( + QGroupBox, QPushButton, + QComboBox, QLineEdit, + QHBoxLayout, QWidget, + QVBoxLayout, QLabel, + QMessageBox +) +from src.app import ( + mainLogin, mainRegister, + mainMenuBar, windowRecherche, + mainLogout +) +from src.database.dbsearch import DbSearch + + +def core_search_id(mainWindow: object, jobId: int) -> None: + """""" + dbsearch: object = DbSearch(mainWindow) + resRecherche: list = dbsearch.get_all_pro_by_jobid(jobId) + if resRecherche: + core_search_main(mainWindow, resRecherche) + else: + QMessageBox.information( + mainWindow, + "Résultat", + "Aucun résultat." + ) + + +def core_search_name(mainWindow: object, name: str) -> None: + """""" + dbsearch: object = DbSearch(mainWindow) + resRecherche: tuple = dbsearch.get_pro_info_by_lastname(name) + if resRecherche: + core_search_main(mainWindow, resRecherche) + else: + QMessageBox.information( + mainWindow, + "Résultat", + "Aucun résultat." + ) + + +def core_search_main(mainWindow: object, resRecherche: tuple) -> None: + """""" + dbsearch: object = DbSearch(mainWindow) + results: list = [] + for i in resRecherche: + proInfo: dict = {} + proInfo["id"] = i[0] + resJobs = dbsearch.get_pro_job_by_proid(proInfo["id"]) + proInfo["text"] = list(i[1:]) + proInfo["text"].insert(2, ", ".join([j[2] for j in resJobs])) + proInfo["text"] = " - ".join(proInfo["text"]) + results.append(proInfo) + + windowRecherche.window_main(mainWindow, results) + + +def window_main(mainWindow, reloadMenu = False) -> None: + """""" + if reloadMenu: + mainMenuBar.menu_init(mainWindow) + + dbsearch: object = DbSearch(mainWindow) + # + if not mainWindow.userConnected: + connState: object = QLabel("Non connecté.") + else: + connState: object = QLabel( + f"Connecté: {mainWindow.userEmail} - {mainWindow.userStatus}" + ) + + if not mainWindow.userConnected: + btnConnexion: object = QPushButton("Connexion") + btnConnexion.clicked.connect(lambda: mainLogin.window_main(mainWindow)) + else: + btnDeconnexion: object = QPushButton("Déconnexion") + btnDeconnexion.clicked.connect(lambda: [ + mainLogout.core_logout(mainWindow), + window_main(mainWindow, True) + ] + ) + + btnInscription: object = QPushButton("Inscription") + btnInscription.clicked.connect(lambda: mainRegister.window_main(mainWindow)) + # + layUser: object = QHBoxLayout() + layUser.addStretch() + layUser.addWidget(btnInscription) + if not mainWindow.userConnected: + layUser.addWidget(btnConnexion) + else: + layUser.addWidget(btnDeconnexion) + + grpUser: object = QGroupBox("Gestion de l'utilisateur") + grpUser.setLayout(layUser) + # + labRechercheNom: object = QLabel("Par nom") + inputRechercheNom: object = QLineEdit(maxLength=128) + btnRechercheNom: object = QPushButton("Rechercher") + btnRechercheNom.clicked.connect( + lambda: + core_search_name( + mainWindow, + inputRechercheNom.text() + ) + ) + labRechercheCat: object = QLabel("Par emploi") + cmbRechercheCat: object = QComboBox() + alljobs: list = dbsearch.get_job_all() + for i in alljobs: + cmbRechercheCat.addItem("{0}".format(i[2]), i[0]) + btnRechercheCat: object = QPushButton("Rechercher") + btnRechercheCat.clicked.connect( + lambda: + core_search_id( + mainWindow, + cmbRechercheCat.currentData() + ) + ) + # + layRechercheNom: object = QVBoxLayout() + layRechercheNom.addWidget(labRechercheNom) + layRechercheNom.addWidget(inputRechercheNom) + layRechercheNom.addWidget(btnRechercheNom) + layRechercheCat: object = QVBoxLayout() + layRechercheCat.addWidget(labRechercheCat) + layRechercheCat.addWidget(cmbRechercheCat) + layRechercheCat.addWidget(btnRechercheCat) + # + layRecherche: object = QHBoxLayout() + layRecherche.addStretch() + layRecherche.addLayout(layRechercheNom) + layRecherche.addStretch() + layRecherche.addLayout(layRechercheCat) + layRecherche.addStretch() + # + grpRecherche: object = QGroupBox("Recherche") + grpRecherche.setLayout(layRecherche) + # + layMain: object = QVBoxLayout() + layMain.addWidget(connState) + layMain.addWidget(grpUser) + layMain.addStretch() + layMain.addWidget(grpRecherche) + layMain.addStretch() + # + if hasattr(mainWindow, "mainWidget"): + mainWindow.mainWidget.deleteLater() + + mainWindow.mainWidget = QWidget() + mainWindow.mainWidget.setLayout(layMain) + mainWindow.setCentralWidget(mainWindow.mainWidget) diff --git a/src/app/mainLogin.py b/src/app/mainLogin.py new file mode 100644 index 0000000..617df73 --- /dev/null +++ b/src/app/mainLogin.py @@ -0,0 +1,113 @@ + +from PyQt5.QtWidgets import ( + QPushButton, QHBoxLayout, + QGroupBox, QLabel, + QLineEdit, QWidget, + QVBoxLayout, QGridLayout, + QMessageBox +) +from src.app import mainHome, mainRegister +from src.database.dbuser import DbUser +from src.database.dbsearch import DbSearch + + +def core_login(mainWindow: object, email: str, password: str) -> None: + """""" + dbuser: object = DbUser(mainWindow) + dbsearch: object = DbSearch(mainWindow) + if dbuser.check_exist_email(email): + userId = dbuser.check_user_credential(email, password) + if userId: + userAccount = dbsearch.get_user_account_by_userid(userId)[0] + QMessageBox.information( + mainWindow, + "Connexion", + "Vous êtes connecté" + ) + mainWindow.userConnected = True + mainWindow.userId = userId + mainWindow.userEmail = userAccount[1] + mainWindow.userInscrDate = userAccount[2] + if userAccount[3] == 0: + mainWindow.userStatus = "Admin" + elif userAccount[3] == 1: + mainWindow.userStatus = "Pro" + elif userAccount[3] == 2: + mainWindow.userStatus = "Client" + mainHome.window_main(mainWindow, True) + else: + QMessageBox.warning( + mainWindow, + "Connexion", + "Mauvaise combinaison mail & mot de passe" + ) + else: + QMessageBox.warning( + mainWindow, + "Connexion", + "Mauvais email" + ) + + +def window_main(mainWindow: object) -> None: + """""" + if not mainWindow.userConnected: + connState: object = QLabel("Non connecté.") + else: + connState: object = QLabel( + f"Connecté: {mainWindow.userEmail} - {mainWindow.userStatus}" + ) + + btnAccueil: object = QPushButton("Accueil") + btnAccueil.clicked.connect(lambda: mainHome.window_main(mainWindow)) + btnInscription: object = QPushButton("Inscription") + btnInscription.clicked.connect(lambda: mainRegister.window_main(mainWindow)) + # + layUser: object = QHBoxLayout() + layUser.addWidget(btnAccueil) + layUser.addStretch() + layUser.addWidget(btnInscription) + grpUtilisateur: object = QGroupBox("Gestion de l'utilisateur") + grpUtilisateur.setLayout(layUser) + # + labMail: object = QLabel("Email") + inpMail: object = QLineEdit(maxLength=128) + labPassword: object = QLabel("Mot de passe") + inpPassword: object = QLineEdit(maxLength=128) + inpPassword.setEchoMode(QLineEdit.Password) + btnConnexion: object = QPushButton("Connexion") + btnConnexion.clicked.connect( + lambda: + core_login( + mainWindow, + inpMail.text(), + inpPassword.text() + ) + ) + # + layGrid: object = QGridLayout() + layGrid.addWidget(labMail, 0, 0) + layGrid.addWidget(inpMail, 0, 1) + layGrid.addWidget(labPassword, 1, 0) + layGrid.addWidget(inpPassword, 1, 1) + layGrid.addWidget(btnConnexion, 2, 1) + # + layLogin: object = QHBoxLayout() + layLogin.addStretch() + layLogin.addLayout(layGrid) + layLogin.addStretch() + # + grpLogin: object = QGroupBox("Connexion") + grpLogin.setLayout(layLogin) + # + layMain: object = QVBoxLayout() + layMain.addWidget(connState) + layMain.addWidget(grpUtilisateur) + layMain.addStretch() + layMain.addWidget(grpLogin) + layMain.addStretch() + # + mainWindow.mainWidget.deleteLater() + mainWindow.mainWidget = QWidget() + mainWindow.mainWidget.setLayout(layMain) + mainWindow.setCentralWidget(mainWindow.mainWidget) diff --git a/src/app/mainLogout.py b/src/app/mainLogout.py new file mode 100644 index 0000000..4df4273 --- /dev/null +++ b/src/app/mainLogout.py @@ -0,0 +1,18 @@ + +from PyQt5.QtWidgets import QMessageBox + + +def core_logout(mainWindow: object) -> None: + """""" + if mainWindow.userConnected == True: + mainWindow.userConnected = False + mainWindow.userId = "" + mainWindow.userEmail = "" + mainWindow.userInscrDate = "" + mainWindow.userStatus = "" + + QMessageBox.information( + mainWindow, + "Déconnection", + "Vous êtes déconnecté." + ) diff --git a/src/app/mainMenuBar.py b/src/app/mainMenuBar.py new file mode 100644 index 0000000..3ab0090 --- /dev/null +++ b/src/app/mainMenuBar.py @@ -0,0 +1,52 @@ + +from os.path import join +from pathlib import Path +from PyQt5.QtGui import QIcon +from PyQt5.QtWidgets import QAction +from src.app import ( + windowAPropos, windowAdmin, + windowUserInfo, windowMissions +) + + +def menu_init(mainWindow: object) -> None: + """""" + logo: str = join(Path(__file__).parent, "ressources", "icon.ico") + mainWindow.setWindowIcon(QIcon(logo)) + mainWindow.setWindowTitle("Alphajob") + menu: object = mainWindow.menuBar() + menu.clear() # Clear au cas où + if mainWindow.userConnected and mainWindow.userStatus == "Admin": + 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.window_admin_emplois(mainWindow)) + btnUsers.triggered.connect(lambda: windowAdmin.window_admin_users(mainWindow)) + btnMissions.triggered.connect(lambda: windowAdmin.window_admin_missions(mainWindow)) + menuAdmin.addAction(btnEmplois) + menuAdmin.addAction(btnUsers) + menuAdmin.addAction(btnMissions) + elif mainWindow.userConnected and ( + mainWindow.userStatus == "Pro" or mainWindow.userStatus == "Client"): + # Infos + menuUserInfos: object = menu.addMenu("Mes infos") + btnMesInfos: object = QAction("Gérer ses infos", mainWindow) + btnMesInfos.triggered.connect(lambda: windowUserInfo.window_main(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.window_main(mainWindow, "pending")) + btnOngoignMission.triggered.connect(lambda: windowMissions.window_main(mainWindow, "ongoing")) + btnCompletedMission.triggered.connect(lambda: windowMissions.window_main(mainWindow, "completed")) + menuMissions.addAction(btnPendingMission) + menuMissions.addAction(btnOngoignMission) + menuMissions.addAction(btnCompletedMission) + + menuOptions: object = menu.addMenu("Options") + btnApropos: object = QAction("A propos", mainWindow) + btnApropos.triggered.connect(lambda: windowAPropos.window_main(mainWindow)) + menuOptions.addAction(btnApropos) diff --git a/src/app/mainRegister.py b/src/app/mainRegister.py new file mode 100644 index 0000000..ce9486f --- /dev/null +++ b/src/app/mainRegister.py @@ -0,0 +1,177 @@ + +import re +from PyQt5.QtWidgets import ( + QPushButton, QHBoxLayout, + QGroupBox, QLabel, + QLineEdit, QWidget, + QVBoxLayout, QComboBox, + QGridLayout, QMessageBox +) +from src.app import mainLogin, mainHome, mainLogout +from src.database.dbuser import DbUser + + +def core_register(mainWindow: object, email: str, password: str, userStatus: str) -> None: + """""" + dbuser: object = DbUser(mainWindow) + regNumb: str = "[0-9]" + regUpper: str = "[A-Z]" + regSpecial: str = "[`!@#$%^&*()_+\-=\[\]{};':\"\\|,.<>\/?~µ°€£]" + regEmail: str = "^[a-z0-9._-]+@[a-z0-9-]+\.[a-z]+" + # Si vide + if not email: + QMessageBox.warning( + mainWindow, + "Email invalide", + "Veuillez renseigner un email" + ) + return + + if not password: + QMessageBox.warning( + mainWindow, + "Mot de passe invalide", + "Veuillez renseigner un mot de passe" + ) + return + + if userStatus == None: + QMessageBox.warning( + mainWindow, + "Mauvais rôle", + "Veuillez selectionner un rôle" + ) + return + + # les regex + if not re.fullmatch(regEmail, email): + QMessageBox.warning( + mainWindow, + "Email invalid", + "Email non conforme" + ) + return + + if len(password) < 8\ + or not re.search(regNumb, password)\ + or not re.search(regUpper, password)\ + or not re.search(regSpecial, password): + QMessageBox.warning( + mainWindow, + "Mot de passe invalide", + ("Le mot de passe doit avoir:\n" + "-Au moins 8 characters\n" + "-Une majuscule\n" + "-Un chiffre\n" + "-Un character spécial") + ) + return + + # si email deja présent + if dbuser.check_exist_email(email): + QMessageBox.warning( + mainWindow, + "Email invalid", + "Email déja utilisé" + ) + return + + succes: int = dbuser.register_user(email, password, userStatus) + if succes: + QMessageBox.information( + mainWindow, + "Inscription", + "Inscription réussie!" + ) + mainHome.window_main(mainWindow) + else: + QMessageBox.warning( + mainWindow, + "Erreur bdd", + "Erreur lors de l'inscritpion" + ) + + +def window_main(mainWindow: object) -> None: + """""" + if not mainWindow.userConnected: + connexionState: object = QLabel("Non connecté.") + else: + connexionState: object = QLabel( + f"Connecté: {mainWindow.userEmail} - {mainWindow.userStatus}" + ) + + btnAccueil: object = QPushButton("Accueil") + btnAccueil.clicked.connect(lambda: mainHome.window_main(mainWindow)) + # + if not mainWindow.userConnected: + btnConnexion: object = QPushButton("Connexion") + btnConnexion.clicked.connect(lambda: mainLogin.window_main(mainWindow)) + else: + btnDeconnexion: object = QPushButton("Déconnexion") + btnDeconnexion.clicked.connect( + lambda: [ + mainLogout.core_logout(mainWindow), + mainHome.window_main(mainWindow, True) + ] + ) + + layoutUser: object = QHBoxLayout() + layoutUser.addWidget(btnAccueil) + layoutUser.addStretch() + if not mainWindow.userConnected: + layoutUser.addWidget(btnConnexion) + else: + layoutUser.addWidget(btnDeconnexion) + + grpUtilisateur: object = QGroupBox("Gestion de l'utilisateur") + grpUtilisateur.setLayout(layoutUser) + # + labMail: object = QLabel("Email") + leditMail: object = QLineEdit(maxLength=128) + labPassword: object = QLabel("Mot de passe") + leditPassword: object = QLineEdit(maxLength=128) + leditPassword.setEchoMode(QLineEdit.Password) + labStatus: object = QLabel("Rôle") + comboStatus: object = QComboBox() + comboStatus.addItem("Admin", 0) + comboStatus.addItem("Pro", 1) + comboStatus.addItem("Client", 2) + # + btnRegister: object = QPushButton("S'inscrire") + btnRegister.clicked.connect( + lambda: core_register( + mainWindow, + leditMail.text(), + leditPassword.text(), + comboStatus.currentData() + ) + ) + # + LayoutInfoConnexion: object = QGridLayout() + LayoutInfoConnexion.addWidget(labMail, 0, 0) + LayoutInfoConnexion.addWidget(leditMail, 0, 1) + LayoutInfoConnexion.addWidget(labPassword, 1, 0) + LayoutInfoConnexion.addWidget(leditPassword, 1, 1) + LayoutInfoConnexion.addWidget(labStatus, 2, 0) + LayoutInfoConnexion.addWidget(comboStatus, 2, 1) + LayoutInfoConnexion.addWidget(btnRegister, 3, 1) + # + layoutGroupConnexion: object = QHBoxLayout() + layoutGroupConnexion.addStretch() + layoutGroupConnexion.addLayout(LayoutInfoConnexion) + layoutGroupConnexion.addStretch() + grpConnexion: object = QGroupBox("Inscription") + grpConnexion.setLayout(layoutGroupConnexion) + # + layoutMain: object = QVBoxLayout() + layoutMain.addWidget(connexionState) + layoutMain.addWidget(grpUtilisateur) + layoutMain.addStretch() + layoutMain.addWidget(grpConnexion) + layoutMain.addStretch() + # + mainWindow.mainWidget.deleteLater() + mainWindow.mainWidget = QWidget() + mainWindow.mainWidget.setLayout(layoutMain) + mainWindow.setCentralWidget(mainWindow.mainWidget) diff --git a/src/app/ressources/icon.ico b/src/app/ressources/icon.ico Binary files differnew file mode 100644 index 0000000..7c550a3 --- /dev/null +++ b/src/app/ressources/icon.ico diff --git a/src/app/windowAPropos.py b/src/app/windowAPropos.py new file mode 100644 index 0000000..2450e03 --- /dev/null +++ b/src/app/windowAPropos.py @@ -0,0 +1,15 @@ + +from PyQt5.QtWidgets import QMessageBox + + +def window_main(mainWindow: object) -> None: + """""" + QMessageBox.information( + mainWindow, + "A propos", + f"Logiciel pour mon dossier professionnel.\ + <br>Version: {mainWindow.VERSION}\ + <br>Auteur: Debulois Quentin\ + <br>Code source: \ + <a href='https://git.debulois.fr/'>git.debulois.fr/</a>" + ) diff --git a/src/app/windowAdmin.py b/src/app/windowAdmin.py new file mode 100644 index 0000000..af27e54 --- /dev/null +++ b/src/app/windowAdmin.py @@ -0,0 +1,268 @@ + +from PyQt5.QtWidgets import ( + QDialog, QGroupBox, QLabel, + QLineEdit, QVBoxLayout, + QHBoxLayout, QGridLayout, + QPushButton, QComboBox, + QMessageBox +) +from src.database.dbadmin import DbAdmin +from src.database.dbsearch import DbSearch +from src.database.dbmission import DbMission + + +def core_ajout_emploi(mainWindow: object, nomEn: str, nomFr: str) -> int: + """""" + dbadmin: object = DbAdmin(mainWindow) + success: int = dbadmin.register_job_category(nomEn, nomFr) + if success: + QMessageBox.information( + mainWindow, + "Ajout d'un emploi", + "Emploi ajouté!" + ) + return 1 + else: + QMessageBox.warning( + mainWindow, + "Ajout d'un emploi", + "Impossible d'ajouter cet emploi" + ) + return 0 + + +def core_suppr_emploi(mainWindow: object, jobId: int) -> int: + """""" + dbadmin: object = DbAdmin(mainWindow) + success: int = dbadmin.del_job_category_by_jobid(jobId) + if success: + QMessageBox.information( + mainWindow, + "Suppresion d'un emploi", + "Emploi supprimé!" + ) + return 1 + else: + QMessageBox.warning( + mainWindow, + "Suppresion d'un emploi", + "Impossible de supprimer cet emploi" + ) + return 0 + + +def core_suppr_user(mainWindow: object, userId: int) -> int: + """""" + dbadmin: object = DbAdmin(mainWindow) + success: int = dbadmin.del_user_by_userid(userId) + if success: + QMessageBox.information( + mainWindow, + "Suppresion d'un utilisateur", + "Utilisateur supprimé!" + ) + return 1 + else: + QMessageBox.warning( + mainWindow, + "Suppresion d'un utilisateur", + "Impossible de supprimer cet utilisateur" + ) + return 0 + + +def core_suppr_mission(mainWindow: object, missionId: int) -> int: + """""" + dbadmin: object = DbAdmin(mainWindow) + success: int = dbadmin.del_mission_by_missionid(missionId) + if success: + QMessageBox.information( + mainWindow, + "Suppresion d'une mission", + "Mission supprimé!" + ) + return 1 + else: + QMessageBox.warning( + mainWindow, + "Suppresion d'une mission", + "Impossible de supprimer cette mission" + ) + return 0 + + +class window_admin_emplois(): + """""" + def cmb_populate(self, mainWindow: object , cmb: object) -> None: + """""" + # Instanciation DB + dbsearch: object = DbSearch(mainWindow) + allJobs: object = dbsearch.get_job_all() + cmb.clear() + for i in allJobs: + cmb.addItem(f"{i[2]}", i[0]) + + + def __init__(self, mainWindow: object) -> None: + """""" + # Fenêtre + dial: object = QDialog(parent=mainWindow) + dial.setWindowTitle("Admin - Emplois") + + # Widgets Ajout + labAjoutEn: object = QLabel("Nom en Anglais") + inpAjoutEn: object = QLineEdit(maxLength=128) + labAjoutFr: object = QLabel("Nom en Français") + inpAjoutFr: object = QLineEdit(maxLength=128) + btnAjout: object = QPushButton("Enregistrer") + btnAjout.clicked.connect( + lambda: [ + core_ajout_emploi( + mainWindow, + inpAjoutEn.text(), + inpAjoutFr.text() + ), + self.cmb_populate(mainWindow, cmbSuppr) + ] + ) + # Layout Ajout + layAjout: object = QGridLayout() + layAjout.addWidget(labAjoutEn, 0, 0) + layAjout.addWidget(inpAjoutEn, 0, 1) + layAjout.addWidget(labAjoutFr, 1, 0) + layAjout.addWidget(inpAjoutFr, 1, 1) + layAjout.addWidget(btnAjout, 2, 1) + # Grp Ajout + grpAjout: object = QGroupBox("Ajout d'un emploi") + grpAjout.setLayout(layAjout) + + # Widgets Suppr + labSuppr: object = QLabel("Emploi à supprimmer") + cmbSuppr: object = QComboBox() + self.cmb_populate(mainWindow, cmbSuppr) + btnSuppr: object = QPushButton("Supprimer") + btnSuppr.clicked.connect( + lambda: [ + core_suppr_emploi( + mainWindow, + cmbSuppr.currentData() + ), + self.cmb_populate(mainWindow, cmbSuppr) + ] + ) + # Layouts Suppr + laySuppr: object = QGridLayout() + laySuppr.addWidget(labSuppr, 0, 0) + laySuppr.addWidget(cmbSuppr, 0, 1) + laySuppr.addWidget(btnSuppr, 1, 1) + # Grp Suppr + grpSuppr: object = QGroupBox("Suppression d'un emploi") + grpSuppr.setLayout(laySuppr) + + # Layout Main & show + layMain: object = QVBoxLayout() + layMain.addWidget(grpAjout) + layMain.addWidget(grpSuppr) + dial.setLayout(layMain) + dial.show() + + +def window_admin_users(mainWindow: object) -> None: + """""" + # Instanciation DB + dbadmin: object = DbAdmin(mainWindow) + allUsers: object = dbadmin.get_all_users_account() + # Fenêtre + dial: object = QDialog(parent=mainWindow) + dial.setWindowTitle("Admin - Utilisateurs") + # Widgets Users + labCmdUser: object = QLabel("Id à supprimer") + inpCmdUser: object = QLineEdit(maxLength=128) + btnSuppr: object = QPushButton("Supprimer") + btnSuppr.clicked.connect( + lambda: [ + core_suppr_user( + mainWindow, + inpCmdUser.text() + ), + dial.close() + ] + ) + labUsers: list = [] + for i in allUsers: + labUsers.append(QLabel(f"ID:{i[0]} Mail:{i[1]} Inscr.{i[4]} Status:{i[5]}")) + # Layouts Users + layCmd: object = QHBoxLayout() + layCmd.addStretch() + layCmd.addWidget(labCmdUser) + layCmd.addWidget(inpCmdUser) + layCmd.addWidget(btnSuppr) + layCmd.addStretch() + layUsers: object = QVBoxLayout() + for i in range(len(labUsers)): + layUsers.addWidget(labUsers[i]) + laySuppr: object = QVBoxLayout() + laySuppr.addLayout(layCmd) + laySuppr.addLayout(layUsers) + # Grp Users + grpUser: object = QGroupBox("Suppression d'un utilisateur") + grpUser.setLayout(laySuppr) + # Layout Main & Show + layMain: object = QVBoxLayout() + layMain.addWidget(grpUser) + dial.setLayout(layMain) + dial.show() + + +def window_admin_missions(mainWindow: object): + """""" + # Instanciation DB + dbmission: object = DbMission(mainWindow) + dbsearch: object = DbSearch(mainWindow) + # Fenêtre + dial: object = QDialog(parent=mainWindow) + dial.setWindowTitle("Admin - Missions") + # Widgets Users + labCmdMission: object = QLabel("Id à supprimer") + inpCmdMission: object = QLineEdit() + btnSuppr: object = QPushButton("Supprimer") + btnSuppr.clicked.connect( + lambda: [ + core_suppr_mission( + mainWindow, + inpCmdMission.text() + ), + dial.close() + ] + ) + allMissions: object = dbmission.get_all_missions() + labMissions: list = [] + for i in allMissions: + jobName = dbsearch.get_job_by_jobid(i[10])[0][2] + labMissions.append( + QLabel( + f"ID:{i[0]} date:{i[1].strftime('%m/%d/%Y')} Emploi:{jobName} sujet:{i[2]} clientId:{i[8]} proId:{i[9]}" + ) + ) + # Layouts Missions + layCmd: object = QHBoxLayout() + layCmd.addStretch() + layCmd.addWidget(labCmdMission) + layCmd.addWidget(inpCmdMission) + layCmd.addWidget(btnSuppr) + layCmd.addStretch() + layMissions: object = QVBoxLayout() + for i in range(len(labMissions)): + layMissions.addWidget(labMissions[i]) + + laySuppr: object = QVBoxLayout() + laySuppr.addLayout(layCmd) + laySuppr.addLayout(layMissions) + # Grp Missions + grpMission: object = QGroupBox("Suppression d'une mission") + grpMission.setLayout(laySuppr) + # Layout Main & Show + layMain: object = QVBoxLayout() + layMain.addWidget(grpMission) + dial.setLayout(layMain) + dial.show() diff --git a/src/app/windowMissions.py b/src/app/windowMissions.py new file mode 100644 index 0000000..5878c8a --- /dev/null +++ b/src/app/windowMissions.py @@ -0,0 +1,156 @@ + +from PyQt5.QtWidgets import ( + QDialog, QGroupBox, QLabel, + QVBoxLayout, QHBoxLayout, + QPushButton, QMessageBox, + QLineEdit, QComboBox +) +from src.database.dbmission import DbMission + + +def core_review(dial: object, dbmission: object, missionId: int) -> None: + """""" + dialReview: object = QDialog(parent=dial) + # + lineNote: object = QHBoxLayout() + labNote: object = QLabel("Note: ") + cmbNote: object = QComboBox() + for i in range(6): + cmbNote.addItem(str(i), i) + lineNote.addWidget(labNote) + lineNote.addStretch() + lineNote.addWidget(cmbNote) + # + lineReview: object = QHBoxLayout() + labReview: object = QLabel("Avis: ") + inpReview: object = QLineEdit(maxLength=256) + lineReview.addWidget(labReview) + lineReview.addStretch() + lineReview.addWidget(inpReview) + # + lineBtn: object = QHBoxLayout() + btnValider: object = 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: object = QVBoxLayout() + layReview.addLayout(lineNote) + layReview.addLayout(lineReview) + layReview.addLayout(lineBtn) + # + grpMain: object = QGroupBox("Donnez votre avis") + grpMain.setLayout(layReview) + layMain: object = QVBoxLayout() + layMain.addWidget(grpMain) + # + dialReview.setLayout(layMain) + dialReview.show() + + +def core_validate(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": + core_review(dial, dbmission, missionId) + + dial.close() + + +def core_get_missions_by_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 = [list(i) for i in missionsAll if i[5] == None] + return missionsPending + elif status == "ongoing": + missionsOngoing: list = [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 = [list(i) for i in missionsAll if (i[6] != None and i[7] != None)] + return missionsCompleted + + +def window_main(mainWindow: object, status: str) -> None: + """""" + dial: object = QDialog(parent=mainWindow) + missions: list = core_get_missions_by_status(mainWindow, status) + linesMission: list = [] + for mission in missions: + line: object = QHBoxLayout() + labMission: object = QLabel(" - ".join([str(i) for i in mission[1:] if i != None])) + line.addWidget(labMission) + if status == "pending" and mainWindow.userStatus == "Pro": + btnValidate: object = QPushButton("Valider") + btnValidate.clicked.connect( + lambda checked, missionId=mission[0]: + core_validate(mainWindow, dial, missionId, "acceptedByPro") + ) + line.addStretch() + line.addWidget(btnValidate) + elif status == "ongoing" and mainWindow.userStatus == "Pro" and mission[7] == None: + btnValidate: object = QPushButton("Valider") + btnValidate.clicked.connect( + lambda checked, missionId=mission[0]: + core_validate(mainWindow, dial, missionId, "validatedByPro") + ) + line.addStretch() + line.addWidget(btnValidate) + elif status == "ongoing" and mainWindow.userStatus == "Client" and mission[6] == None: + btnValidate: object = QPushButton("Valider") + btnValidate.clicked.connect( + lambda checked, missionId=mission[0]: + core_validate(mainWindow, dial, missionId, "validatedByClient") + ) + line.addStretch() + line.addWidget(btnValidate) + + linesMission.append(line) + + layMission: object = QVBoxLayout() + for i in linesMission: + layMission.addLayout(i) + + if status == "pending": + grpMain: object = QGroupBox("Missions en attente") + elif status == "ongoing": + grpMain: object = QGroupBox("Missions en cours") + elif status == "completed": + grpMain: object = QGroupBox("Missions terminées") + + grpMain.setLayout(layMission) + layMain: object = QVBoxLayout() + layMain.addWidget(grpMain) + dial.setLayout(layMain) + dial.show() diff --git a/src/app/windowRecherche.py b/src/app/windowRecherche.py new file mode 100644 index 0000000..b2305e1 --- /dev/null +++ b/src/app/windowRecherche.py @@ -0,0 +1,150 @@ + +# https://docs.python.org/3/faq/programming.html#why-do-lambdas-defined-in-a-loop-with-different-values-all-return-the-same-result +# https://stackoverflow.com/questions/53751106/create-lambda-functions-in-a-loop-for-pyqt5-signals?noredirect=1 + +from PyQt5.QtWidgets import ( + QDialog, QVBoxLayout, + QHBoxLayout, QLabel, + QPushButton, QGroupBox, + QComboBox, QLineEdit, + QMessageBox +) +from src.database.dbsearch import DbSearch +from src.database.dbmission import DbMission + + +def core_mandater(mainWindow: object, dial: object, proId: int) -> None: + """""" + dbmission: object = DbMission(mainWindow) + dbsearch: object = DbSearch(mainWindow) + proJobs: list = dbsearch.get_pro_job_by_proid(proId) + + dial: object = QDialog(dial) + + labInpMandate: object = QLabel("Sujet de la mission:") + inpMandate: object = QLineEdit(maxLength=128) + layInpMandate: object = QHBoxLayout() + layInpMandate.addWidget(labInpMandate) + layInpMandate.addStretch() + layInpMandate.addWidget(inpMandate) + + labCmbMandate: object = QLabel("Profession concernée:") + cmbMandate: object = QComboBox() + layCmbMandate: object = QHBoxLayout() + for i in proJobs: + cmbMandate.addItem(f"{i[2]}", i[0]) + layCmbMandate.addWidget(labCmbMandate) + layCmbMandate.addStretch() + layCmbMandate.addWidget(cmbMandate) + + btnMandate = QPushButton("Mandater") + btnMandate.clicked.connect( + lambda: [ + dbmission.register_mission( + inpMandate.text(), + mainWindow.userId, + proId, + cmbMandate.currentData() + ), + QMessageBox.information( + dial, + "Mandater une mission", + "Votre mission à bien été mandatée" + ), + dial.close() + ] + ) + layBtnMandate: object = QHBoxLayout() + layBtnMandate.addStretch() + layBtnMandate.addWidget(btnMandate) + layBtnMandate.addStretch() + + layGrp: object = QVBoxLayout() + layGrp.addLayout(layInpMandate) + layGrp.addLayout(layCmbMandate) + layGrp.addLayout(layBtnMandate) + + grpMandate: object = QGroupBox() + grpMandate.setLayout(layGrp) + + layMain: object = QVBoxLayout() + layMain.addWidget(grpMandate) + + dial.setLayout(layMain) + dial.show() + + +def core_more_infos(mainWindow: object, dial: object, proId: int) -> None: + """""" + dial: object = QDialog(dial) + search: object = DbSearch(mainWindow) + resRecherche: list = search.get_user_info_by_userid(proId)[0][1:] + labelsText: list = [ + "Nom", + "Prénom", + "Diplôme", + "Capacités", + "Description", + "Téléphone", + "Adresse", + "Code postale", + "Ville", + ] + + layProInfo = QVBoxLayout() + for i in range(len(resRecherche)): + line: object = QHBoxLayout() + line.addWidget(QLabel(f"{labelsText[i]}: {resRecherche[i]}")) + layProInfo.addLayout(line) + + if mainWindow.userStatus == "Client": + layBtnMandate: object = QHBoxLayout() + btnMandate: object = QPushButton("Mandater") + btnMandate.clicked.connect( + lambda: + core_mandater(mainWindow, dial, proId) + ) + layBtnMandate.addStretch() + layBtnMandate.addWidget(btnMandate) + layBtnMandate.addStretch() + layProInfo.addLayout(layBtnMandate) + + grpProInfo: object = QGroupBox() + grpProInfo.setLayout(layProInfo) + + layMain: object = QVBoxLayout() + layMain.addWidget(grpProInfo) + + dial.setLayout(layMain) + dial.show() + + +def window_main(mainWindow: object, results: list) -> None: + """""" + dial: object = QDialog(parent=mainWindow) + dial.setWindowTitle("Recherche") + layoutsResult: list = [] + for i in results: + layoutLine = QHBoxLayout() + color = results.index(i) % 2 + if color: + colored = QLabel(i["text"]) + colored.setStyleSheet("background-color: rgb(230,200,200); border-radius: 3px") + layoutLine.addWidget(colored) + else: + layoutLine.addWidget(QLabel(i["text"])) + btnInfos = QPushButton("Infos") + btnInfos.clicked.connect( + lambda checked, proId=i["id"]: + core_more_infos(mainWindow, dial, proId) + ) + layoutLine.addStretch() + layoutLine.addWidget(btnInfos) + layoutsResult.append(layoutLine) + + layoutMain = QVBoxLayout() + for layout in layoutsResult: + layoutMain.addLayout(layout) + + dial.setLayout(layoutMain) + dial.show() diff --git a/src/app/windowUserInfo.py b/src/app/windowUserInfo.py new file mode 100644 index 0000000..4455dde --- /dev/null +++ b/src/app/windowUserInfo.py @@ -0,0 +1,199 @@ + +# https://stackoverflow.com/questions/3077192/get-a-layouts-widgets-in-pyqt + +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 core_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), + core_delete_job(layItem) + ] + ) + lineMyJobs.addWidget(labJob) + lineMyJobs.addStretch() + lineMyJobs.addWidget(btnRemoveJob) + layMyJobs.addLayout(lineMyJobs) + + +def core_delete_job(layLineJob: object) -> None: + """""" + lab: object = layLineJob.itemAt(0).widget() + lab.deleteLater() + btn: object = layLineJob.itemAt(2).widget() + btn.deleteLater() + layLineJob.deleteLater() + + +def core_validate(mainWindow: object, dial: object, + layLines: list, oldJobs: list = None, newJobs: list = None) -> None: + """""" + user: object = DbUser(mainWindow = mainWindow) + userInfos: list = [] + for i in layLines: + if i != "selectJobs" and i != "myJobs": + lineInput: object = layLines[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" + ) + + +def window_main(mainWindow: object) -> None: + search: object = DbSearch(mainWindow) + dial: object = QDialog(parent=mainWindow) + dial.setWindowTitle("Mes infos") + 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" + ] + + layLines: list = {} + for i in champsClients: + layLines[i] = QHBoxLayout() + layLines[i].addWidget(QLabel(i)) + layLines[i].addStretch() + if infos: + if i == "Téléphone": + layLines[i].addWidget(QLineEdit(champsClients[i], maxLength=10)) + elif i == "Code postal": + layLines[i].addWidget(QLineEdit(champsClients[i], maxLength=6)) + else: + layLines[i].addWidget(QLineEdit(champsClients[i], maxLength=128)) + else: + if i == "Téléphone": + layLines[i].addWidget(QLineEdit(maxLength=10)) + elif i == "Code postal": + layLines[i].addWidget(QLineEdit(maxLength=6)) + else: + layLines[i].addWidget(QLineEdit(maxLength=128)) + + if mainWindow.userStatus == "Pro": + allJobs: object = search.get_job_all() + laySelectJobs: object = QHBoxLayout() + labSelectJobs: object = QLabel("Les emplois:") + cmbAllJobs: object = QComboBox() + for i in allJobs: + cmbAllJobs.addItem(f"{i[2]}", i[0]) + + btnSelectJobs = QPushButton("Ajouter") + btnSelectJobs.clicked.connect( + lambda : + core_add_job( + cmbAllJobs.currentText(), + cmbAllJobs.currentData(), + newJobs, + layMyJobs + ) + ) + laySelectJobs.addWidget(labSelectJobs) + laySelectJobs.addStretch() + laySelectJobs.addWidget(cmbAllJobs) + laySelectJobs.addStretch() + laySelectJobs.addWidget(btnSelectJobs) + layLines["selectJobs"] = laySelectJobs + # + myJobs: object = search.get_pro_job_by_proid(mainWindow.userId) + layMyJobs: object = QVBoxLayout() + newJobs: list = [] + for i in myJobs: + core_add_job(i[2], i[0], newJobs, layMyJobs) + oldJobs: list = newJobs.copy() # Sinon pointer !!! + layLines["myJobs"] = layMyJobs + for i in champsPro: + layLines[i] = QHBoxLayout() + layLines[i].addWidget(QLabel(i)) + layLines[i].addStretch() + if infos: + layLines[i].addWidget(QLineEdit(champsPro[i], maxLength=256)) + else: + layLines[i].addWidget(QLineEdit(maxLength=256)) + + layModif: object = QVBoxLayout() + for i in layLines: + layModif.addLayout(layLines[i]) + + btnModif: object = QPushButton("modifer") + btnModif.clicked.connect( + lambda: + core_validate( + mainWindow, + dial, + layLines, + oldJobs, + newJobs + ) if mainWindow.userStatus == "Pro" + else core_validate( + mainWindow, + dial, + layLines + ) + ) + layBtn: object = QHBoxLayout() + layBtn.addStretch() + layBtn.addWidget(btnModif) + layModif.addLayout(layBtn) + # + grpMain: object = QGroupBox("Mes infos") + grpMain.setLayout(layModif) + mainLayout: object = QVBoxLayout() + mainLayout.addWidget(grpMain) + dial.setLayout(mainLayout) + dial.show() |
