addition of missing types and comments of functions
This commit is contained in:
parent
33f6b4d47b
commit
2edd7511bd
4 changed files with 33 additions and 29 deletions
2
db.py
2
db.py
|
@ -25,7 +25,7 @@ class BaseDeDonnees:
|
|||
else: # si le fichier existe
|
||||
return True
|
||||
|
||||
def requete(self, requete: str, valeurs = None):
|
||||
def requete(self, requete: str, valeurs = None) -> tuple:
|
||||
"""Envois une requête vers la base de données."""
|
||||
try:
|
||||
curseur = self.connexion.cursor()
|
||||
|
|
50
main.py
50
main.py
|
@ -112,7 +112,7 @@ class GesMag:
|
|||
return False
|
||||
return True
|
||||
|
||||
def connexion(self, utilisateur: str, motDePasse: str):
|
||||
def connexion(self, utilisateur: str, motDePasse: str) -> None:
|
||||
"""Gère la connexion aux différentes interfaces de l'application."""
|
||||
"""
|
||||
Vérification nom d'utilisateur / mot de passe correctement entré
|
||||
|
@ -139,7 +139,7 @@ class GesMag:
|
|||
else:
|
||||
showerror("Erreur", "Utilisateur ou mot de passe incorrect.")
|
||||
|
||||
def dimensionsFenetre(self, fenetre, nouveauX: int, nouveauY: int):
|
||||
def dimensionsFenetre(self, fenetre, nouveauX: int, nouveauY: int) -> None:
|
||||
"""Permet de changer les dimensions de la fenêtre parent et la place au centre de l'écran."""
|
||||
largeur = fenetre.winfo_screenwidth()
|
||||
hauteur = fenetre.winfo_screenheight()
|
||||
|
@ -149,7 +149,7 @@ class GesMag:
|
|||
|
||||
fenetre.geometry(f"{nouveauX}x{nouveauY}+{x}+{y}")
|
||||
|
||||
def _interfaceConnexion(self):
|
||||
def _interfaceConnexion(self) -> None:
|
||||
"""Affiche l'interface de connexion."""
|
||||
# Paramètres de la fenêtre
|
||||
self.dimensionsFenetre(self.parent, 400, 600)
|
||||
|
@ -175,7 +175,7 @@ class GesMag:
|
|||
motDpasse.grid(column=1, row=4, columnspan=2, padx=ecart)
|
||||
motDpasse.bind("<Return>", tentativeDeConnexion)
|
||||
|
||||
def __afficherMDP(self):
|
||||
def __afficherMDP(self) -> None:
|
||||
"""Permet de gérer l'affichage du mot de passe dans le champs sur la page de connexion."""
|
||||
if self.mdpVisible == False: # si mot de passe caché, alors on l'affiche
|
||||
self.mdpVisible = True
|
||||
|
@ -197,7 +197,7 @@ class GesMag:
|
|||
|
||||
Button(self.f, text="Quitter", font=self.font, command=quit).grid(column=0, row=6, columnspan=4, pady=20)
|
||||
|
||||
def _interfaceCaissier(self, id: int):
|
||||
def _interfaceCaissier(self, id: int) -> None:
|
||||
"""Affiche l'interface du caissier."""
|
||||
caissier = Utilisateurs().recuperationUtilisateur(id=id)
|
||||
self.parent.title(f"Caissier {caissier['nom']} {caissier['prenom']} – {self.nomApp}")
|
||||
|
@ -234,7 +234,7 @@ class GesMag:
|
|||
boucheriePoissonnerieVerif = IntVar(stock)
|
||||
entretienVerif = IntVar(stock)
|
||||
|
||||
def __affichageTableau(page: int = 1):
|
||||
def __affichageTableau(page: int = 1) -> None:
|
||||
"""Fonction qui va actualiser le tableau avec une page donnée (par défaut affiche la première page)."""
|
||||
# On supprime et refais la frame qui va stocker notre tableau
|
||||
self.tableau.destroy()
|
||||
|
@ -254,7 +254,7 @@ class GesMag:
|
|||
|
||||
stockListe = Stock().listeStocks() # stock récupéré de la base de données
|
||||
|
||||
def ___miseAJourPanier(element: dict, action: bool):
|
||||
def ___miseAJourPanier(element: dict, action: bool) -> None:
|
||||
"""
|
||||
Permet d'ajouter ou de retirer des éléments au panier
|
||||
-> Action
|
||||
|
@ -387,7 +387,7 @@ class GesMag:
|
|||
|
||||
Label(ticket, text=f"Date de vente : {date.today().strftime('%Y/%m/%d')}").grid(column=0, row=0, pady=ecart)
|
||||
|
||||
def __affichagePanier():
|
||||
def __affichagePanier() -> None:
|
||||
"""Affiche le panier actuel dans le ticket de caisse."""
|
||||
self.panierAffichage.destroy()
|
||||
self.panierAffichage = Frame(ticket)
|
||||
|
@ -420,7 +420,7 @@ class GesMag:
|
|||
|
||||
__affichagePanier()
|
||||
|
||||
def __validationTicketDeCaisse():
|
||||
def __validationTicketDeCaisse() -> None:
|
||||
"""Lance plusieurs méthodes pour valider le ticket de caisse."""
|
||||
# Met à jour la valeur dans le fichier `CSV` (statistiques)
|
||||
Stats().miseAJourStatsUtilisateur(id, sum([element[0]["prix"] * element[1] for element in self.panier]))
|
||||
|
@ -443,7 +443,7 @@ class GesMag:
|
|||
validationTicketDeCaisseBouton.grid(column=0, pady=ecart)
|
||||
|
||||
# -> Partie ajout élément au stock
|
||||
def __ajouterElementStock():
|
||||
def __ajouterElementStock() -> None:
|
||||
"""Ouvre une fenêtre qui permet d'ajouter un nouvel élément à la base de donnée."""
|
||||
"""
|
||||
L'enfant (`TopLevel`) dépend de la `Frame` et non du parent (`Tk`)
|
||||
|
@ -452,7 +452,7 @@ class GesMag:
|
|||
enfant = Toplevel(self.f)
|
||||
enfant.title(f"Ajouter un élément au stock – {self.nomApp}")
|
||||
|
||||
def ___verification():
|
||||
def ___verification() -> None:
|
||||
"""Vérifie si les champs renseignées sont valides."""
|
||||
"""
|
||||
La variable `ok` sert à savoir si la vérification est passée
|
||||
|
@ -473,6 +473,10 @@ class GesMag:
|
|||
# Pas de coloration orange si le type est mauvais parce que on ne peut pas changé la couleur de fond d'une ComboBox
|
||||
# vérification pour le nom
|
||||
def ___nomValide(nom: str) -> bool:
|
||||
"""
|
||||
Vérifie si un nom est valide pour le stock.
|
||||
(non vide et pas déjà présent dans la base de donnée)
|
||||
"""
|
||||
if len(nom) <= 0:
|
||||
return False
|
||||
if Stock().stockExistant(nom) == True:
|
||||
|
@ -528,7 +532,7 @@ class GesMag:
|
|||
Label(enfant, text="Image :").grid(column=0, row=0, sticky='e')
|
||||
image = Entry(enfant)
|
||||
image.grid(column=1, row=0, sticky='w')
|
||||
def ___selectionImage():
|
||||
def ___selectionImage() -> None:
|
||||
"""Fonction qui permet de choisir une image dans l'arborescence de fichiers de l'utilisateur."""
|
||||
try:
|
||||
chemin = askopenfile(title="Choisir une image", filetypes=[("Image GIF", ".gif")])
|
||||
|
@ -556,7 +560,7 @@ class GesMag:
|
|||
prix = Entry(enfant)
|
||||
prix.grid(column=1, row=4, sticky='w')
|
||||
|
||||
def ___viderChamps():
|
||||
def ___viderChamps() -> None:
|
||||
"""Vide tout les champs de leur contenu"""
|
||||
# On récupère toutes les `Entry` de la fenêtre et on change leur contenu
|
||||
for champ in [widget for typeElement, widget in enfant.children.items() if "entry" in typeElement]:
|
||||
|
@ -571,7 +575,7 @@ class GesMag:
|
|||
Button(self.f, text="Ajouter un élément\nau stock", font=self.font, command=__ajouterElementStock).grid(column=1, row=2)
|
||||
|
||||
# -> Partie export des statistiques
|
||||
def __exportation():
|
||||
def __exportation() -> None:
|
||||
"""Exporte dans un fichier choisie par l'utilisateur ses statistiques de la journée."""
|
||||
chemin = asksaveasfile(title=f"Exportation des statistiques de {caissier['nom']} {caissier['prenom']}", filetypes=[("Fichier CSV", ".csv")])
|
||||
if chemin == None: # si rien n'a été spécifie on arrête l'exportation
|
||||
|
@ -585,7 +589,7 @@ class GesMag:
|
|||
if caissier["metier"] == 0:
|
||||
Button(self.f, text="Passer en mode Manager", font=self.font, command=lambda: self._interfaceManager(id)).grid(column=0, row=2, sticky='w', padx=220)
|
||||
|
||||
def _interfaceManager(self, id: int):
|
||||
def _interfaceManager(self, id: int) -> None:
|
||||
"""Affiche l'interface du manager."""
|
||||
manager = Utilisateurs().recuperationUtilisateur(id=id)
|
||||
# Dans le cas où un utilisateur réussi à trouvé cette interface alors qu'il n'a pas le droit, il sera bloqué
|
||||
|
@ -607,7 +611,7 @@ class GesMag:
|
|||
|
||||
Label(self.f).grid(row = 1, pady=10) # séparateur
|
||||
|
||||
def __ajouterUtilisateur(metier: int):
|
||||
def __ajouterUtilisateur(metier: int) -> None:
|
||||
"""Permet de créer un nouvel utilisateur, manager (`metier = 0`) et caissier (`metier = 1`)."""
|
||||
"""
|
||||
L'enfant (`TopLevel`) dépend de la `Frame` et non du parent (`Tk`)
|
||||
|
@ -616,7 +620,7 @@ class GesMag:
|
|||
enfant = Toplevel(self.f)
|
||||
enfant.title(f"Ajouter un {'manager' if metier == 0 else 'caissier'} – {self.nomApp}")
|
||||
|
||||
def ___verification():
|
||||
def ___verification() -> None:
|
||||
"""Vérifie si les champs renseignées sont valides."""
|
||||
"""
|
||||
Les valeurs `Entry` qui ne sont pas passés seront dans
|
||||
|
@ -711,7 +715,7 @@ class GesMag:
|
|||
postal = Entry(enfant)
|
||||
postal.grid(column=1, row=6, sticky='w')
|
||||
|
||||
def ___viderChamps():
|
||||
def ___viderChamps() -> None:
|
||||
"""Vide tout les champs de leur contenu"""
|
||||
# On récupère toutes les `Entry` de la fenêtre et on change leur contenu
|
||||
for champ in [widget for typeElement, widget in enfant.children.items() if "entry" in typeElement]:
|
||||
|
@ -723,7 +727,7 @@ class GesMag:
|
|||
Button(enfant, text="Vider les champs", command=___viderChamps).grid(column=0, row=8, columnspan=3)
|
||||
Button(enfant, text="Quitter", command=enfant.destroy).grid(column=0, row=8, columnspan=3, sticky='e')
|
||||
|
||||
def __retirerUtilisateur(metier: int):
|
||||
def __retirerUtilisateur(metier: int) -> None:
|
||||
"""Permet de supprimer un utilisateur existant, manager (`metier = 0`) et caissier (`metier = 1`)."""
|
||||
enfant = Toplevel(self.f) # cf. l'explication dans `__ajouterUtilisateur`
|
||||
enfant.title(f"Retirer un {'manager' if metier == 0 else 'caissier'} – {self.nomApp}")
|
||||
|
@ -741,7 +745,7 @@ class GesMag:
|
|||
listeUtilisateurs_retirer.grid(column=0, row=1)
|
||||
# On affiche l'utilisateur quand on double-clique dessus
|
||||
|
||||
def ___suppressionUtilisateur():
|
||||
def ___suppressionUtilisateur() -> None:
|
||||
"""Supprime l'utilisateur actuellement sélectionné dans la liste"""
|
||||
element = listeUtilisateurs_retirer.curselection()
|
||||
if len(element) == 0: # si aucun élément n'est selectionné
|
||||
|
@ -759,7 +763,7 @@ class GesMag:
|
|||
Button(enfant, text="Supprimer", command=___suppressionUtilisateur).grid(column=0, row=8, columnspan=3, sticky='w')
|
||||
Button(enfant, text="Quitter", command=enfant.destroy).grid(column=0, row=8, columnspan=3, sticky='e')
|
||||
|
||||
def __afficherInformationsUtilisateur(_):
|
||||
def __afficherInformationsUtilisateur(_) -> None:
|
||||
"""Permet d'afficher les informations d'un utilisateur"""
|
||||
element = listeUtilisateurs.curselection()
|
||||
if len(element) == 0: # si aucun élément n'est selectionné
|
||||
|
@ -789,7 +793,7 @@ class GesMag:
|
|||
frameSuivi = LabelFrame(enfant, text="Histogramme des ventes", font=self.font)
|
||||
frameSuivi.grid(column=1, row=0, sticky="ns", padx=5)
|
||||
|
||||
def ___actualisationCanvas():
|
||||
def ___actualisationCanvas() -> None:
|
||||
"""Affiche l'histogramme des vente d'un utilisateur dans un canvas."""
|
||||
donnees = Stats().recuperationDonneesCSV(utilisateur['id'])
|
||||
if len(donnees) <= 0:
|
||||
|
@ -845,7 +849,7 @@ class GesMag:
|
|||
|
||||
caissierVerif.set(1) # par défaut on affiche que les caissiers
|
||||
|
||||
def __ajouterUtilisateursListe(liste: Listbox, force: int = None):
|
||||
def __ajouterUtilisateursListe(liste: Listbox, force: int = None) -> None:
|
||||
"""
|
||||
Ajoute des utilisateurs à la liste du Manager.
|
||||
-> metier = 0 : manager uniquement
|
||||
|
|
8
stats.py
8
stats.py
|
@ -18,7 +18,7 @@ class Stats():
|
|||
dateAujourdHui = dateAujourdHui + timedelta(days=1)
|
||||
return datesPossibles
|
||||
|
||||
def creationCSV(self, force: bool = False):
|
||||
def creationCSV(self, force: bool = False) -> None:
|
||||
"""
|
||||
Créer le fichier `CSV` qui stockera les statistiques pour tous les utilisateurs.
|
||||
|
||||
|
@ -30,7 +30,7 @@ class Stats():
|
|||
fichier = csv.writer(f)
|
||||
fichier.writerow(["id", "pseudo"] + self.datesDisponibles())
|
||||
|
||||
def miseAJourStatsUtilisateur(self, utilisateurID: int, prix: float):
|
||||
def miseAJourStatsUtilisateur(self, utilisateurID: int, prix: float) -> None:
|
||||
"""
|
||||
Récupère le prix d'une transaction et l'ajoute au total d'un utilisateur.
|
||||
|
||||
|
@ -84,7 +84,7 @@ class Stats():
|
|||
ecriture.writerows(fichier)
|
||||
|
||||
|
||||
def exporteCSV(self, chemin: str, utilisateurID: int):
|
||||
def exporteCSV(self, chemin: str, utilisateurID: int) -> None:
|
||||
"""
|
||||
Exporte les statistiques d'un utilisateur dans un fichier `CSV`.
|
||||
- N'exporte que les statistiques du jour.
|
||||
|
@ -109,7 +109,7 @@ class Stats():
|
|||
return utilisateur # renvoie des infos de l'utilisateur
|
||||
return {} # ne retourne rien si l'utilisateur n'était pas présent dans le fichier
|
||||
|
||||
def miseAJourDatesCSV(self):
|
||||
def miseAJourDatesCSV(self) -> None:
|
||||
"""
|
||||
Mets-à-jour les dates trop anciennes du fichier globales `CSV`.
|
||||
|
||||
|
|
2
users.py
2
users.py
|
@ -55,7 +55,7 @@ class Utilisateurs(BaseDeDonnees):
|
|||
"""
|
||||
self.requete(requete, pseudo)
|
||||
|
||||
def verificationIdentifiants(self, pseudo: str, motDePasse: str):
|
||||
def verificationIdentifiants(self, pseudo: str, motDePasse: str) -> tuple:
|
||||
"""
|
||||
Retourne l'ID de l'utilisateur si trouvé dans la base de donnée ainsi
|
||||
que son métier (`tuple`), sinon renvoie `(0,)`.
|
||||
|
|
Reference in a new issue