1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
|
############################################################################
# #
# 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()
|