############################################################################ # # # Description: Fenêtre et fonctions permettant de gérer ses infos # # # ############################################################################ # https://stackoverflow.com/questions/3077192/get-a-layouts-widgets-in-pyqt # Import de PyQt5 from tkinter import Widget from PyQt5.QtWidgets import ( QDialog, QGroupBox, QLabel, QLineEdit, QVBoxLayout, QHBoxLayout, QPushButton, QComboBox, QMessageBox ) # Import des fichiers locaux 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: """ Fonction permettant d'ajouter l'id de l'emploi sélectionné et la ligne avec un bouton pour le retirer. """ # Uniquement si le job n'était pas deja sélectionné if jobId not in listMyJobs: # On le rajoute à la liste des emplois sélectionnés listMyJobs.append(jobId) # On crée le layout avec ses widgets pour pouvoir le supprimer si on le souhaite 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: """ Fonction permettant de supprimer une ligne de la fenêtre """ # On loop a travers chaque item dans le layout et on le supprime for i in range(layLineJob.count()): widget: object = layLineJob.itemAt(i).widget() if widget != None: # Stretch renvoi None widget.deleteLater() # Enfin on supprime le layout layLineJob.deleteLater() def core_validate(mainWindow: object, dial: object, layLines: dict, oldJobs: list = None, newJobs: list = None) -> None: """ Fonction validant les informations renseignées et modification de ses dernières dans la BDD avec un méthode de BdUser. """ # Instanciation des méthodes pour gérer les utilisateurs user: object = DbUser(mainWindow = mainWindow) # On crée une liste qui vas recevoir les informations renseignées userInfos: list = [] # Pour chaque ligne si cette ligne n'est pas sélectionenr un emploi ou # mes emplois, on ajoute la valeur de l'input à la liste for i in layLines: if i != "selectJobs" and i != "myJobs": lineInput: object = layLines[i].itemAt(2).widget() userInfos.append(lineInput.text()) # Si un champs est vide, on "return" pour arreter la fonction if "" in userInfos: QMessageBox.warning( dial, "Mes informations", "Veuillez renseigner tous les champs" ) return # On regarde si l'utilisateur est un Pro ou un Client if mainWindow.userStatus == "Pro": isPro: bool = True else: isPro: bool = False # On met à jour les informations de l'utilisateur connecté user.update_user_infos(userInfos, mainWindow.userId, isPro, oldJobs, newJobs) QMessageBox.information( dial, "Mes informations", "Modification enregistrée" ) def window_main(mainWindow: object) -> None: """ Fenêtre permettant de modifier ses informations d'utilisateur """ # Instanciation des méthodes pour effectuer des recherches search: object = DbSearch(mainWindow) # Instaciation d'une fenêtre simple dial: object = QDialog(parent=mainWindow) # On défini le titre de cette fenêtre dial.setWindowTitle("Mes infos") # On récupère les infos de l'utilisateur infos: list = search.get_user_info_by_userid(mainWindow.userId) # Si il y a déja des infos enregistrées, on les récupère dans deux dictionnaires # en séparants les champs spécifiques aux pros 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" ] # On crée un dict qui va recevoir les lignes layLines: dict = {} # Pour chaque élément dans champsClient, que ce soit une liste ou un dict for i in champsClients: # On crée une ligne avec son QLabel défini selon l'index si c'est un dict, # ou la valeur de l'élément si c'est une liste, et cette index ou cette valeur # sera également l'index du dict des lignes layLines[i] = QHBoxLayout() layLines[i].addWidget(QLabel(i)) layLines[i].addStretch() # Si il y a deja des infos, on attribut cette info au QLineEdit, sinon on laisse le champ vierge 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)) # Si l'utilisateur est un pro, on rajoute les champs réservés à ces derniers if mainWindow.userStatus == "Pro": # On récupère tous les emplois et rajoute les widgets # pour pouvoir ajouter ces derniers allJobs: object = search.get_job_all() 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 ) ) # On définie le layout de cette ligne et on le rajoute au dictionnaire des lignes laySelectJobs: object = QHBoxLayout() laySelectJobs.addWidget(labSelectJobs) laySelectJobs.addStretch() laySelectJobs.addWidget(cmbAllJobs) laySelectJobs.addStretch() laySelectJobs.addWidget(btnSelectJobs) layLines["selectJobs"] = laySelectJobs # On récupère les jobs déja sélectionnés pour le pro myJobs: object = search.get_pro_job_by_proid(mainWindow.userId) # On initie une nouvelle liste pour les jobs qui vont étre sélectionnés newJobs: list = [] # On Crée la partie qui recevra les lignes des emplois layMyJobs: object = QVBoxLayout() # Pour chaque job qui avait déja été sélectionné for i in myJobs: # On crée une une ligne en passant le nom FR, l'id, # la liste des nouveaux jobs et le layout qui recoit ces lignes core_add_job(i[2], i[0], newJobs, layMyJobs) # On duplique tout de suite la liste des nouveaux jobs # pour pouvoir faire la diff avant après oldJobs: list = newJobs.copy() # Obligé de "copy" sinon pointer !!! # On donne au dictionnaire des lignes le layout qui recoit les jobs sélectionnés layLines["myJobs"] = layMyJobs # On ajoute les autres champs réservés aux pros 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)) # On crée le bouton pour valider les modifications btnModif: object = QPushButton("modifer") btnModif.clicked.connect( lambda: core_validate( # Si c'est un pro mainWindow, dial, layLines, oldJobs, newJobs ) if mainWindow.userStatus == "Pro" else core_validate( # Sinon mainWindow, dial, layLines ) ) # On crée et peuple le layout qui recoit toutes les lignes layModif: object = QVBoxLayout() for i in layLines: layModif.addLayout(layLines[i]) # On ajoute le bouton layBtn: object = QHBoxLayout() layBtn.addStretch() layBtn.addWidget(btnModif) layModif.addLayout(layBtn) # On crée et donne au GroupBox le layout des lignes grpMain: object = QGroupBox("Mes infos") grpMain.setLayout(layModif) # On crée le layout principal auquel on donne le GroupBox mainLayout: object = QVBoxLayout() mainLayout.addWidget(grpMain) dial.setLayout(mainLayout) # On affiche la fenêtre dial.show()