Ajout fenetre de navigation avec liste des projets + fonction recherche
This commit is contained in:
parent
1784a5b461
commit
6956cbb1ac
78
Controllers/BrowseController.py
Normal file
78
Controllers/BrowseController.py
Normal file
|
@ -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)
|
23
Controllers/Functions.py
Normal file
23
Controllers/Functions.py
Normal file
|
@ -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 ########
|
|
@ -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
|
||||
|
|
|
@ -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)"
|
||||
|
|
86
Views/browseView.py
Normal file
86
Views/browseView.py
Normal file
|
@ -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()
|
Loading…
Reference in a new issue