############################################################################ # # # Description: Fenêtres et fonctions permettant de gérer ses missions # # # ############################################################################ # Import de PyQt5 from PyQt5.QtWidgets import ( QDialog, QGroupBox, QLabel, QVBoxLayout, QHBoxLayout, QPushButton, QMessageBox, QLineEdit, QComboBox ) # Import des éléments locaux from src.database.dbmission import DbMission from src.database.dbsearch import DbSearch def core_review(dial: object, dbmission: object, missionId: int) -> None: """ Fenêtre permettant de donner un avis et une note à une mission en tant que Client. """ # Instanciation d'une nouvealle fenêtre simple dialReview: object = QDialog(parent=dial) # Widgets pour pouvoir laisser un commentaire labNote: object = QLabel("Note: ") cmbNote: object = QComboBox() for i in range(6): cmbNote.addItem(str(i), i) labReview: object = QLabel("Avis: ") inpReview: object = QLineEdit(maxLength=256) 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() ] ) # Layout des lignes avec leurs widgets lineNote: object = QHBoxLayout() lineNote.addWidget(labNote) lineNote.addStretch() lineNote.addWidget(cmbNote) lineReview: object = QHBoxLayout() lineReview.addWidget(labReview) lineReview.addStretch() lineReview.addWidget(inpReview) lineBtn: object = QHBoxLayout() lineBtn.addStretch() lineBtn.addWidget(btnValider) lineBtn.addStretch() # Layout accueillant les lignes layReview: object = QVBoxLayout() layReview.addLayout(lineNote) layReview.addLayout(lineReview) layReview.addLayout(lineBtn) # GroupBox principal grpMain: object = QGroupBox("Donnez votre avis") grpMain.setLayout(layReview) # Layout principal layMain: object = QVBoxLayout() layMain.addWidget(grpMain) dialReview.setLayout(layMain) # Affichage de la fenêtre dialReview.show() def core_validate(mainWindow: object, dial: object, missionId: int, status: str) -> None: """ Valide une mission et en fonction du statut de l'utilisateur et de l'etat de la mission, renvoie vers le bon message ou la possibilitée de laisser un commentaire """ # Instanciation des méthodes pour pouvoir gérer les missions dans la BDD dbmission: object = DbMission(mainWindow) # Validation en fonction de l'étape à laquelle se trouve actuellement la mission 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) # On ferme la fenetre pour éviter d'avoir à la rafraichir dial.close() def core_get_missions_by_status(mainWindow: object, status: str) -> list: """ Récupération des missions liées à l'utilisateur et sélection des missions ayant le statut demandé """ # Instanciation des méthodes pour pouvoir gérer les missions dans la BDD dbmission: object = DbMission(mainWindow) # Récupération des missions en fonction du status et selon l'ID # de l'utilisateur actuellement connecté 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) # Selon la fenêtre appelée dans le menu bar, on sélectionne les missions ayant ce status # en regardant si les champs de validation sont vide ou non, on converti aussi les tuple des resultats # que renvoi la BDD en list 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: """ Fenêtre permettant de gérer ses missions """ dbsearch: object = DbSearch(mainWindow) # Instanciation d'une nouvealle fenêtre simple dial: object = QDialog(parent=mainWindow) # Récupération des missions en fonction su status sélectionné missions: list = core_get_missions_by_status(mainWindow, status) # Liste qui va accueillir les lignes linesMission: list = [] # Mission à la place de "i" pour eviter d'avoir un "j" par la suite for i in missions: # Widgets de la ligne line: object = QHBoxLayout() # On récupère le nom FR de l'emploi job = dbsearch.get_job_by_jobid(i[8])[0][2] # On formate la ligne avec les infos intéréssantes selon le status de la mission if status == "pending": labMission: object = QLabel( f"Emise le: {i[1].strftime('%m/%d/%Y')} Pro: {i[10]} Job: {job} Sujet: {i[2]}" ) elif status == "ongoing": if i[6] != None: valClient = i[6].strftime('%m/%d/%Y') else: valClient = "N/A" if i[7] != None: valPro = i[7].strftime('%m/%d/%Y') else: valPro = "N/A" labMission: object = QLabel( f"Emise le: {i[1].strftime('%m/%d/%Y')} Pro: {i[10]} Job: {job} Sujet: {i[2]} Validé Client: {valClient} Validé Pro: {valPro}" ) elif status == "completed": labMission: object = QLabel( f"Emise le: {i[1].strftime('%m/%d/%Y')} Pro: {i[10]} Job: {job} Sujet: {i[2]} Validé Client: {i[6].strftime('%m/%d/%Y')} Validé Pro: {i[7].strftime('%m/%d/%Y')} Note: {i[3]} Avis: {i[4]}" ) line.addWidget(labMission) # On vérifie si le status de la mission peut étre validé par l'utilisateur actuel # Si c'est une mission en attente et que l'on est le Pro if status == "pending" and mainWindow.userStatus == "Pro": btnValidate: object = QPushButton("Valider") btnValidate.clicked.connect( lambda checked, missionId=i[0]: core_validate(mainWindow, dial, missionId, "acceptedByPro") ) line.addStretch() line.addWidget(btnValidate) # Si la mission est en cours et qu'elle n'est pas encore validé par le pro et que l'on est ce dernier elif status == "ongoing" and mainWindow.userStatus == "Pro" and i[7] == None: btnValidate: object = QPushButton("Valider") btnValidate.clicked.connect( lambda checked, missionId=i[0]: core_validate(mainWindow, dial, missionId, "validatedByPro") ) line.addStretch() line.addWidget(btnValidate) # Si la mission est en cours et que l'on est le client elif status == "ongoing" and mainWindow.userStatus == "Client" and i[6] == None: btnValidate: object = QPushButton("Valider") btnValidate.clicked.connect( lambda checked, missionId=i[0]: core_validate(mainWindow, dial, missionId, "validatedByClient") ) line.addStretch() line.addWidget(btnValidate) linesMission.append(line) # On ajoute chaque lignes au layout des missions layMission: object = QVBoxLayout() for i in linesMission: layMission.addLayout(i) # On crée un GroupBox en le nommant en fonction du status des missions 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) # On ajout le GroupBox au layout principal layMain: object = QVBoxLayout() layMain.addWidget(grpMain) dial.setLayout(layMain) # On affiche la fenêtre dial.show()