addition of missing types and comments of functions

This commit is contained in:
Mylloon 2021-11-30 22:25:12 +01:00
parent 33f6b4d47b
commit 2edd7511bd
4 changed files with 33 additions and 29 deletions

2
db.py
View file

@ -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
View file

@ -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

View file

@ -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`.

View file

@ -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,)`.