Docfile commited on
Commit
95a83ad
1 Parent(s): 390148b

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +284 -0
app.py ADDED
@@ -0,0 +1,284 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from flask import Flask,make_response,render_template, request, redirect, url_for, session, jsonify, flash
2
+ from datetime import datetime, timedelta
3
+ import sqlite3
4
+ from urllib.parse import urlparse
5
+ import requests
6
+ import yt_dlp
7
+ import functools
8
+ import time
9
+ import tempfile
10
+ import re
11
+ import psycopg2
12
+ from markupsafe import Markup
13
+ from gradio_client import Client,handle_file
14
+ from functools import wraps
15
+ import os
16
+ import google.generativeai as genai
17
+ import textwrap
18
+ import PIL.Image
19
+ from werkzeug.utils import secure_filename
20
+ from pytube import YouTube
21
+ from psycopg2.extras import RealDictCursor
22
+ import redis
23
+
24
+ DATABASE_URL='postgres://default:LcAf9t8VFUgW@ep-steep-scene-a4pezmy7.us-east-1.aws.neon.tech:5432/verceldb?sslmode=require'
25
+
26
+ GOOGLE_API_KEY = ''
27
+
28
+ generation_config = {
29
+ "temperature": 1,
30
+ "top_p": 0.95,
31
+ "top_k": 64,
32
+ "max_output_tokens": 8192,
33
+ }
34
+
35
+ safety_settings = [
36
+ {
37
+ "category": "HARM_CATEGORY_HARASSMENT",
38
+ "threshold": "BLOCK_NONE"
39
+ },
40
+ {
41
+ "category": "HARM_CATEGORY_HATE_SPEECH",
42
+ "threshold": "BLOCK_NONE"
43
+ },
44
+ {
45
+ "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
46
+ "threshold": "BLOCK_NONE"
47
+ },
48
+ {
49
+ "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
50
+ "threshold": "BLOCK_NONE"
51
+ },
52
+ ]
53
+
54
+
55
+ genai.configure(api_key=GOOGLE_API_KEY)
56
+
57
+
58
+ MAX_CONTENT_LENGTH = 760 * 1024 * 1024 # 16MB max file size
59
+
60
+ def create_connection():
61
+ #le première c'est pour boma langue
62
+ #conn = psycopg2.connect("postgres://default:9fmSeFktMRV4@ep-cold-butterfly-a4hwib6l.us-east-1.aws.neon.tech:5432/verceldb?sslmode=require")
63
+ conn = psycopg2.connect("postgres://default:LcAf9t8VFUgW@ep-steep-scene-a4pezmy7.us-east-1.aws.neon.tech:5432/verceldb?sslmode=require")
64
+ return conn
65
+
66
+ app = Flask(__name__)
67
+ app.secret_key = "uyyhhy77uu"
68
+ app.permanent_session_lifetime = timedelta(days=200)
69
+
70
+ @app.route('/')
71
+ def philosophie():
72
+ return render_template("philosophie.html")
73
+
74
+
75
+
76
+ # Route pour récupérer la liste des cours
77
+ @app.route('/api/philosophy/courses', methods=['GET'])
78
+ def get_philosophy_courses():
79
+ try:
80
+ conn = psycopg2.connect(DATABASE_URL)
81
+ cur = conn.cursor(cursor_factory=RealDictCursor)
82
+ cur.execute("""
83
+ SELECT id, title, author, updated_at
84
+ FROM cours_philosophie
85
+ ORDER BY title
86
+ """)
87
+ courses = cur.fetchall()
88
+ cur.close()
89
+ conn.close()
90
+ return jsonify(courses)
91
+ except Exception as e:
92
+ print(f"Erreur lors de la récupération des cours : {e}")
93
+ return jsonify({"error": str(e)}), 500
94
+
95
+ # Route pour récupérer les détails d'un cours spécifique
96
+ @app.route('/api/philosophy/courses/<int:course_id>', methods=['GET'])
97
+ def get_philosophy_course(course_id):
98
+ try:
99
+ conn = psycopg2.connect(DATABASE_URL)
100
+ cur = conn.cursor(cursor_factory=RealDictCursor)
101
+ cur.execute("""
102
+ SELECT id, title, content, author, created_at, updated_at
103
+ FROM cours_philosophie
104
+ WHERE id = %s
105
+ """, (course_id,))
106
+ course = cur.fetchone()
107
+ cur.close()
108
+ conn.close()
109
+
110
+ if course:
111
+ return jsonify(course)
112
+ return jsonify({"error": "Cours non trouvé"}), 404
113
+ except Exception as e:
114
+ print(f"Erreur lors de la récupération du cours : {e}")
115
+ return jsonify({"error": str(e)}), 500
116
+
117
+ # Route Flask mise à jour
118
+ @app.route('/submit_philo', methods=['POST'])
119
+ def submit_philo():
120
+ data = request.json
121
+ phi_prompt = data.get('question', '').strip()
122
+ phi_type = data.get('type', '1') # Type 1 par défaut
123
+ course_id = data.get('courseId')
124
+
125
+ if not phi_prompt:
126
+ return jsonify({"error": "Veuillez saisir un sujet."}), 400
127
+
128
+ try:
129
+ # Récupération du contenu du cours si un cours est sélectionné
130
+ course_content = ""
131
+ course_info = ""
132
+ if course_id:
133
+ conn = psycopg2.connect(DATABASE_URL)
134
+ cur = conn.cursor(cursor_factory=RealDictCursor)
135
+ cur.execute("""
136
+ SELECT content, author, title
137
+ FROM cours_philosophie
138
+ WHERE id = %s
139
+ """, (course_id,))
140
+ result = cur.fetchone()
141
+ if result:
142
+ course_content = result['content']
143
+ course_info = f"\nBasé sur le cours '{result['title']}' de {result['author']}"
144
+ cur.close()
145
+ conn.close()
146
+
147
+ # Sélection de la méthodologie selon le type
148
+ if phi_type == '1':
149
+ methodologie = f"""
150
+ Traite ce sujet de philosophie "{phi_prompt}" selon le plan suivant:
151
+ # INTRODUCTION:
152
+ - Amorcer le sujet avec moins de deux phrases
153
+ - Poser le problème
154
+ - Formuler la problématique autour de deux questions essentielles:
155
+ - Question-thèse
156
+ - Question-antithèse
157
+
158
+ # DEVELOPPEMENT
159
+ ## Première Partie: Formuler la thèse initiale
160
+ Je veux trois arguments avec le plan suivant (Argument + Explication de l'argument + Illustration soit avec un exemple de la vie courante soit avec une citation philosophique). Je veux que ce soit le plus détaillé possible surtout sur la partie explication. Je veux un gros texte.
161
+
162
+ ## Deuxième Partie: Formuler l'antithèse
163
+ Je veux trois arguments avec le plan suivant (Argument + Explication de l'argument + Illustration soit avec un exemple de la vie courante soit avec une citation philosophique). Je veux que ce soit le plus détaillé possible surtout sur la partie explication. Je veux un gros texte.
164
+
165
+ # CONCLUSION
166
+ 1. Bilan de la réflexion:
167
+ - Résumer les grandes parties de la réflexion
168
+ 2. Prise de position
169
+
170
+ Je veux un travail bien détaillé et complet avec un français raffiné et soutenu.
171
+ """
172
+ else: # Type 2
173
+ methodologie = f"""
174
+ Traite ce sujet de philosophie "{phi_prompt}" selon le plan suivant:
175
+
176
+ # INTRODUCTION:
177
+ - Approche par constat
178
+ - Posez la citation
179
+ - Reformulation de la citation
180
+ - Nuancez la thèse (antithèse)
181
+ - De cette opposition naît le problème
182
+ - En quoi
183
+ - Idée de la citation
184
+
185
+ # DÉVELOPPEMENT:
186
+ ## Première partie (Thèse)
187
+ - Introduction partielle (thèse + arguments1 + arguments2)
188
+ - Argument 1:
189
+ * Explications
190
+ * Illustration (citation + reformulation)
191
+ - Argument 2:
192
+ * Explications
193
+ * Illustration (exemple + explication)
194
+ - Transition:
195
+ * Bilan (thèse + arguments1 + arguments2)
196
+ * Annonce de l'idée critique
197
+
198
+ ## Deuxième partie (Antithèse)
199
+ - Introduction partielle (antithèse + arguments3 + arguments4)
200
+ - Argument 3:
201
+ * Explications
202
+ * Illustration (citation + reformulation)
203
+ - Argument 4:
204
+ * Explications
205
+ * Illustration (exemple + reformulation)
206
+
207
+ # CONCLUSION:
208
+ - Bilan global de l'analyse (rappel du problème + thèse + antithèse)
209
+ - Prise de position (réponse à la question critique de l'introduction)
210
+
211
+ Je veux un travail bien détaillé et complet avec un français raffiné et soutenu.
212
+ """
213
+
214
+ # Ajout du contenu du cours à la prompt si disponible
215
+ if course_content:
216
+ methodologie += f"\nEn te basant sur le cours suivant:\n{course_content}"
217
+
218
+ prompt = methodologie
219
+
220
+ try:
221
+ model = genai.GenerativeModel(model_name="models/gemini-1.5-flash", safety_settings=safety_settings)
222
+ response = model.generate_content(prompt, request_options={"timeout": 900})
223
+
224
+ dissertation = response.text
225
+ return jsonify({"response": dissertation}), 200
226
+ except Exception as e:
227
+ print(f"Erreur dans la génération de contenu : {e}")
228
+ return jsonify({"error": str(e)}), 500
229
+
230
+ except Exception as e:
231
+ print(f"Erreur dans submit_philo : {e}")
232
+ return jsonify({"error": str(e)}), 500
233
+
234
+ @app.route('/admin/philosophy/courses', methods=['GET', 'POST', 'DELETE'])
235
+ def manage_philosophy_courses():
236
+ if request.method == 'GET':
237
+ try:
238
+ conn = psycopg2.connect(DATABASE_URL)
239
+ cur = conn.cursor(cursor_factory=RealDictCursor)
240
+ cur.execute("SELECT * FROM cours_philosophie")
241
+ courses = cur.fetchall()
242
+ cur.close()
243
+ conn.close()
244
+ return render_template('philosophy_courses.html', courses=courses)
245
+ except Exception as e:
246
+ flash(f'Erreur lors de la récupération des cours : {e}', 'danger')
247
+ return redirect(url_for('manage_philosophy_courses'))
248
+
249
+ elif request.method == 'POST':
250
+ if 'title' in request.form: # Vérification pour savoir si le formulaire soumis est celui d'ajout
251
+ try:
252
+ title = request.form.get('title')
253
+ content = request.form.get('content')
254
+ author = request.form.get('author')
255
+ conn = psycopg2.connect(DATABASE_URL)
256
+ cur = conn.cursor()
257
+ cur.execute("""
258
+ INSERT INTO cours_philosophie (title, content, author)
259
+ VALUES (%s, %s, %s)
260
+ """, (title, content, author))
261
+ conn.commit()
262
+ cur.close()
263
+ conn.close()
264
+ flash('Cours ajouté avec succès !', 'success')
265
+ return redirect(url_for('manage_philosophy_courses'))
266
+ except Exception as e:
267
+ flash(f'Erreur lors de l\'ajout du cours : {e}', 'danger')
268
+ return redirect(url_for('manage_philosophy_courses'))
269
+ else:
270
+ try:
271
+ course_id = request.form.get('id')
272
+ conn = psycopg2.connect(DATABASE_URL)
273
+ cur = conn.cursor()
274
+ cur.execute("DELETE FROM cours_philosophie WHERE id = %s", (course_id,))
275
+ conn.commit()
276
+ cur.close()
277
+ conn.close()
278
+ flash('Cours supprimé avec succès !', 'success')
279
+ return redirect(url_for('manage_philosophy_courses'))
280
+ except Exception as e:
281
+ flash(f'Erreur lors de la suppression du cours : {e}', 'danger')
282
+ return redirect(url_for('manage_philosophy_courses'))
283
+
284
+