diff --git a/Controllers/BrowseController.py b/Controllers/BrowseController.py new file mode 100644 index 0000000..f84047c --- /dev/null +++ b/Controllers/BrowseController.py @@ -0,0 +1,78 @@ +# -*-coding:utf8 -* +"""Controleur pour la fenêtre de navigation""" + +import sys +import os +DOSSIER_COURRANT = os.path.dirname(os.path.abspath(__file__)) +DOSSIER_PARENT = os.path.dirname(DOSSIER_COURRANT) +sys.path.append(DOSSIER_PARENT) +from Controllers.Functions import Functions +from DB.dbLink import DBLink as DB +from Projects.Model import Project + + +class BrowseController: + """Classe contenant les fonctions de contrôle utiles à la fenêtre de navigation""" + + def __init__(self): + self.link = DB() + + + def get_projects_list(self): + """Renvoie la liste des projets ouverts""" + + #Requete permettant d'obtenir la liste des ID des projets au statut "ouvert" (1) + + ##On prépare la liste des ID et la Requete + proj_ids = list() + + query = "SELECT IDProj \ + FROM projet \ + WHERE IDStat = (SELECT IDStat \ + FROM statut \ + WHERE Statut LIKE('%uvert%'))" + result = self.link.query(query, []).fetchall() + for idproj in result: + proj_ids.append(idproj[0]) + + #Depuis cette liste, charger chaque projet dans une autre liste + proj_list = list() + for pid in proj_ids: + proj_list.append(Project(pid)) + + return proj_list + + def get_projects_search_results(self, search_query): + """Renvoie la liste des projets correspondant à une recherche""" + ##On prépare la liste des ID et la Requete + proj_ids = list() + + query = "SELECT IDProj \ + FROM projet \ + WHERE Intitulé REGEXP %s \ + OR NumDossier REGEXP %s \ + AND IDStat = (SELECT IDStat \ + FROM statut \ + WHERE Statut LIKE('%uvert%')) " + result = self.link.query(query, [search_query, search_query]).fetchall() + for idproj in result: + proj_ids.append(idproj[0]) + + #Depuis cette liste, charger chaque projet dans une autre liste + proj_list = list() + for pid in proj_ids: + proj_list.append(Project(pid)) + + return proj_list + + + + + + +############## TESTS ################# + +test = BrowseController() +liste = test.get_projects_search_results("ou") +for elem in liste: + print(elem.nom) diff --git a/Controllers/Functions.py b/Controllers/Functions.py new file mode 100644 index 0000000..539372c --- /dev/null +++ b/Controllers/Functions.py @@ -0,0 +1,23 @@ +# -*-coding:utf8 -* +"""Fonctions générales au logiciel""" + +import sys +import os +DOSSIER_COURRANT = os.path.dirname(os.path.abspath(__file__)) +DOSSIER_PARENT = os.path.dirname(DOSSIER_COURRANT) +sys.path.append(DOSSIER_PARENT) +from Auth.authentication import Auth as Auth +from Users.Model import User as User + + +class Functions: + + def __init__(self): + + #Initialisation AUTH POUR TESTS - A SUPPRIMER + authy = Auth("test", "test") + ############ + + Functions.current_user = User(Auth.current_user_id) + +###### TESTS ######## diff --git a/Projects/Model.py b/Projects/Model.py index c8c71f4..8a8ccc1 100644 --- a/Projects/Model.py +++ b/Projects/Model.py @@ -5,7 +5,7 @@ import DB.dbLink as db class Project: """Modèle projet. Contient un objet projet.""" - def __init__(self, proj_id='', nom='', description='', num_dossier='', budget=0, client=1, statut=1, responsable=1): + def __init__(self, proj_id='', nom='', description='', num_dossier='', budget=0, client="", statut=1, responsable=1): """Constructeur initialisant le projet à partir de son ID""" #On load le projet depuis la BDD si demandé avec un ID @@ -14,7 +14,7 @@ class Project: #On va chercher le projet en base de données link = db.DBLink() query = "SELECT p.Intitulé AS bdd_nom, p.Description AS bdd_description, p.NumDossier AS num_dossier, p.Budget AS budget, \ - c.IDClie AS client, s.IDStat AS statut, p.IDUtil AS responsable \ + c.RaisonSociale AS client, c.IDClie AS idclient, s.IDStat AS statut, p.IDUtil AS responsable \ FROM projet AS p \ JOIN client AS c ON p.IDClient = c.IDClie \ JOIN statut AS s ON p.IDStat = s.IDStat \ @@ -22,7 +22,7 @@ class Project: result = link.query(query, [self._id_proj, ]) #On hydrate l'objet à partir des éléments récupérés en BDD - for bdd_nom, bdd_description, bdd_num_dossier, bdd_budget, bdd_client, bdd_statut, bdd_responsable in result: + for bdd_nom, bdd_description, bdd_num_dossier, bdd_budget, bdd_client, bdd_statut, bdd_responsable, bdd_idclient in result: self.nom = bdd_nom self.description = bdd_description self.num_dossier = bdd_num_dossier @@ -30,6 +30,7 @@ class Project: self.client = bdd_client self.statut = bdd_statut self.responsable = bdd_responsable + self.id_client = bdd_idclient #Sinon, on hydrate à partir des champs renseignés en paramètre else: @@ -45,16 +46,13 @@ class Project: """Enregistrement d'un projet""" link = db.DBLink() - # Vérifier si le projet existe - # Si oui, récupérer son ID - # Si non, le créer et récupérer son ID - - + #On gère le client + self.registerClient() #Enregistrement des données query = "INSERT INTO projet \ (Intitulé, Description, NumDossier, Budget, IDStat, IDClient, IDUtil) \ VALUES (%s, %s, %s, %s, %s, %s, %s)" - link.commit(query, [self.nom, self.description, self.num_dossier, self.budget, self.statut, self.client, self.responsable]) + link.commit(query, [self.nom, self.description, self.num_dossier, self.budget, self.statut, self.id_client, self.responsable]) #Chargement de l'id ainsi créé query = "SELECT IDProj \ @@ -72,7 +70,7 @@ class Project: query = "UPDATE projet \ SET Intitulé = %s, Description = %s, NumDossier = %s, Budget = %s, IDUtil = %s, IDClient = %s, IDStat = %s \ WHERE IDProj = %s" - link.commit(query, [self.nom, self.description, self.num_dossier, self.budget, self.responsable, self.client, self.statut, self._id_proj]) + link.commit(query, [self.nom, self.description, self.num_dossier, self.budget, self.responsable, self.id_client, self.statut, self._id_proj]) def delete(self): """supprimer l'utilisateur""" @@ -82,3 +80,26 @@ class Project: FROM projet \ WHERE IDProj = %s" link.commit(query, [self._id_proj, ]) + + def registerClient(self): + """Enregistrement du client en BDD""" + link = db.DBLink() + + #On vérifie si le client existe + query = "SELECT IDClie \ + FROM client \ + WHERE RaisonSociale = %s " + result = link.query(query, [self.client, ]).fetchone() + + #Si oui, on récupère son ID + if result is not None: + for element in result: + self.id_client = element + else: + #Sinon, on enregistre en BDD + link = db.DBLink() + query = "INSERT INTO client \ + SET RaisonSociale = (%s)" + result = link.commit(query, [self.client, ]) + #Récupération de l'ID + self.id_client = result.lastrowid diff --git a/Users/Model.py b/Users/Model.py index f52bb31..54a142f 100644 --- a/Users/Model.py +++ b/Users/Model.py @@ -100,7 +100,7 @@ class User: result = link.query(query, [self._id_table, ]) for id_role, role in result: - self.roles[role] = id_role + self.roles[id_role] = role def update_roles(self): """enregistrement/mise à jour des roles de l'uitlisateur""" @@ -113,7 +113,7 @@ class User: link.commit(query, [self._id_table, ]) #Puis on enregistre les nouveaux - for rol_id in self.roles.values(): + for rol_id in self.roles.keys(): query = "INSERT INTO roleattribution \ (IDUtil, IDRole) \ VALUES(%s, %s)" diff --git a/Views/browseView.py b/Views/browseView.py new file mode 100644 index 0000000..341f9da --- /dev/null +++ b/Views/browseView.py @@ -0,0 +1,86 @@ +# -*-coding:utf8 -* +"""Fenêtre de navigation""" + +from tkinter import * +from tkinter.ttk import * +import sys +import os +DOSSIER_COURRANT = os.path.dirname(os.path.abspath(__file__)) +DOSSIER_PARENT = os.path.dirname(DOSSIER_COURRANT) +sys.path.append(DOSSIER_PARENT) +from Controllers.BrowseController import BrowseController +from Users.Model import User + +class BrowseView: + + def __init__(self): + + self.ctrl = BrowseController() + self.search_input = "" + + #On lance la fenêtre par rapport à la fenêtre mère + BrowseView.root = Tk() + BrowseView.root.title("Naviguer") + + #Initialisation des variables + #self.mother = mother + + tabs = Notebook(BrowseView.root, name="projets") + + #Création des onglets + ##Projets + pr_tab = Frame(tabs) + + #recherche + search_frame = Frame(pr_tab) + self.search_input = Entry(search_frame) + self.search_input.pack(side=LEFT) + Button(search_frame, text="Rechercher", command=self.search).pack(side=RIGHT) + search_frame.pack() + + ###Treeview listant les projets + Label(pr_tab, text="Liste des projets").pack() + ####Headers + self.pr_list = Treeview(pr_tab, selectmode="browse", show="headings", columns=("nom", "chef", "client", "num")) + self.pr_list.heading("nom", text="Nom") + self.pr_list.heading("chef", text="Chef de projet") + self.pr_list.heading("client", text="client") + self.pr_list.heading("num", text="N° dossier") + ####Insertion du contenu + projects = self.ctrl.get_projects_list() + for proj in projects: + cdp = User(proj.responsable) + self.pr_list.insert("", 1, values=(proj.nom, (cdp.nom, cdp.prenom), + proj.client, proj.num_dossier)) + + self.pr_list.pack() + + Button(pr_tab, text="Voir le projet").pack() + Button(pr_tab, text="Démarrer une tâche rapide pour ce projet").pack() + + + ##Tâches + ta_tab = Frame(tabs) + + #Ajout des onglets au notebook et affichage + tabs.add(pr_tab, text="Projets") + tabs.add(ta_tab, text="Tâches") + + tabs.pack() + + def search(self): + #on récupère les résultats + projects = self.ctrl.get_projects_search_results(self.search_input.get()) + #on vide l'arbre + self.pr_list.delete(*self.pr_list.get_children()) + #on le rerempli avec les résultats + for proj in projects: + cdp = User(proj.responsable) + self.pr_list.insert("", 1, values=(proj.nom, (cdp.nom, cdp.prenom), + proj.client, proj.num_dossier)) + + +#test + +test = BrowseView() +test.root.mainloop()