addition of missing types and comments of functions

This commit is contained in:
Mylloon 2021-11-30 22:25:12 +01:00
parent a85fd36ebe
commit c4a1152015
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 else: # si le fichier existe
return True 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.""" """Envois une requête vers la base de données."""
try: try:
curseur = self.connexion.cursor() curseur = self.connexion.cursor()

50
main.py
View file

@ -112,7 +112,7 @@ class GesMag:
return False return False
return True 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.""" """Gère la connexion aux différentes interfaces de l'application."""
""" """
Vérification nom d'utilisateur / mot de passe correctement entré Vérification nom d'utilisateur / mot de passe correctement entré
@ -139,7 +139,7 @@ class GesMag:
else: else:
showerror("Erreur", "Utilisateur ou mot de passe incorrect.") 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.""" """Permet de changer les dimensions de la fenêtre parent et la place au centre de l'écran."""
largeur = fenetre.winfo_screenwidth() largeur = fenetre.winfo_screenwidth()
hauteur = fenetre.winfo_screenheight() hauteur = fenetre.winfo_screenheight()
@ -149,7 +149,7 @@ class GesMag:
fenetre.geometry(f"{nouveauX}x{nouveauY}+{x}+{y}") fenetre.geometry(f"{nouveauX}x{nouveauY}+{x}+{y}")
def _interfaceConnexion(self): def _interfaceConnexion(self) -> None:
"""Affiche l'interface de connexion.""" """Affiche l'interface de connexion."""
# Paramètres de la fenêtre # Paramètres de la fenêtre
self.dimensionsFenetre(self.parent, 400, 600) self.dimensionsFenetre(self.parent, 400, 600)
@ -175,7 +175,7 @@ class GesMag:
motDpasse.grid(column=1, row=4, columnspan=2, padx=ecart) motDpasse.grid(column=1, row=4, columnspan=2, padx=ecart)
motDpasse.bind("<Return>", tentativeDeConnexion) 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.""" """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 if self.mdpVisible == False: # si mot de passe caché, alors on l'affiche
self.mdpVisible = True 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) 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.""" """Affiche l'interface du caissier."""
caissier = Utilisateurs().recuperationUtilisateur(id=id) caissier = Utilisateurs().recuperationUtilisateur(id=id)
self.parent.title(f"Caissier {caissier['nom']} {caissier['prenom']} {self.nomApp}") self.parent.title(f"Caissier {caissier['nom']} {caissier['prenom']} {self.nomApp}")
@ -234,7 +234,7 @@ class GesMag:
boucheriePoissonnerieVerif = IntVar(stock) boucheriePoissonnerieVerif = IntVar(stock)
entretienVerif = 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).""" """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 # On supprime et refais la frame qui va stocker notre tableau
self.tableau.destroy() self.tableau.destroy()
@ -254,7 +254,7 @@ class GesMag:
stockListe = Stock().listeStocks() # stock récupéré de la base de données 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 Permet d'ajouter ou de retirer des éléments au panier
-> Action -> 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) 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.""" """Affiche le panier actuel dans le ticket de caisse."""
self.panierAffichage.destroy() self.panierAffichage.destroy()
self.panierAffichage = Frame(ticket) self.panierAffichage = Frame(ticket)
@ -420,7 +420,7 @@ class GesMag:
__affichagePanier() __affichagePanier()
def __validationTicketDeCaisse(): def __validationTicketDeCaisse() -> None:
"""Lance plusieurs méthodes pour valider le ticket de caisse.""" """Lance plusieurs méthodes pour valider le ticket de caisse."""
# Met à jour la valeur dans le fichier `CSV` (statistiques) # Met à jour la valeur dans le fichier `CSV` (statistiques)
Stats().miseAJourStatsUtilisateur(id, sum([element[0]["prix"] * element[1] for element in self.panier])) 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) validationTicketDeCaisseBouton.grid(column=0, pady=ecart)
# -> Partie ajout élément au stock # -> 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.""" """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`) L'enfant (`TopLevel`) dépend de la `Frame` et non du parent (`Tk`)
@ -452,7 +452,7 @@ class GesMag:
enfant = Toplevel(self.f) enfant = Toplevel(self.f)
enfant.title(f"Ajouter un élément au stock {self.nomApp}") 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.""" """Vérifie si les champs renseignées sont valides."""
""" """
La variable `ok` sert à savoir si la vérification est passée 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 # 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 # vérification pour le nom
def ___nomValide(nom: str) -> bool: 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: if len(nom) <= 0:
return False return False
if Stock().stockExistant(nom) == True: if Stock().stockExistant(nom) == True:
@ -528,7 +532,7 @@ class GesMag:
Label(enfant, text="Image :").grid(column=0, row=0, sticky='e') Label(enfant, text="Image :").grid(column=0, row=0, sticky='e')
image = Entry(enfant) image = Entry(enfant)
image.grid(column=1, row=0, sticky='w') 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.""" """Fonction qui permet de choisir une image dans l'arborescence de fichiers de l'utilisateur."""
try: try:
chemin = askopenfile(title="Choisir une image", filetypes=[("Image GIF", ".gif")]) chemin = askopenfile(title="Choisir une image", filetypes=[("Image GIF", ".gif")])
@ -556,7 +560,7 @@ class GesMag:
prix = Entry(enfant) prix = Entry(enfant)
prix.grid(column=1, row=4, sticky='w') prix.grid(column=1, row=4, sticky='w')
def ___viderChamps(): def ___viderChamps() -> None:
"""Vide tout les champs de leur contenu""" """Vide tout les champs de leur contenu"""
# On récupère toutes les `Entry` de la fenêtre et on change 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]: 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) Button(self.f, text="Ajouter un élément\nau stock", font=self.font, command=__ajouterElementStock).grid(column=1, row=2)
# -> Partie export des statistiques # -> Partie export des statistiques
def __exportation(): def __exportation() -> None:
"""Exporte dans un fichier choisie par l'utilisateur ses statistiques de la journée.""" """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")]) 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 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: 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) 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.""" """Affiche l'interface du manager."""
manager = Utilisateurs().recuperationUtilisateur(id=id) 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é # 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 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`).""" """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`) L'enfant (`TopLevel`) dépend de la `Frame` et non du parent (`Tk`)
@ -616,7 +620,7 @@ class GesMag:
enfant = Toplevel(self.f) enfant = Toplevel(self.f)
enfant.title(f"Ajouter un {'manager' if metier == 0 else 'caissier'} {self.nomApp}") 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.""" """Vérifie si les champs renseignées sont valides."""
""" """
Les valeurs `Entry` qui ne sont pas passés seront dans Les valeurs `Entry` qui ne sont pas passés seront dans
@ -711,7 +715,7 @@ class GesMag:
postal = Entry(enfant) postal = Entry(enfant)
postal.grid(column=1, row=6, sticky='w') postal.grid(column=1, row=6, sticky='w')
def ___viderChamps(): def ___viderChamps() -> None:
"""Vide tout les champs de leur contenu""" """Vide tout les champs de leur contenu"""
# On récupère toutes les `Entry` de la fenêtre et on change 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]: 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="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') 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`).""" """Permet de supprimer un utilisateur existant, manager (`metier = 0`) et caissier (`metier = 1`)."""
enfant = Toplevel(self.f) # cf. l'explication dans `__ajouterUtilisateur` enfant = Toplevel(self.f) # cf. l'explication dans `__ajouterUtilisateur`
enfant.title(f"Retirer un {'manager' if metier == 0 else 'caissier'} {self.nomApp}") 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) listeUtilisateurs_retirer.grid(column=0, row=1)
# On affiche l'utilisateur quand on double-clique dessus # On affiche l'utilisateur quand on double-clique dessus
def ___suppressionUtilisateur(): def ___suppressionUtilisateur() -> None:
"""Supprime l'utilisateur actuellement sélectionné dans la liste""" """Supprime l'utilisateur actuellement sélectionné dans la liste"""
element = listeUtilisateurs_retirer.curselection() element = listeUtilisateurs_retirer.curselection()
if len(element) == 0: # si aucun élément n'est selectionné 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="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') 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""" """Permet d'afficher les informations d'un utilisateur"""
element = listeUtilisateurs.curselection() element = listeUtilisateurs.curselection()
if len(element) == 0: # si aucun élément n'est selectionné 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 = LabelFrame(enfant, text="Histogramme des ventes", font=self.font)
frameSuivi.grid(column=1, row=0, sticky="ns", padx=5) 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.""" """Affiche l'histogramme des vente d'un utilisateur dans un canvas."""
donnees = Stats().recuperationDonneesCSV(utilisateur['id']) donnees = Stats().recuperationDonneesCSV(utilisateur['id'])
if len(donnees) <= 0: if len(donnees) <= 0:
@ -845,7 +849,7 @@ class GesMag:
caissierVerif.set(1) # par défaut on affiche que les caissiers 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. Ajoute des utilisateurs à la liste du Manager.
-> metier = 0 : manager uniquement -> metier = 0 : manager uniquement

View file

@ -18,7 +18,7 @@ class Stats():
dateAujourdHui = dateAujourdHui + timedelta(days=1) dateAujourdHui = dateAujourdHui + timedelta(days=1)
return datesPossibles 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. Créer le fichier `CSV` qui stockera les statistiques pour tous les utilisateurs.
@ -30,7 +30,7 @@ class Stats():
fichier = csv.writer(f) fichier = csv.writer(f)
fichier.writerow(["id", "pseudo"] + self.datesDisponibles()) 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. 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) 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`. Exporte les statistiques d'un utilisateur dans un fichier `CSV`.
- N'exporte que les statistiques du jour. - N'exporte que les statistiques du jour.
@ -109,7 +109,7 @@ class Stats():
return utilisateur # renvoie des infos de l'utilisateur return utilisateur # renvoie des infos de l'utilisateur
return {} # ne retourne rien si l'utilisateur n'était pas présent dans le fichier 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`. Mets-à-jour les dates trop anciennes du fichier globales `CSV`.

View file

@ -55,7 +55,7 @@ class Utilisateurs(BaseDeDonnees):
""" """
self.requete(requete, pseudo) 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 Retourne l'ID de l'utilisateur si trouvé dans la base de donnée ainsi
que son métier (`tuple`), sinon renvoie `(0,)`. que son métier (`tuple`), sinon renvoie `(0,)`.