summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDebulois <quentin@debulois.fr>2022-04-29 11:15:04 +0200
committerDebulois <quentin@debulois.fr>2022-04-29 11:15:04 +0200
commitafd6fb901b7e8f99cdb1bb0d2134cec2d6cebc3b (patch)
treef114b68fc1ede894da52e688ce29054b2774edc4
parent503d62407ce57bebfec5e7134b603d50e58c48da (diff)
Ajout de la gestion de ses infos
-rw-r--r--src/core/coreUser.py4
-rw-r--r--src/database/dbuser.py46
-rw-r--r--src/gui/globalMenu.py17
-rw-r--r--src/gui/pageHome.py8
-rw-r--r--src/gui/windowUserInfo.py193
-rw-r--r--src/main.py24
-rw-r--r--src/main.spec51
-rw-r--r--src/setup.py4
8 files changed, 295 insertions, 52 deletions
diff --git a/src/core/coreUser.py b/src/core/coreUser.py
index de9ccb8..b8129d4 100644
--- a/src/core/coreUser.py
+++ b/src/core/coreUser.py
@@ -19,7 +19,7 @@ def core_login(mainWindow, email, password) -> None:
mainWindow.userConnected = True
mainWindow.userId = str(search[0][0])
mainWindow.userEmail = search[0][1]
- mainWindow.userInscriptionDate = search[0][2]
+ mainWindow.userInscrDate = search[0][2]
if search[0][3] == 0:
mainWindow.userStatus = "Admin"
elif search[0][3] == 1:
@@ -46,7 +46,7 @@ def core_logout(mainWindow) -> None:
mainWindow.userConnected = False
mainWindow.userId = ""
mainWindow.userEmail = ""
- mainWindow.userInscriptionDate = ""
+ mainWindow.userInscrDate = ""
mainWindow.userStatus = ""
QMessageBox.information(
diff --git a/src/database/dbuser.py b/src/database/dbuser.py
index e71d936..a57845c 100644
--- a/src/database/dbuser.py
+++ b/src/database/dbuser.py
@@ -66,11 +66,10 @@ class DbUser(dbmain.DbMain):
return result[0]
# Mise à jour des infos d'un utilisateur
- def update_user_infos(self, userInfos, userId, isPro, userJobs=None):
+ def update_user_infos(
+ self, userInfos: list, userId: int,
+ isPro: bool, oldJobs: list = None, newJobs: list = None) -> None:
# Préparation de la requète pour mise à jour des infos
- # J'ai préféré faire deux requètes distinctes et ne pas utiliser des valeurs
- # passées par POST (key => value) pour gérer les noms des colonnes
- # car je préfère les passer en "dur" dans mes requêtes (risque d'injection SQL%s).
reqAddInfoClient = """
REPLACE INTO
""" + self.TABLEUSERINFO + """
@@ -94,36 +93,23 @@ class DbUser(dbmain.DbMain):
(%s, %s)"""
reqRemoveInfoProJobs = """
DELETE FROM
- """ + self.tableUserJob + """
+ """ + self.TABLEUSERJOB + """
WHERE
jobCategoryId = %s
AND
userId = %s"""
- # if not isPro:
- # # Exécution de la requète
- # # https:#www.php.net/manual/fr/function.array-values.php
- # # Pour passer de "dict" a "list" -> array_values()
- # args = [i for i in userInfos]
- # args.push(userId)
- # self.exec_cmd(reqAddInfoClient, args)
- # else:
- # # https:#stackoverflow.com/questions/15986235/how-to-use-json-stringify-and-json-decode-properly
- # # Récupération des emplois dans le JSON et supression de ces derniers de la liste
- # selectedJobs = json_decode(html_entity_decode(userInfos["jobs"]))
- # unset(userInfos["jobs"])
- # # array_value -> Qu'est ce qui est présent dans 1 mais pas dans 2 %s
- # # Comparaison des jobs anciennement présent avec ceux sélectionnés, donc ajoutés.
- # jobsAdded = array_values(array_diff(selectedJobs, userJobs))
- # # Comparaison des jobs deja présent avec ceux sélectionnés, donc ajoutés.
- # jobsRemoved = array_values(array_diff(userJobs, selectedJobs))
- # # on continue classiquement avec les autres éléments
- # args = array_values(userInfos)
- # array_push(args, userId)
- # self.exec_cmd(reqAddInfoPro, args)
- # for i in jobsAdded:
- # self.exec_cmd(reqAddInfoProJobs, array(jobsAdded[i], userId))
- # for i in jobsRemoved:
- # self.exec_cmd(reqRemoveInfoProJobs, array(jobsRemoved[i], userId))
+ if not isPro:
+ userInfos.append(userId)
+ self.exec_cmd(reqAddInfoClient, userInfos, True)
+ else:
+ userInfos.append(userId)
+ self.exec_cmd(reqAddInfoPro, userInfos, True)
+ jobsAdded = [i for i in newJobs if i not in oldJobs]
+ jobsRemoved = [i for i in oldJobs if i not in newJobs]
+ for i in jobsAdded:
+ self.exec_cmd(reqAddInfoProJobs, [i, userId], True)
+ for i in jobsRemoved:
+ self.exec_cmd(reqRemoveInfoProJobs, [i, userId], True)
# ****************************************************************************
# GESTION DU TOKEN AUTOLOGIN
diff --git a/src/gui/globalMenu.py b/src/gui/globalMenu.py
index b558ef3..36a88c4 100644
--- a/src/gui/globalMenu.py
+++ b/src/gui/globalMenu.py
@@ -3,7 +3,7 @@ from os.path import join
from pathlib import Path
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QAction
-from src.gui import windowAPropos, windowAdmin
+from src.gui import windowAPropos, windowAdmin, windowUserInfo
def init(mainWindow):
logo = join(Path(__file__).parent, "ressources", "icon.ico")
@@ -11,10 +11,6 @@ def init(mainWindow):
mainWindow.setWindowTitle("Alphajob")
menu = mainWindow.menuBar()
menu.clear() # Clear au cas où
- menuOptions = menu.addMenu("Options")
- btnApropos = QAction("A propos", mainWindow)
- btnApropos.triggered.connect(lambda: windowAPropos.main(mainWindow))
- menuOptions.addAction(btnApropos)
if mainWindow.userConnected and mainWindow.userStatus == "Admin":
menuAdmin = menu.addMenu("Admin")
btnEmplois = QAction("Gestion des emplois", mainWindow)
@@ -26,3 +22,14 @@ def init(mainWindow):
menuAdmin.addAction(btnEmplois)
menuAdmin.addAction(btnUsers)
menuAdmin.addAction(btnMissions)
+ elif mainWindow.userConnected and (
+ mainWindow.userStatus == "Pro" or mainWindow.userStatus == "Client"):
+ menuUserInfos = menu.addMenu("Mes infos")
+ btnMesInfos = QAction("Gérer ses infos", mainWindow)
+ btnMesInfos.triggered.connect(lambda: windowUserInfo.modif_infos(mainWindow))
+ menuUserInfos.addAction(btnMesInfos)
+
+ menuOptions = menu.addMenu("Options")
+ btnApropos = QAction("A propos", mainWindow)
+ btnApropos.triggered.connect(lambda: windowAPropos.main(mainWindow))
+ menuOptions.addAction(btnApropos)
diff --git a/src/gui/pageHome.py b/src/gui/pageHome.py
index 016d374..98a504f 100644
--- a/src/gui/pageHome.py
+++ b/src/gui/pageHome.py
@@ -43,7 +43,8 @@ def main(mainWindow, reloadMenu = False) -> None:
grpUtilisateur = QGroupBox("Gestion de l'utilisateur")
grpUtilisateur.setLayout(layoutUser)
- inputRechercheNom = QLineEdit("Nom d'un pro")
+ labRechercheNom = QLabel("Par nom")
+ inputRechercheNom = QLineEdit()
btnRechercheNom = QPushButton("Rechercher")
btnRechercheNom.clicked.connect(
lambda:
@@ -52,6 +53,7 @@ def main(mainWindow, reloadMenu = False) -> None:
inputRechercheNom.text()
)
)
+ labRechercheCat = QLabel("Par emploi")
comboRechercheCat = QComboBox()
alljobs = classSearch.get_job_all()
for i in alljobs:
@@ -66,9 +68,11 @@ def main(mainWindow, reloadMenu = False) -> None:
)
layoutRechercheNom = QVBoxLayout()
+ layoutRechercheNom.addWidget(labRechercheNom)
layoutRechercheNom.addWidget(inputRechercheNom)
layoutRechercheNom.addWidget(btnRechercheNom)
layoutRechercheCat = QVBoxLayout()
+ layoutRechercheCat.addWidget(labRechercheCat)
layoutRechercheCat.addWidget(comboRechercheCat)
layoutRechercheCat.addWidget(btnRechercheCat)
@@ -79,7 +83,7 @@ def main(mainWindow, reloadMenu = False) -> None:
layoutRecherche.addLayout(layoutRechercheCat)
layoutRecherche.addStretch()
- grpRecherche = QGroupBox("Recherche par nom ou emploi")
+ grpRecherche = QGroupBox("Recherche")
grpRecherche.setLayout(layoutRecherche)
layoutMain = QVBoxLayout()
diff --git a/src/gui/windowUserInfo.py b/src/gui/windowUserInfo.py
new file mode 100644
index 0000000..ccdcb27
--- /dev/null
+++ b/src/gui/windowUserInfo.py
@@ -0,0 +1,193 @@
+
+from PyQt5.QtWidgets import (
+ QDialog, QGroupBox, QLabel,
+ QLineEdit, QVBoxLayout, QHBoxLayout,
+ QPushButton, QComboBox, QMessageBox
+)
+from src.database.dbuser import DbUser
+from src.database.dbsearch import DbSearch
+
+
+def add_job(jobName: str, jobId: int, listMyJobs: list, layMyJobs: object) -> None:
+ if jobId not in listMyJobs:
+ listMyJobs.append(jobId)
+ lineMyJobs: object = QHBoxLayout()
+ labJob: object = QLabel(jobName)
+ btnRemoveJob: object = QPushButton("Supprimer")
+ btnRemoveJob.clicked.connect(
+ lambda checked, jId=jobId, layItem=lineMyJobs: [
+ listMyJobs.remove(jId),
+ delete_job(layItem)
+ ]
+ )
+ lineMyJobs.addWidget(labJob)
+ lineMyJobs.addStretch()
+ lineMyJobs.addWidget(btnRemoveJob)
+ layMyJobs.addLayout(lineMyJobs)
+
+def delete_job(layLineJob: object) -> None:
+ lab: object = layLineJob.itemAt(0).widget()
+ btn: object = layLineJob.itemAt(2).widget()
+ lab.deleteLater()
+ btn.deleteLater()
+ layLineJob.deleteLater()
+
+def validate(mainWindow: object, dial: object, layoutLines: list, oldJobs: list = None, newJobs: list = None) -> None:
+ user: object = DbUser(mainWindow = mainWindow)
+ userInfos: list = []
+ for i in layoutLines:
+ if i != "selectJobs" and i != "myJobs":
+ lineInput: object = layoutLines[i].itemAt(2).widget()
+ userInfos.append(lineInput.text())
+
+ if mainWindow.userStatus == "Pro":
+ isPro: bool = True
+ else:
+ isPro: bool = False
+
+ if "" in userInfos:
+ QMessageBox.warning(
+ dial,
+ "Mes informations",
+ "Veuillez renseigner tous les champs"
+ )
+ return
+
+ user.update_user_infos(userInfos, mainWindow.userId, isPro, oldJobs, newJobs)
+ QMessageBox.information(
+ dial,
+ "Mes informations",
+ "Modification enregistrée"
+ )
+
+
+# https://stackoverflow.com/questions/3077192/get-a-layouts-widgets-in-pyqt
+def modif_infos(mainWindow: object) -> None:
+ dial: object = QDialog(parent = mainWindow)
+ dial.setWindowTitle("Mes infos")
+
+ search: object = DbSearch(mainWindow)
+ infos: list = search.get_user_info_by_userid(mainWindow.userId)
+
+ 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"
+ ]
+
+ layoutLines: list = {}
+ for i in champsClients:
+ layoutLines[i] = QHBoxLayout()
+ layoutLines[i].addWidget(QLabel(i))
+ layoutLines[i].addStretch()
+ if infos:
+ if i == "Téléphone":
+ layoutLines[i].addWidget(QLineEdit(champsClients[i], maxLength=10))
+ elif i == "Code postal":
+ layoutLines[i].addWidget(QLineEdit(champsClients[i], maxLength=6))
+ else:
+ layoutLines[i].addWidget(QLineEdit(champsClients[i], maxLength=128))
+ else:
+ if i == "Téléphone":
+ layoutLines[i].addWidget(QLineEdit(maxLength=10))
+ elif i == "Code postal":
+ layoutLines[i].addWidget(QLineEdit(maxLength=6))
+ else:
+ layoutLines[i].addWidget(QLineEdit(maxLength=128))
+
+ if mainWindow.userStatus == "Pro":
+ allJobs: object = search.get_job_all()
+ labSelectJobs: object = QLabel("Les emplois:")
+ cmbAllJobs: object = QComboBox()
+ lineSelectJobs: object = QHBoxLayout()
+ for i in allJobs:
+ cmbAllJobs.addItem(f"{i[2]}", i[0])
+ btnSelectJobs = QPushButton("Ajouter")
+ btnSelectJobs.clicked.connect(
+ lambda :
+ add_job(
+ cmbAllJobs.currentText(),
+ cmbAllJobs.currentData(),
+ newJobs,
+ layMyJobs
+ )
+ )
+ lineSelectJobs.addWidget(labSelectJobs)
+ lineSelectJobs.addStretch()
+ lineSelectJobs.addWidget(cmbAllJobs)
+ lineSelectJobs.addStretch()
+ lineSelectJobs.addWidget(btnSelectJobs)
+ layoutLines["selectJobs"] = lineSelectJobs
+
+ myJobs: object = search.get_pro_job_by_proid(mainWindow.userId)
+ layMyJobs: object = QVBoxLayout()
+ newJobs: list = []
+ for i in myJobs:
+ add_job(i[2], i[0], newJobs, layMyJobs)
+ oldJobs: list = newJobs.copy() # Sinon pointer !!!
+
+ layoutLines["myJobs"] = layMyJobs
+
+ for i in champsPro:
+ layoutLines[i] = QHBoxLayout()
+ layoutLines[i].addWidget(QLabel(i))
+ layoutLines[i].addStretch()
+ if infos:
+ layoutLines[i].addWidget(QLineEdit(champsPro[i], maxLength=256))
+ else:
+ layoutLines[i].addWidget(QLineEdit(maxLength=256))
+
+ modifLayout: object = QVBoxLayout()
+ for i in layoutLines:
+ modifLayout.addLayout(layoutLines[i])
+
+ btnModif: object = QPushButton("modifer")
+ btnModif.clicked.connect(
+ lambda:
+ validate(
+ mainWindow,
+ dial,
+ layoutLines,
+ oldJobs,
+ newJobs
+ ) if mainWindow.userStatus == "Pro"
+ else validate(
+ mainWindow,
+ dial,
+ layoutLines
+ )
+ )
+ layoutBtn: object = QHBoxLayout()
+ layoutBtn.addStretch()
+ layoutBtn.addWidget(btnModif)
+ modifLayout.addLayout(layoutBtn)
+
+ grpMain: object = QGroupBox("Mes infos")
+ grpMain.setLayout(modifLayout)
+ mainLayout: object = QVBoxLayout()
+ mainLayout.addWidget(grpMain)
+ dial.setLayout(mainLayout)
+ dial.show()
diff --git a/src/main.py b/src/main.py
index bc4950e..bbff713 100644
--- a/src/main.py
+++ b/src/main.py
@@ -1,24 +1,22 @@
-from sys import argv
+import sys
from PyQt5.QtWidgets import QMainWindow, QApplication
from src.gui import pageHome
from src.gui import globalMenu
-"""
-https://peps.python.org/pep-0008/
-'python a = lambda a, b: truc' = 'js a = (a, b) => {truc}' = Fonction anonyme
-"""
class mainWindow(QMainWindow):
+
VERSION = 0.1
- # Misc
+
mysqlReachable: bool = False
- # Utilisateur
+
userConnected: bool = False
- userId: str = ""
- userEmail: str = ""
- userInscriptionDate: str = ""
- userStatus: str = ""
+ userId: str = ""
+ userEmail: str = ""
+ userStatus: str = ""
+ userInscrDate: str = ""
+
def __init__(self) -> None:
super().__init__() # Déclenche l'"__init__" de QMainWindow
globalMenu.init(self)
@@ -29,9 +27,9 @@ if __name__ == "__main__":
def main():
"""Démarrage de l'app
"""
- APP = QApplication(argv)
+ APP = QApplication(sys.argv)
GUI = mainWindow()
GUI.show()
- exit(APP.exec_())
+ sys.exit(APP.exec_())
main()
diff --git a/src/main.spec b/src/main.spec
new file mode 100644
index 0000000..47ce1af
--- /dev/null
+++ b/src/main.spec
@@ -0,0 +1,51 @@
+# -*- mode: python ; coding: utf-8 -*-
+
+
+block_cipher = None
+
+
+a = Analysis(
+ ['main.py'],
+ pathex=[],
+ binaries=[],
+ datas=[],
+ hiddenimports=[],
+ hookspath=[],
+ hooksconfig={},
+ runtime_hooks=[],
+ excludes=[],
+ win_no_prefer_redirects=False,
+ win_private_assemblies=False,
+ cipher=block_cipher,
+ noarchive=False,
+)
+pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
+
+exe = EXE(
+ pyz,
+ a.scripts,
+ [],
+ exclude_binaries=True,
+ name='main',
+ debug=False,
+ bootloader_ignore_signals=False,
+ strip=False,
+ upx=True,
+ console=False,
+ disable_windowed_traceback=False,
+ argv_emulation=False,
+ target_arch=None,
+ codesign_identity=None,
+ entitlements_file=None,
+ icon='gui\\ressources\\icon.ico',
+)
+coll = COLLECT(
+ exe,
+ a.binaries,
+ a.zipfiles,
+ a.datas,
+ strip=False,
+ upx=True,
+ upx_exclude=[],
+ name='main',
+)
diff --git a/src/setup.py b/src/setup.py
new file mode 100644
index 0000000..56e2478
--- /dev/null
+++ b/src/setup.py
@@ -0,0 +1,4 @@
+
+from os import system
+
+system("pyinstaller -w -i ./gui/ressources/icon.ico main.py")