summaryrefslogtreecommitdiff
path: root/src/app/windowUserInfo.py
blob: 181925da51a9c18f6b5627bb6d0a00ba58503995 (plain)
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
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263

############################################################################
#                                                                          #
# 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()