· 4 years ago · Feb 24, 2021, 02:20 AM
1# -*- coding: utf-8 -*-
2"""
3Created on Sun Feb 21 02:55:14 2021
4
5@author: Alexa
6"""
7
8#Importation des modules nécessaires
9import sqlite3
10from tkinter import *
11import hashlib
12
13"""
14Warning : une erreur occure parfois à cause de lancements répétitifs. Si le script n'avance pas, forcer l'arrêt.
15 Le relancer ensuite. Il se peut que plusieurs fenêtres TKinter se développent. Les fermer elles aussi.
16 Relancer ensuite le programme
17"""
18
19#adminpass=1 est notre condition pour passer l'étape des identifiants
20adminpass=0
21
22#Création de la 1ère fenêtre
23root = Tk()
24root.title("Interface")
25root.geometry("350x100")
26
27#Mise en place de notre fichier et module sqlite3
28fichierBDD = "Projet.db"
29conn = sqlite3.connect(fichierBDD)
30cur = conn.cursor()
31
32#Vérification de l'existence des tables. Si elles existent, on les supprime, pour pouvoir appliquer la suite de notre programme
33cur.execute("DROP TABLE IF EXISTS student")
34cur.execute("DROP TABLE IF EXISTS archive")
35cur.execute("DROP TABLE IF EXISTS contact")
36cur.execute("DROP TABLE IF EXISTS postbac")
37cur.execute("DROP TABLE IF EXISTS actual")
38cur.execute("DROP TABLE IF EXISTS company")
39
40#Identifiants de connexion afin de passer l'étape des identifiants
41#Normalement dans un autre fichier
42login="proviseur_cassin"
43mdp="RenéCassin64"
44
45#Court programme de cryptage dans l'éventualité qu'on ait stocké les identifiants dans un autre fichier
46def cryptage(mdp):
47 mdp= ''.join(mdp)
48 mdp=mdp.encode()
49 m=hashlib.sha256()
50 m.update(bytes(mdp))
51 return m.hexdigest()
52
53#Cryptage systématique des identifiants réels
54login_crypté=cryptage(login)
55mdp_crypté=cryptage(mdp)
56
57#Interface de connexion
58mdpLabel=Label(root,text="Entrez votre mot de passe")
59mdpEntry=Entry(root)
60mdpLabel.grid(row=0,column=3,padx=20,pady=2)
61mdpEntry.grid(row=1,column=3,padx=20,pady=2)
62
63loginLabel=Label(root,text="Entrez votre login")
64loginEntry=Entry(root)
65loginLabel.grid(row=0,column=2,padx=20,pady=2)
66loginEntry.grid(row=1,column=2,padx=20,pady=2)
67
68boutonValider=Button(root,text="Confirmer",command=lambda:[recup(login,mdp)])
69boutonValider.grid(row=2,column=2,columnspan=2,padx=10,pady=2)
70
71#Permet de récupérer, crypter, analyser et comparer les identifiants entre eux
72#Un échec mène à l'arrêt du programme, sécurisant la BDD
73def recup(login,mdp):
74 global adminpass
75 login_entré=loginEntry.get()
76 mdp_entré=mdpEntry.get()
77 login_crypte_entré=cryptage(login_entré)
78 mdp_crypte_entré=cryptage(mdp_entré)
79 if login_crypté != login_crypte_entré:
80 print("Login ou mot de passe erroné")
81 root.destroy()
82 sys.exit()
83 elif mdp_crypté != mdp_crypte_entré:
84 print("Login ou mot de passe erroné")
85 root.destroy()
86 sys.exit()
87 else:
88 print("Identifiants corrects")
89 root.destroy()
90 #Notre condition pour poursuivre
91 adminpass=1
92 pass
93
94root.mainloop()
95
96#Création de toutes les tables de la BDD avec les types de données
97creationTableStudent = '''CREATE TABLE student (
98 id_student int NOT NULL,
99 name VARCHAR(35),
100 birth DATE,
101 PRIMARY KEY (id_student));'''
102
103creationTableArchive = '''CREATE TABLE archive (
104 id_archive int NOT NULL,
105 id_student int NOT NULL,
106 year YEAR,
107 specialties TEXT,
108 options VARCHAR(45),
109 PRIMARY KEY (id_archive),
110 FOREIGN KEY (id_student) REFERENCES student(id_student));'''
111
112creationTableContact = '''CREATE TABLE contact (
113 id_contact int NOT NULL,
114 id_student int NOT NULL,
115 mail VARCHAR(320),
116 tel BIGINT,
117 city VARCHAR(85),
118 postal MEDIUMINT UNSIGNED,
119 PRIMARY KEY (id_contact),
120 FOREIGN KEY (id_student) REFERENCES student(id_student));'''
121
122creationTablePostBac = '''CREATE TABLE postbac (
123 id_postbac int NOT NULL,
124 id_student int NOT NULL,
125 year YEAR,
126 studies TEXT,
127 job TEXT,
128 PRIMARY KEY (id_postbac),
129 FOREIGN KEY (id_student) REFERENCES student(id_student));'''
130
131creationTableActual = '''CREATE TABLE actual (
132 id_actual int NOT NULL,
133 id_student int NOT NULL,
134 city VARCHAR(85),
135 postal MEDIUMINT UNSIGNED,
136 job TEXT,
137 studies TEXT,
138 PRIMARY KEY (id_actual),
139 FOREIGN KEY (id_student) REFERENCES student(id_student));'''
140
141creationTableCompany = '''CREATE TABLE company (
142 id_company int NOT NULL,
143 id_student int NOT NULL,
144 tel BIGINT,
145 mail VARCHAR(320),
146 fax BIGINT,
147 postal MEDIUMINT UNSIGNED,
148 city VARCHAR(85),
149 adress TEXT,
150 siret BIGINT,
151 head_office TEXT,
152 field VARCHAR(100),
153 PRIMARY KEY (id_company),
154 FOREIGN KEY (id_student) REFERENCES student(id_student));'''
155
156#Données "test" proposées par l'entreprise pour avoir un exemple de la structure fonctionnelle de l'architecture
157#Ne s'exécute que si la réponse est positive
158def valeursdefaut():
159 entreesTableStudent = '''
160 (667,'Freeze Corleone','1992-06-06'),
161 (2012,'Julie Gayet','1972-06-03');
162 '''
163
164 entreesTableArchive = '''
165 (1,667,'2019','HGGSP,NSI,Mathématiques',Null),
166 (2,2012,'2019','Physique-Chimie,SVT,Mathématiques','Sport'),
167 (3,667,'2020','NSI,Mathématiques',Null),
168 (4,2012,'2020','Physique-Chimie,SVT','Maths expertes');
169 '''
170
171 entreesTableContact = '''
172 (1,667,'freeze.corleone@gmail.com','0652061122','Bayonne',64100),
173 (2,2012,'julie.gayet@gmail.com','0638432302','Paris',75000);
174 '''
175
176 entreesTablePostBac = '''
177 (1,667,'2021','Commerce Thalis',Null),
178 (2,2012,'2021','Rouge International',Null),
179 (3,667,'2021',Null,'Ostréiculteur');
180 '''
181
182 entreesTableActual = '''
183 (1,667,'Bayonne',64100,'Ostréiculteur',Null),
184 (2,2012,'Paris',75000,"Chef d'entreprise",Null);
185 '''
186
187 entreesTableCompany = '''
188 (1,667,0559568214,'ostréiculture.huîtres@gmail.com',Null,64100,'Bayonne','Rue Tour de Sault',36252187900034,Null,'Elevage'),
189 (2,2012,0555464214,'rouge.international@gmail.com',0144431101,75000,'Paris','47 rue Gay Lussac',286970447,'47 rue Gay Lussac','Audiovisuel');
190 '''
191
192 #On exécute la création et l'ajout des fausses données
193 cur.execute(creationTableStudent)
194 cur.execute(creationTableArchive)
195 cur.execute(creationTableContact)
196 cur.execute(creationTablePostBac)
197 cur.execute(creationTableActual)
198 cur.execute(creationTableCompany)
199 cur.execute("INSERT INTO student (id_student,name,birth) VALUES "+entreesTableStudent)
200 cur.execute("INSERT INTO archive (id_archive,id_student,year,specialties,options) VALUES "+entreesTableArchive)
201 cur.execute("INSERT INTO contact (id_contact,id_student,mail,tel,city,postal) VALUES "+entreesTableContact)
202 cur.execute("INSERT INTO postbac (id_postbac,id_student,year,studies,job) VALUES "+entreesTablePostBac)
203 cur.execute("INSERT INTO actual (id_actual,id_student,city,postal,job,studies) VALUES "+entreesTableActual)
204 cur.execute("INSERT INTO company (id_company,id_student,tel,mail,fax,postal,city,adress,siret,head_office,field) VALUES "+entreesTableCompany)
205 print("Valeurs insérées")
206 root.destroy()
207
208#Arrêt du script si l'étape des identifiants n'a pas été passée
209if adminpass==0:
210 sys.exit()
211#Proposition d'insersion des valeurs "test"
212if adminpass==1:
213 root = Tk()
214 label = Label(root, text="Voulez vous insérer les valeurs test ?")
215 label.pack()
216 bouton=Button(root, text="Oui", command=valeursdefaut).pack(side=LEFT, padx=50, pady=5)
217 bouton2=Button(root, text="Non", command=root.destroy).pack(side=RIGHT, padx=50, pady=5)
218
219root.mainloop()
220
221#Refus lors de la demande de requêtes SQL
222def end():
223 print("Requêtes SQL délaissées")
224 root.destroy()
225 sys.exit()
226
227#Propositions de requêtes acceptée, permet la transition entre les deux fenêtres
228def requetes():
229 root.destroy()
230 requetes2()
231
232#Affichage de l'interface pour effectuer les requêtes SQL
233def requetes2():
234 root = Tk()
235 sqlLabel=Label(root,text="Entrez votre requête SQL")
236 sqlEntry=Entry(root)
237 sqlLabel.grid(row=0,column=2,padx=20,pady=2)
238 sqlEntry.grid(row=1,column=2,padx=20,pady=2)
239 boutonValider=Button(root,text="Confirmer",command=lambda:[sauvegarde(sqlEntry.get())])
240 boutonValider.grid(row=2,column=2,columnspan=2,padx=10,pady=2)
241
242#Demande à l'utilisateur s'il veut effectuer une / des requête(s) SQL ?
243root = Tk()
244label = Label(root, text="Voulez vous réaliser une requête SQL ?")
245label.pack()
246bouton=Button(root, text="Oui", command=requetes).pack(side=LEFT, padx=50, pady=5)
247bouton2=Button(root, text="Non", command=end).pack(side=RIGHT, padx=50, pady=5)
248
249#Permet d'envoyer les informations du champ de saisie au module sqlite3
250def sauvegarde(sql):
251 print("Requête envoyée")
252 cur.execute(sql)
253
254#On ferme ici la fenêtre pour demander les requêtes SQL
255root.mainloop()
256
257#Fin de a mise en place du module sqlite3
258conn.commit()
259cur.close()
260conn.close()