Repository navigation
Expand file tree
/
Copy pathapp.py
More file actions
304 lines (240 loc) · 9.1 KB
/
Copy pathapp.py
File metadata and controls
304 lines (240 loc) · 9.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
from flask import Flask, render_template, redirect, url_for, request, flash
import sqlite3
import random
app = Flask(__name__)
app.secret_key = "supersecretkey"
def get_question(numero_question):from flask import Flask, render_template, redirect, url_for, request, flash
import sqlite3
import random
app = Flask(__name__)
app.secret_key = "supersecretkey"
score = 0
max_score = 0
streak = 0
def get_morale(numero_question):
"""Récupère la morale d'une question donnée.
Précondition :
La question avec cet ID doit exister dans la base et être en langue
française.
Paramètres :
numero_question : int — Identifiant de la question
Renvoi :
str — Morale de la question
>>> isinstance(get_morale(1), str)
True
"""
conn = sqlite3.connect("mabase.db")
cursor = conn.cursor()
cursor.execute("SELECT morale FROM QUIZZ1 WHERE id=? AND langue='fr'",
(numero_question,))
morale = cursor.fetchone()
conn.close()
return morale[0]
def get_question(numero_question):
"""Récupère le texte d'une question à partir de son identifiant.
Précondition :
L'identifiant doit correspondre à une question existante.
Paramètres :
numero_question : int — Identifiant de la question
Renvoi :
str|None — Texte de la question ou None si elle n'existe pas
>>> q = get_question(1)
>>> isinstance(q, str) or q is None
True
"""
conn = sqlite3.connect("mabase.db")
cursor = conn.cursor()
cursor.execute("SELECT question FROM QUIZZ1 WHERE id=? AND langue='fr'",
(numero_question,))
question = cursor.fetchone()
conn.close()
return question[0] if question else None
def get_reponses(numero_question):
"""Récupère les 4 réponses possibles à une question.
Précondition :
L'identifiant doit correspondre à une ligne valide avec 4 réponses.
Paramètres :
numero_question : int — Identifiant de la question
Renvoi :
list[str] — Liste des réponses (la première est correcte)
>>> r = get_reponses(1)
>>> isinstance(r, list) and len(r) == 4
True
"""
conn = sqlite3.connect("mabase.db")
cursor = conn.cursor()
cursor.execute("SELECT rep1, rep2, rep3, rep4 FROM QUIZZ1 WHERE id=?" \
" AND langue='fr'", (numero_question,))
reponses = cursor.fetchone()
conn.close()
return list(reponses) if reponses else []
def get_nb():
"""Retourne le nombre total de questions dans la base (en français).
Précondition :
La table QUIZZ1 doit contenir des questions en langue 'fr'.
Paramètres :
Aucun
Renvoi :
int — Nombre total de questions
>>> isinstance(get_nb(), int)
True
"""
conn = sqlite3.connect("mabase.db")
cursor = conn.cursor()
cursor.execute("SELECT COUNT(question) FROM QUIZZ1 WHERE langue='fr'")
nb = cursor.fetchone()
conn.close()
return nb[0] if nb else 0
def winning_streak(winning):
"""Met à jour la série de bonnes réponses consécutives.
Précondition :
Aucune
Paramètres :
winning : bool — True si la réponse était correcte, False sinon
Renvoi :
Aucun (modifie la variable globale streak)
>>> global streak
>>> streak = 0
>>> winning_streak(True)
>>> winning_streak(True)
>>> streak
2
>>> winning_streak(False)
>>> streak
0
"""
global streak
if winning:
streak += 1
else:
streak = 0
@app.route("/")
def index():
"""Redirige vers la première question du quiz."""
return redirect(url_for('question_page', numero=1))
@app.route("/fin_quiz/")
def fin_quiz():
"""Affiche la page de fin de quiz avec le score final."""
global score
score_actu = score
score = 0
nb_questions = get_nb()
return render_template("fin_quiz.html", score=score_actu,
nb_questions=nb_questions)
@app.route("/derniere_question/")
def derniere_question():
"""Affiche la dernière morale du quiz."""
numero = get_nb()
morale = get_morale(numero)
return render_template("reponse.html", morale=morale, numero=numero)
@app.route("/question/<int:numero>/")
def question_page(numero):
"""Affiche une question et ses réponses mélangées.
Paramètres :
numero : int — numéro de la question
Renvoi :
Page HTML avec la question et les réponses
"""
global streak
question = get_question(numero)
reponses = get_reponses(numero)
if not question or not reponses:
return redirect(url_for('fin_quiz'))
bonne_reponse = reponses[0]
reponses_melangees = reponses.copy()
random.shuffle(reponses_melangees)
return render_template("index.html", question=question,
reponses=reponses_melangees, numero=numero,
bonne_reponse=bonne_reponse, streak=streak)
@app.route("/verifier/<int:numero>/", methods=["POST"])
def verifier_reponse(numero):
"""Vérifie si la réponse envoyée est correcte et redirige vers la
page suivante.
Paramètres :
numero : int — numéro de la question actuelle
Renvoi :
Redirection vers la page de réponse ou de fin
"""
global score, streak
question = get_question(numero)
reponses = get_reponses(numero)
morale = get_morale(numero)
if question is None or reponses is None:
flash("Fin du quiz !", "info")
return redirect(url_for('fin_quiz'))
bonne_reponse = reponses[0]
reponse_utilisateur = request.form.get('choix')
if reponse_utilisateur == bonne_reponse:
flash(f"Bravo ! {bonne_reponse} était la bonne réponse.", "success")
score += 1
winning_streak(True)
else:
flash(f"Dommage ! La bonne réponse était {bonne_reponse}.", "error")
winning_streak(False)
if get_question(numero + 1) is None:
return redirect(url_for('derniere_question', question=question,
reponse=bonne_reponse, morale=morale,
score=score))
return redirect(url_for('afficher_reponse', numero=numero,
question=question, reponse=bonne_reponse,
morale=morale, score=score))
@app.route("/reponse/<int:numero>/")
def afficher_reponse(numero):
"""Affiche la morale et la réponse correcte après une question.
Paramètres :
numero : int — numéro de la question
Renvoi :
Page HTML de réponse
"""
return render_template("reponse.html", numero=numero,
question=request.args.get('question'),
reponse=request.args.get('reponse'),
morale=request.args.get('morale'),
score=score,
streak=streak)
if __name__ == "__main__":
app.run(debug=True)
conn = sqlite3.connect("mabase.db")
cursor = conn.cursor()
cursor.execute("SELECT question FROM QUIZZ1 WHERE id=? AND langue='fr'", (numero_question,))
question = cursor.fetchone()
conn.close()
return question[0] if question else None
def get_reponses(numero_question):
conn = sqlite3.connect("mabase.db")
cursor = conn.cursor()
cursor.execute("SELECT rep1, rep2, rep3, rep4 FROM QUIZZ1 WHERE id=? AND langue='fr'", (numero_question,))
reponses = cursor.fetchone()
conn.close()
return list(reponses) if reponses else None
@app.route("/")
def index():
return redirect(url_for('question_page', numero=1))
@app.route("/question/<int:numero>/")
def question_page(numero):
question = get_question(numero)
reponses = get_reponses(numero)
bonne_reponse = reponses[0]
reponses_melangees = reponses.copy()
random.shuffle(reponses_melangees)
return render_template("index.html", question=question, reponses=reponses_melangees, numero=numero, bonne_reponse=bonne_reponse)
@app.route("/verifier/<int:numero>/", methods=["POST"])
def verifier_reponse(numero):
question = get_question(numero)
reponses = get_reponses(numero)
if question is None or reponses is None:
flash("Fin du quiz !", "info")
return redirect(url_for('fin_quiz'))
bonne_reponse = reponses[0]
reponse_utilisateur = request.form.get('choix')
if reponse_utilisateur == bonne_reponse:
flash(f"Bravo ! {bonne_reponse} était la bonne réponse.", "success")
else:
flash(f"Dommage ! La bonne réponse était {bonne_reponse}.", "error")
# Redirection vers la page de réponse
return redirect(url_for('afficher_reponse', numero=numero, question=question, reponse=bonne_reponse))
@app.route("/reponse/<int:numero>/")
def afficher_reponse(numero):
return render_template("reponse.html", numero=numero, question=request.args.get('question'), reponse=request.args.get('reponse'))
if __name__ == "__main__":
app.run(debug=True)