Docfile commited on
Commit
0713b44
·
verified ·
1 Parent(s): b2b5274

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +62 -28
app.py CHANGED
@@ -1,22 +1,24 @@
1
  from flask import Flask, render_template, request, redirect, url_for, flash
2
  from flask_sqlalchemy import SQLAlchemy
3
- from sqlalchemy import func # Import func
4
  from bleach import clean
5
  from bs4 import BeautifulSoup
6
  import os
7
- cle = os.environ.get("TOKEN")
8
-
9
-
10
 
 
 
11
 
 
12
  app = Flask(__name__)
13
- app.config['SQLALCHEMY_DATABASE_URI'] = cle
14
  app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
15
  app.config['SECRET_KEY'] = 'une_cle_secrete_tres_longue' # Clé secrète pour les messages flash
16
 
17
  db = SQLAlchemy(app)
18
 
19
- # --- Modèles (adaptés de models.py, pour la cohérence) ---
20
 
21
  class Matiere(db.Model):
22
  """Modèle représentant une matière."""
@@ -35,7 +37,7 @@ class SousCategorie(db.Model):
35
  nom = db.Column(db.String(64), nullable=False)
36
  matiere_id = db.Column(db.Integer, db.ForeignKey('matiere.id'), nullable=False)
37
  textes = db.relationship('Texte', backref='sous_categorie', lazy='dynamic', cascade="all, delete-orphan")
38
- __table_args__ = (db.UniqueConstraint('nom', 'matiere_id', name='_nom_matiere_uc'), {})
39
 
40
  def __repr__(self):
41
  return f"<SousCategorie {self.nom}>"
@@ -51,11 +53,10 @@ class Texte(db.Model):
51
  def __repr__(self):
52
  return f"<Texte {self.titre}>"
53
 
54
-
55
  # --- Fonctions utilitaires ---
56
 
57
  def sanitize_html(html_content):
58
- """Assainit le contenu HTML (comme dans ton admin.py)."""
59
  allowed_tags = [
60
  'a', 'abbr', 'acronym', 'b', 'blockquote', 'br', 'code', 'div', 'em',
61
  'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'i', 'img', 'li', 'ol', 'p',
@@ -79,9 +80,9 @@ def sanitize_html(html_content):
79
  @app.route('/', methods=['GET', 'POST'])
80
  def gere():
81
  if request.method == 'POST':
82
- # Traitement des actions (ajout, modification, suppression)
83
  action = request.form.get('action')
84
 
 
85
  if action == 'add_matiere':
86
  nom_matiere = request.form.get('nom_matiere')
87
  if nom_matiere:
@@ -94,6 +95,7 @@ def gere():
94
  db.session.rollback()
95
  flash(f"Erreur lors de l'ajout de la matière : {e}", 'danger')
96
 
 
97
  elif action == 'add_sous_categorie':
98
  nom_sous_categorie = request.form.get('nom_sous_categorie')
99
  matiere_id = request.form.get('matiere_id')
@@ -106,28 +108,59 @@ def gere():
106
  except Exception as e:
107
  db.session.rollback()
108
  flash(f"Erreur : {e}", 'danger')
 
 
109
  elif action == 'add_texte':
110
  titre_texte = request.form.get('titre_texte')
111
- contenu_texte = request.form.get('contenu_texte')
112
  sous_categorie_id = request.form.get('sous_categorie_id')
 
 
 
113
 
114
- if titre_texte and contenu_texte and sous_categorie_id:
115
- # Assainir le contenu HTML
116
- contenu_texte_sanitized = sanitize_html(contenu_texte)
117
- nouveau_texte = Texte(titre=titre_texte, contenu=contenu_texte_sanitized, sous_categorie_id=sous_categorie_id)
118
- db.session.add(nouveau_texte)
119
  try:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
120
  db.session.commit()
121
  flash(f"Texte '{titre_texte}' ajouté avec succès.", 'success')
 
122
  except Exception as e:
123
  db.session.rollback()
124
- flash(f"Erreur lors de l'ajout : {e}", 'danger')
125
-
 
126
 
 
127
  elif action.startswith('edit_matiere_'):
128
  matiere_id = int(action.split('_')[-1])
129
  matiere = Matiere.query.get_or_404(matiere_id)
130
- matiere.nom = request.form.get(f'edit_nom_matiere_{matiere_id}')
131
  try:
132
  db.session.commit()
133
  flash(f"Matière '{matiere.nom}' modifiée avec succès.", 'success')
@@ -135,6 +168,7 @@ def gere():
135
  db.session.rollback()
136
  flash(f"Erreur lors de la modification : {e}", 'danger')
137
 
 
138
  elif action.startswith('edit_sous_categorie_'):
139
  sous_categorie_id = int(action.split('_')[-1])
140
  sous_categorie = SousCategorie.query.get_or_404(sous_categorie_id)
@@ -147,7 +181,7 @@ def gere():
147
  db.session.rollback()
148
  flash(f"Erreur : {e}", 'danger')
149
 
150
-
151
  elif action.startswith('edit_texte_'):
152
  texte_id = int(action.split('_')[-1])
153
  texte = Texte.query.get_or_404(texte_id)
@@ -156,7 +190,6 @@ def gere():
156
  if contenu:
157
  texte.contenu = sanitize_html(contenu)
158
  texte.sous_categorie_id = request.form.get(f'edit_sous_categorie_id_{texte_id}')
159
-
160
  try:
161
  db.session.commit()
162
  flash(f"Texte '{texte.titre}' modifié avec succès.", 'success')
@@ -164,7 +197,7 @@ def gere():
164
  db.session.rollback()
165
  flash(f"Erreur : {e}", 'danger')
166
 
167
-
168
  elif action.startswith('delete_matiere_'):
169
  matiere_id = int(action.split('_')[-1])
170
  matiere = Matiere.query.get_or_404(matiere_id)
@@ -176,6 +209,7 @@ def gere():
176
  db.session.rollback()
177
  flash(f"Erreur : {e}", 'danger')
178
 
 
179
  elif action.startswith('delete_sous_categorie_'):
180
  sous_categorie_id = int(action.split('_')[-1])
181
  sous_categorie = SousCategorie.query.get_or_404(sous_categorie_id)
@@ -184,10 +218,10 @@ def gere():
184
  db.session.commit()
185
  flash(f"Sous-catégorie '{sous_categorie.nom}' supprimée.", 'success')
186
  except Exception as e:
187
- db.session.rollback()
188
- flash(f"Erreur : {e}", 'danger')
189
-
190
 
 
191
  elif action.startswith('delete_texte_'):
192
  texte_id = int(action.split('_')[-1])
193
  texte = Texte.query.get_or_404(texte_id)
@@ -197,11 +231,11 @@ def gere():
197
  flash(f"Texte '{texte.titre}' supprimé avec succès.", 'success')
198
  except Exception as e:
199
  db.session.rollback()
200
- flash(f"Erreur : {e}",'danger')
201
 
202
  return redirect(url_for('gere'))
203
 
204
- # Récupération de toutes les données pour l'affichage
205
  matieres = Matiere.query.order_by(func.lower(Matiere.nom)).all()
206
  sous_categories = SousCategorie.query.order_by(func.lower(SousCategorie.nom)).all()
207
  textes = Texte.query.order_by(Texte.titre).all()
@@ -210,4 +244,4 @@ def gere():
210
  if __name__ == '__main__':
211
  with app.app_context():
212
  db.create_all() # Crée les tables si elles n'existent pas
213
- app.run(debug=True) # Port différent pour éviter les conflits
 
1
  from flask import Flask, render_template, request, redirect, url_for, flash
2
  from flask_sqlalchemy import SQLAlchemy
3
+ from sqlalchemy import func
4
  from bleach import clean
5
  from bs4 import BeautifulSoup
6
  import os
7
+ from google import genai
8
+ from google.genai import types
 
9
 
10
+ # Clé API Gemini
11
+ api_key = "AIzaSyBzv8YdOqVfNlskpAJNvQTPS_AZ-P3t19k"
12
 
13
+ # Configuration de Flask
14
  app = Flask(__name__)
15
+ app.config['SQLALCHEMY_DATABASE_URI'] = os.environ.get("TOKEN") # Assurez-vous que cette variable est définie
16
  app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
17
  app.config['SECRET_KEY'] = 'une_cle_secrete_tres_longue' # Clé secrète pour les messages flash
18
 
19
  db = SQLAlchemy(app)
20
 
21
+ # --- Modèles ---
22
 
23
  class Matiere(db.Model):
24
  """Modèle représentant une matière."""
 
37
  nom = db.Column(db.String(64), nullable=False)
38
  matiere_id = db.Column(db.Integer, db.ForeignKey('matiere.id'), nullable=False)
39
  textes = db.relationship('Texte', backref='sous_categorie', lazy='dynamic', cascade="all, delete-orphan")
40
+ __table_args__ = (db.UniqueConstraint('nom', 'matiere_id', name='_nom_matiere_uc'),)
41
 
42
  def __repr__(self):
43
  return f"<SousCategorie {self.nom}>"
 
53
  def __repr__(self):
54
  return f"<Texte {self.titre}>"
55
 
 
56
  # --- Fonctions utilitaires ---
57
 
58
  def sanitize_html(html_content):
59
+ """Assainit le contenu HTML."""
60
  allowed_tags = [
61
  'a', 'abbr', 'acronym', 'b', 'blockquote', 'br', 'code', 'div', 'em',
62
  'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'hr', 'i', 'img', 'li', 'ol', 'p',
 
80
  @app.route('/', methods=['GET', 'POST'])
81
  def gere():
82
  if request.method == 'POST':
 
83
  action = request.form.get('action')
84
 
85
+ # Ajouter une matière
86
  if action == 'add_matiere':
87
  nom_matiere = request.form.get('nom_matiere')
88
  if nom_matiere:
 
95
  db.session.rollback()
96
  flash(f"Erreur lors de l'ajout de la matière : {e}", 'danger')
97
 
98
+ # Ajouter une sous-catégorie
99
  elif action == 'add_sous_categorie':
100
  nom_sous_categorie = request.form.get('nom_sous_categorie')
101
  matiere_id = request.form.get('matiere_id')
 
108
  except Exception as e:
109
  db.session.rollback()
110
  flash(f"Erreur : {e}", 'danger')
111
+
112
+ # Ajouter un texte avec génération IA
113
  elif action == 'add_texte':
114
  titre_texte = request.form.get('titre_texte')
 
115
  sous_categorie_id = request.form.get('sous_categorie_id')
116
+ youtube_url = request.form.get('youtube_url')
117
+ prompt = request.form.get('prompt')
118
+ model = request.form.get('model')
119
 
120
+ if titre_texte and sous_categorie_id and youtube_url and prompt and model:
 
 
 
 
121
  try:
122
+ # Configurer le client Gemini
123
+ client = genai.Client(api_key=api_key)
124
+
125
+ # Préparer la requête pour l'IA
126
+ contents = types.Content(
127
+ parts=[
128
+ types.Part(text=prompt),
129
+ types.Part(file_data=types.FileData(file_uri=youtube_url))
130
+ ]
131
+ )
132
+
133
+ # Générer le contenu avec le modèle sélectionné
134
+ response = client.models.generate_content(
135
+ model=model,
136
+ contents=contents
137
+ )
138
+
139
+ # Récupérer et assainir le contenu généré
140
+ contenu_texte = response.text
141
+ contenu_texte_sanitized = sanitize_html(contenu_texte)
142
+
143
+ # Ajouter le texte à la base de données
144
+ nouveau_texte = Texte(
145
+ titre=titre_texte,
146
+ contenu=contenu_texte_sanitized,
147
+ sous_categorie_id=sous_categorie_id
148
+ )
149
+ db.session.add(nouvelle_texte)
150
  db.session.commit()
151
  flash(f"Texte '{titre_texte}' ajouté avec succès.", 'success')
152
+
153
  except Exception as e:
154
  db.session.rollback()
155
+ flash(f"Erreur lors de la génération ou de l'ajout du texte : {str(e)}", 'danger')
156
+ else:
157
+ flash("Tous les champs sont requis pour ajouter un texte.", 'warning')
158
 
159
+ # Modifier une matière
160
  elif action.startswith('edit_matiere_'):
161
  matiere_id = int(action.split('_')[-1])
162
  matiere = Matiere.query.get_or_404(matiere_id)
163
+ matiere.nom = request.form.get(f'edit_nom_matiere_{matiere 艾迪}')
164
  try:
165
  db.session.commit()
166
  flash(f"Matière '{matiere.nom}' modifiée avec succès.", 'success')
 
168
  db.session.rollback()
169
  flash(f"Erreur lors de la modification : {e}", 'danger')
170
 
171
+ # Modifier une sous-catégorie
172
  elif action.startswith('edit_sous_categorie_'):
173
  sous_categorie_id = int(action.split('_')[-1])
174
  sous_categorie = SousCategorie.query.get_or_404(sous_categorie_id)
 
181
  db.session.rollback()
182
  flash(f"Erreur : {e}", 'danger')
183
 
184
+ # Modifier un texte
185
  elif action.startswith('edit_texte_'):
186
  texte_id = int(action.split('_')[-1])
187
  texte = Texte.query.get_or_404(texte_id)
 
190
  if contenu:
191
  texte.contenu = sanitize_html(contenu)
192
  texte.sous_categorie_id = request.form.get(f'edit_sous_categorie_id_{texte_id}')
 
193
  try:
194
  db.session.commit()
195
  flash(f"Texte '{texte.titre}' modifié avec succès.", 'success')
 
197
  db.session.rollback()
198
  flash(f"Erreur : {e}", 'danger')
199
 
200
+ # Supprimer une matière
201
  elif action.startswith('delete_matiere_'):
202
  matiere_id = int(action.split('_')[-1])
203
  matiere = Matiere.query.get_or_404(matiere_id)
 
209
  db.session.rollback()
210
  flash(f"Erreur : {e}", 'danger')
211
 
212
+ # Supprimer une sous-catégorie
213
  elif action.startswith('delete_sous_categorie_'):
214
  sous_categorie_id = int(action.split('_')[-1])
215
  sous_categorie = SousCategorie.query.get_or_404(sous_categorie_id)
 
218
  db.session.commit()
219
  flash(f"Sous-catégorie '{sous_categorie.nom}' supprimée.", 'success')
220
  except Exception as e:
221
+ db.session.rollback()
222
+ flash(f"Erreur : {e}", 'danger')
 
223
 
224
+ # Supprimer un texte
225
  elif action.startswith('delete_texte_'):
226
  texte_id = int(action.split('_')[-1])
227
  texte = Texte.query.get_or_404(texte_id)
 
231
  flash(f"Texte '{texte.titre}' supprimé avec succès.", 'success')
232
  except Exception as e:
233
  db.session.rollback()
234
+ flash(f"Erreur : {e}", 'danger')
235
 
236
  return redirect(url_for('gere'))
237
 
238
+ # Récupération des données pour l'affichage
239
  matieres = Matiere.query.order_by(func.lower(Matiere.nom)).all()
240
  sous_categories = SousCategorie.query.order_by(func.lower(SousCategorie.nom)).all()
241
  textes = Texte.query.order_by(Texte.titre).all()
 
244
  if __name__ == '__main__':
245
  with app.app_context():
246
  db.create_all() # Crée les tables si elles n'existent pas
247
+ app.run(debug=True)