diff --git a/db.py b/db.py index b1476c0..0c5dcd0 100644 --- a/db.py +++ b/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() diff --git a/main.py b/main.py index 2534403..ea34e23 100644 --- a/main.py +++ b/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("", 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 diff --git a/stats.py b/stats.py index b011cae..5975e35 100644 --- a/stats.py +++ b/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`. diff --git a/users.py b/users.py index 16b625e..77aa2a9 100644 --- a/users.py +++ b/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,)`.