summaryrefslogtreecommitdiff
path: root/src/app/mainHome.py
blob: 39a98633a5c1d418adb2fda1cc29045903d30a44 (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

############################################################################
#                                                                          #
# Description: Fenêtre principale avec l'accueil et les éléments pour      #
#              effectuer une recherche                                     #
#                                                                          #
############################################################################

# Import des éléments de PyQt5
from PyQt5.QtWidgets import (
    QGroupBox,   QPushButton,
    QComboBox,   QLineEdit,
    QHBoxLayout, QWidget,
    QVBoxLayout, QLabel,
    QMessageBox
)
# Import des éléments locals
from src.app import (
    mainLogin,   mainRegister,
    mainMenuBar, windowRecherche,
    mainLogout
)
from src.database.dbsearch import DbSearch


def core_search_id(mainWindow: object, jobId: int) -> None:
    """
    Recherche les professionnels ayant tel emploi par l'id de ce dernier.
    Renvoie le resultat de la recherche vers core_search_main
    """
    # Instanciation
    dbsearch:     object = DbSearch(mainWindow)
    # Recherche
    resRecherche: list   = dbsearch.get_all_pro_by_jobid(jobId)
    # Si résultat on renvoie vers le "wrapper" de recherche,
    # sinon QMessage
    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:
    """
    Recherche de professionnel par leur nom.
    Renvoie le resultat de la recherche vers core_search_main.
    """
    # Instanciation
    dbsearch:     object = DbSearch(mainWindow)
    # Recherche
    resRecherche: tuple  = dbsearch.get_pro_info_by_lastname(name)
    # Si résultat on renvoie vers le "wrapper" de recherche,
    # sinon QMessage
    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:
    """
    Prépare la données reçue par les fonctions core_search_id et
    core_search_name en ajoutant tous les emplois des professionels
    présant dans le résultat de la recherche et envoie
    l'ensemble à "winwdowRecherche"
    """
    # Instaciation
    dbsearch: object = DbSearch(mainWindow)
    # Préparation du "payload", une liste pour tous les résultats
    results:  list   = []
    # Pour chaque éléments dans les résultat de la recherche
    for i in resRecherche:
        # On initialise un dictionnaire ("Associative array" en PHP)
        proInfo: dict = {}
        # id -> proId
        proInfo["id"] = i[0]
        # text -> sera le texte à afficher
        resJobs = dbsearch.get_pro_job_by_proid(proInfo["id"])
        # Tout depuis l'entrée '1' de la liste
        proInfo["text"] = list(i[1:])
        # Et à '2' on ajoute le nom fr(i[2]) de chaque jobId associés au pro liée par un ", "
        proInfo["text"].insert(2, ", ".join([j[2] for j in resJobs]))
        # On transforme la liste en texte en liant les éléments avec un " - "
        proInfo["text"] = " - ".join(proInfo["text"])
        results.append(proInfo)

    windowRecherche.window_main(mainWindow, results)


def window_main(mainWindow, reloadMenu = False) -> None:
    """
    Page principale de l'app d'où l'on peut effectuer des recherches
    """
    # Si l'argument reloaMenu de la fonction est vrai on recharge la menuBar
    if reloadMenu:
        mainMenuBar.menu_init(mainWindow)

    # Instanciation de la classe
    dbsearch: object = DbSearch(mainWindow)
    # On check si la variable userConnected de la classe principale est vrai ou pas
    # pour savoir si un utilisateur est connecté, on crée le widget QLabel en conséquence
    if not mainWindow.userConnected:
        connState: object = QLabel("Non connecté.")
    else:
        connState: object = QLabel(
            f"Connecté: {mainWindow.userEmail} - {mainWindow.userStatus}"
        )

    # On adapte les widgets QPushButton en fonction
    if not mainWindow.userConnected:
        btnConnexion: object = QPushButton("Connexion")
        # /!\ Association du bouton necessaire avec un lambda (fonction anonyme)
        # sinon la fonction est executé à l'execution de la fonction et non quand
        # on clique sur le bouton
        btnConnexion.clicked.connect(lambda: mainLogin.window_main(mainWindow))
    else:
        btnDeconnexion: object = QPushButton("Déconnexion")
        btnDeconnexion.clicked.connect(lambda: [
            mainLogout.core_logout(mainWindow),
            window_main(mainWindow, True)
            ]
        )

    btnInscription: object = QPushButton("Inscription")
    btnInscription.clicked.connect(lambda: mainRegister.window_main(mainWindow))
    # Partie layout des boutons de navigation
    layUser: object = QHBoxLayout()
    layUser.addStretch()
    layUser.addWidget(btnInscription)
    if not mainWindow.userConnected:
        layUser.addWidget(btnConnexion)
    else:
        layUser.addWidget(btnDeconnexion)

    # GroupeBox des boutons de navigation
    grpUser: object = QGroupBox("Gestion de l'utilisateur")
    grpUser.setLayout(layUser)
    # Widgets pour une recherche par nom
    labRechercheNom:   object = QLabel("Par nom")
    inputRechercheNom: object = QLineEdit(maxLength=128)
    btnRechercheNom:   object = QPushButton("Rechercher")
    btnRechercheNom.clicked.connect(
        lambda:
            core_search_name(
                mainWindow,
                inputRechercheNom.text()
            )
    )
    # Widgets pour une recherche par catégorie
    labRechercheCat: object = QLabel("Par emploi")
    cmbRechercheCat: object = QComboBox()
    alljobs:         list   = dbsearch.get_job_all()
    for i in alljobs:
        cmbRechercheCat.addItem("{0}".format(i[2]), i[0])
    btnRechercheCat: object = QPushButton("Rechercher")
    btnRechercheCat.clicked.connect(
        lambda:
            core_search_id(
                mainWindow,
                cmbRechercheCat.currentData()
            )
    )
    # Layout recherche par nom
    layRechercheNom: object = QVBoxLayout()
    layRechercheNom.addWidget(labRechercheNom)
    layRechercheNom.addWidget(inputRechercheNom)
    layRechercheNom.addWidget(btnRechercheNom)
    # Layout recherche par catégorie
    layRechercheCat: object = QVBoxLayout()
    layRechercheCat.addWidget(labRechercheCat)
    layRechercheCat.addWidget(cmbRechercheCat)
    layRechercheCat.addWidget(btnRechercheCat)
    # Layout des deux types de recherche
    layRecherche: object = QHBoxLayout()
    layRecherche.addStretch()
    layRecherche.addLayout(layRechercheNom)
    layRecherche.addStretch()
    layRecherche.addLayout(layRechercheCat)
    layRecherche.addStretch()
    # Groupe des deux recherches
    grpRecherche: object = QGroupBox("Recherche")
    grpRecherche.setLayout(layRecherche)
    # Layout principale
    layMain: object = QVBoxLayout()
    layMain.addWidget(connState)
    layMain.addWidget(grpUser)
    layMain.addStretch()
    layMain.addWidget(grpRecherche)
    layMain.addStretch()
    # Si la fenêtre avait deja un layout au travers du "mainWidget",
    # on le supprime pour afficher les élements de cette fonction
    if hasattr(mainWindow, "mainWidget"):
        mainWindow.mainWidget.deleteLater()

    # On crée le mainWidget et on défini sont layout
    mainWindow.mainWidget = QWidget()
    mainWindow.mainWidget.setLayout(layMain)
    mainWindow.setCentralWidget(mainWindow.mainWidget)