From 5e23fcc7de84adf23ea52ae0858f31b8934fabd3 Mon Sep 17 00:00:00 2001 From: Debulois Date: Wed, 27 Apr 2022 13:17:19 +0200 Subject: Système de recherche MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/coreSearch.py | 43 ++++++++++++++++ src/core/coreUser.py | 121 ++++++++++++++++++++++++++++++++++++++++++++ src/core/funcSearch.py | 3 -- src/core/funcUser.py | 123 --------------------------------------------- src/gui/pageHome.py | 18 +++++-- src/gui/pageLogin.py | 13 ++--- src/gui/pageRegister.py | 4 +- src/gui/windowRecherche.py | 63 +++++++++++++++++++++++ src/main.py | 4 +- 9 files changed, 251 insertions(+), 141 deletions(-) create mode 100644 src/core/coreSearch.py create mode 100644 src/core/coreUser.py delete mode 100644 src/core/funcSearch.py delete mode 100644 src/core/funcUser.py create mode 100644 src/gui/windowRecherche.py diff --git a/src/core/coreSearch.py b/src/core/coreSearch.py new file mode 100644 index 0000000..47f2f69 --- /dev/null +++ b/src/core/coreSearch.py @@ -0,0 +1,43 @@ + +from src.database import dbsearch +from src.gui import windowRecherche +from PyQt5.QtWidgets import QMessageBox + + +def core_search_id(mainWindow: object, jobId: int) -> None: + search: object = dbsearch.DbSearch(mainWindow) + resRecherche: tuple = search.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: + search: object = dbsearch.DbSearch(mainWindow) + resRecherche: tuple = search.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: + search: object = dbsearch.DbSearch(mainWindow) + results: list = [] + for i in resRecherche: + proInfo: dict = {} + proInfo["id"] = i[0] + resJobs = search.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.main(mainWindow, results) diff --git a/src/core/coreUser.py b/src/core/coreUser.py new file mode 100644 index 0000000..28476ad --- /dev/null +++ b/src/core/coreUser.py @@ -0,0 +1,121 @@ + +import re +from PyQt5.QtWidgets import QMessageBox +from src.gui import pageHome +from src.database import dbuser, dbsearch + + +def core_login(mainWindow, email, password) -> None: + user = dbuser.DbUser(mainWindow) + if user.check_exist_email(email): + res = user.check_user_credential(email, password) + if res: + search = dbsearch.DbSearch(mainWindow).get_user_account_by_userid(res) + QMessageBox.information( + mainWindow, + "Connexion", + "Vous êtes connecté" + ) + mainWindow.userConnected = True + mainWindow.userId = str(search[0][0]) + mainWindow.userEmail = search[0][1] + mainWindow.userInscriptionDate = search[0][2] + if search[0][3] == 0: + mainWindow.userStatus = "Admin" + elif search[0][3] == 1: + mainWindow.userStatus = "Pro" + elif search[0][3] == 2: + mainWindow.userStatus = "Client" + pageHome.main(mainWindow) + else: + QMessageBox.warning( + mainWindow, + "Connexion", + "Mauvaise combinaison mail & mot de passe" + ) + else: + QMessageBox.warning( + mainWindow, + "Connexion", + "Mauvais email" + ) + + +def core_register(mainWindow, email, password, userStatus) -> None: + user = dbuser.DbUser(mainWindow) + regNumb = "[0-9]" + regUpper = "[A-Z]" + regSpecial = "[`!@#$%^&*()_+\-=\[\]{};':\"\\|,.<>\/?~µ°€£]" + regEmail = "^[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 user.check_exist_email(email): + QMessageBox.warning( + mainWindow, + "Email invalid", + "Email déja utilisé" + ) + return + + res = user.register_user(email, password, userStatus) + if res: + QMessageBox.information( + mainWindow, + "Inscription", + "Inscription réussie!" + ) + else: + QMessageBox.warning( + mainWindow, + "Erreur bdd", + "Erreur lors de l'inscritpion" + ) diff --git a/src/core/funcSearch.py b/src/core/funcSearch.py deleted file mode 100644 index 664a24b..0000000 --- a/src/core/funcSearch.py +++ /dev/null @@ -1,3 +0,0 @@ - -def search_by_job_id(mainWindow, jobId) -> None: - print(jobId) diff --git a/src/core/funcUser.py b/src/core/funcUser.py deleted file mode 100644 index 5b5ac2c..0000000 --- a/src/core/funcUser.py +++ /dev/null @@ -1,123 +0,0 @@ - -import re -from PyQt5.QtWidgets import QMessageBox -from src.gui import pageHome -from src.database import dbuser, dbsearch - - -def login(mainWindow, email, password) -> None: - user = dbuser.DbUser(mainWindow) - if user.check_exist_email(email): - res = user.check_user_credential(email, password) - if res: - search = dbsearch.DbSearch(mainWindow).get_user_account_by_userid(res) - QMessageBox.information( - mainWindow, - "Connexion", - "Vous êtes connecté" - ) - mainWindow.userConnected = True - mainWindow.userId = str(search[0][0]) - mainWindow.userEmail = search[0][1] - mainWindow.userInscriptionDate = search[0][2] - if search[0][3] == 0: - mainWindow.userStatus = "Admin" - elif search[0][3] == 1: - mainWindow.userStatus = "Pro" - elif search[0][3] == 2: - mainWindow.userStatus = "Client" - pageHome.main(mainWindow) - else: - QMessageBox.warning( - mainWindow, - "Connexion", - "Mauvaise combinaison mail & mot de passe" - ) - else: - QMessageBox.warning( - mainWindow, - "Connexion", - "Mauvais email" - ) - - -def register(mainWindow, email, password, userStatus) -> None: - user = dbuser.DbUser(mainWindow) - regNumb = "[0-9]" - regUpper = "[A-Z]" - regSpecial = "[`!@#$%^&*()_+\-=\[\]{};':\"\\|,.<>\/?~µ°€£]" - regEmail = "^[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 not userStatus: - 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 user.check_exist_email(email): - QMessageBox.warning( - mainWindow, - "Email invalid", - "Email déja utilisé" - ) - return - - res = user.register_user(email, password, userStatus) - if res: - QMessageBox.information( - mainWindow, - "Inscription", - "Inscription réussie!" - ) - return - else: - QMessageBox.warning( - mainWindow, - "Erreur bdd", - "Erreur lors de l'inscritpion" - ) - return diff --git a/src/gui/pageHome.py b/src/gui/pageHome.py index 7745aa5..99ca956 100644 --- a/src/gui/pageHome.py +++ b/src/gui/pageHome.py @@ -5,10 +5,10 @@ from PyQt5.QtWidgets import ( QHBoxLayout, QWidget, QVBoxLayout ) -from src.core import funcSearch from src.database import dbsearch from src.gui import pageLogin, pageRegister from src.gui.include import connexionInfo +from src.core.coreSearch import core_search_id, core_search_name def main(mainWindow) -> None: @@ -30,16 +30,24 @@ def main(mainWindow) -> None: inputRechercheNom = QLineEdit("Nom d'un pro") btnRechercheNom = QPushButton("Rechercher") + btnRechercheNom.clicked.connect( + lambda: + core_search_name( + mainWindow, + inputRechercheNom.text() + ) + ) comboRechercheCat = QComboBox() alljobs = classSearch.get_job_all() for i in alljobs: comboRechercheCat.addItem("{0}".format(i[2]), i[0]) btnRechercheCat = QPushButton("Rechercher") btnRechercheCat.clicked.connect( - lambda: funcSearch.search_by_job_id( - mainWindow, - comboRechercheCat.currentData() - ) + lambda: + core_search_id( + mainWindow, + comboRechercheCat.currentData() + ) ) layoutRechercheNom = QVBoxLayout() diff --git a/src/gui/pageLogin.py b/src/gui/pageLogin.py index 46e328a..d2b7f93 100644 --- a/src/gui/pageLogin.py +++ b/src/gui/pageLogin.py @@ -3,9 +3,9 @@ from PyQt5.QtWidgets import ( QPushButton, QHBoxLayout, QGroupBox, QLabel, QLineEdit, QWidget, QVBoxLayout, QGridLayout ) -from src.core import funcUser from src.gui import pageHome, pageRegister from src.gui.include import connexionInfo +from src.core.coreUser import core_login def main(mainWindow) -> None: @@ -29,11 +29,12 @@ def main(mainWindow) -> None: leditPassword.setEchoMode(QLineEdit.Password) btnConnexion = QPushButton("Connexion") btnConnexion.clicked.connect( - lambda: funcUser.login( - mainWindow, - leditMail.text(), - leditPassword.text() - ) + lambda: + core_login( + mainWindow, + leditMail.text(), + leditPassword.text() + ) ) LayoutInfoConnexion = QGridLayout() diff --git a/src/gui/pageRegister.py b/src/gui/pageRegister.py index 63cae28..aef8ce1 100644 --- a/src/gui/pageRegister.py +++ b/src/gui/pageRegister.py @@ -3,9 +3,9 @@ from PyQt5.QtWidgets import ( QPushButton, QHBoxLayout, QGroupBox, QLabel, QLineEdit, QWidget, QVBoxLayout, QComboBox, QGridLayout ) -from src.core import funcUser from src.gui import pageHome, pageLogin from src.gui.include import connexionInfo +from src.core.coreUser import core_register def main(mainWindow) -> None: @@ -37,7 +37,7 @@ def main(mainWindow) -> None: btnRegister = QPushButton("S'inscrire") btnRegister.clicked.connect( - lambda: funcUser.register( + lambda: core_register( mainWindow, leditMail.text(), leditPassword.text(), diff --git a/src/gui/windowRecherche.py b/src/gui/windowRecherche.py new file mode 100644 index 0000000..c86bcc9 --- /dev/null +++ b/src/gui/windowRecherche.py @@ -0,0 +1,63 @@ + +from PyQt5.QtWidgets import ( + QDialog, QVBoxLayout, QHBoxLayout, + QLabel, QPushButton, QMessageBox +) +from src.database import dbsearch +# 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 + + +def more_infos(mainWindow, proId): + search: object = dbsearch.DbSearch(mainWindow) + resRecherche: list = search.get_user_info_by_userid(proId)[0][1:] + label: list = [ + "Nom", + "Prénom", + "Diplôme", + "Capacités", + "Description", + "Téléphone", + "Adresse", + "Code postale", + "Ville", + ] + text: list = [] + print(resRecherche) + for i in range(len(resRecherche)): + text.append(f"{label[i]}: {resRecherche[i]}") + + QMessageBox.information( + mainWindow, + "Informations du pro", + "\n".join(text) + ) + +def main(mainWindow: object, results: list) -> None: + dial = 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']: + more_infos(mainWindow, 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/main.py b/src/main.py index a17e39f..f9b9532 100644 --- a/src/main.py +++ b/src/main.py @@ -13,14 +13,14 @@ class mainWindow(QMainWindow): VERSION = 0.1 # Misc mysqlReachable: bool = False - # Utilisateur + # Utilisateur userConnected: bool = False userId: str = "" userEmail: str = "" userInscriptionDate: str = "" userStatus: str = "" def __init__(self) -> None: - super(mainWindow, self).__init__() + super().__init__() # Déclenche l'"__init__" de QMainWindow menu.init(self) pageHome.main(self) -- cgit v1.2.3