from flask import Flask,make_response,render_template, request, redirect, url_for, session, jsonify, flash from datetime import datetime, timedelta import sqlite3 from urllib.parse import urlparse import requests import yt_dlp import functools import time import tempfile import logging import re import psycopg2 from markupsafe import Markup from gradio_client import Client,handle_file from functools import wraps import os import google.generativeai as genai import textwrap import PIL.Image from werkzeug.utils import secure_filename from pytube import YouTube from psycopg2.extras import RealDictCursor import redis logging.basicConfig(level=logging.INFO) DATABASE_URL= os.environ.get("DATABASE") GOOGLE_API_KEY = os.environ.get("TOKEN") generation_config = { "temperature": 1, "max_output_tokens": 8192, } safety_settings = [ { "category": "HARM_CATEGORY_HARASSMENT", "threshold": "BLOCK_NONE" }, { "category": "HARM_CATEGORY_HATE_SPEECH", "threshold": "BLOCK_NONE" }, { "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT", "threshold": "BLOCK_NONE" }, { "category": "HARM_CATEGORY_DANGEROUS_CONTENT", "threshold": "BLOCK_NONE" }, ] genai.configure(api_key=GOOGLE_API_KEY) MAX_CONTENT_LENGTH = 760 * 1024 * 1024 # 16MB max file size def create_connection(): #le première c'est pour boma langue conn = psycopg2.connect(DATABASE_URL) return conn app = Flask(__name__) app.secret_key = "uyyhhy77uu" app.permanent_session_lifetime = timedelta(days=200) @app.route('/') def philosophie(): return render_template("philosophie.html") # Route pour récupérer la liste des cours @app.route('/api/philosophy/courses', methods=['GET']) def get_philosophy_courses(): try: conn = psycopg2.connect(DATABASE_URL) cur = conn.cursor(cursor_factory=RealDictCursor) cur.execute(""" SELECT id, title, author, updated_at FROM cours_philosophie ORDER BY title """) courses = cur.fetchall() cur.close() conn.close() return jsonify(courses) except Exception as e: print(f"Erreur lors de la récupération des cours : {e}") return jsonify({"error": str(e)}), 500 # Route pour récupérer les détails d'un cours spécifique @app.route('/api/philosophy/courses/', methods=['GET']) def get_philosophy_course(course_id): try: conn = psycopg2.connect(DATABASE_URL) cur = conn.cursor(cursor_factory=RealDictCursor) cur.execute(""" SELECT id, title, content, author, created_at, updated_at FROM cours_philosophie WHERE id = %s """, (course_id,)) course = cur.fetchone() cur.close() conn.close() if course: return jsonify(course) return jsonify({"error": "Cours non trouvé"}), 404 except Exception as e: print(f"Erreur lors de la récupération du cours : {e}") return jsonify({"error": str(e)}), 500 # Route Flask mise à jour @app.route('/submit_philo', methods=['POST']) def submit_philo(): data = request.json phi_prompt = data.get('question', '').strip() phi_type = data.get('type', '1') # Type 1 par défaut course_id = data.get('courseId') logging.info(f"Le sujet est: {phi_prompt}") logging.info(f"Le type est: {phi_type}") if not phi_prompt: return jsonify({"error": "Veuillez saisir un sujet."}), 400 try: # Récupération du contenu du cours si un cours est sélectionné course_content = "" course_info = "" if course_id: conn = psycopg2.connect(DATABASE_URL) cur = conn.cursor(cursor_factory=RealDictCursor) cur.execute(""" SELECT content, author, title FROM cours_philosophie WHERE id = %s """, (course_id,)) result = cur.fetchone() if result: course_content = result['content'] course_info = f"\nBasé sur le cours '{result['title']}' de {result['author']}" cur.close() conn.close() # Sélection de la méthodologie selon le type if phi_type == '1': methodologie = f""" Traite ce sujet de philosophie "{phi_prompt}" selon le plan suivant. commence directement ta réponse par introduction : # INTRODUCTION: ( l'introduction se fait en un paragraphe ) - Approche par constat - - Amorcer le sujet avec moins de deux phrases - Poser le problème - Formuler la problématique autour de deux questions essentielles: - Question-thèse - Question-antithèse # DÉVELOPPEMENT: ## Première partie (Thèse) - Introduction partielle (thèse + arguments1 + arguments2) - Argument 1: * Explications * Illustration (citation + reformulation) - Argument 2: * Explications * Illustration (exemple + explication) - Transition: * Bilan (thèse + arguments1 + arguments2) * Annonce de l'idée critique ## Deuxième partie (Antithèse) - Introduction partielle (antithèse + arguments3 + arguments4) - Argument 3: * Explications * Illustration (citation + reformulation) - Argument 4: * Explications * Illustration (exemple + reformulation) # CONCLUSION: - Bilan global de l'analyse (rappel du problème + thèse + antithèse) - Prise de position (réponse à la question critique de l'introduction) Je veux un travail bien détaillé et complet avec un français raffiné et soutenu. """ else: # Type 2 methodologie = f""" Traite ce sujet de philosophie "{phi_prompt}" selon le plan suivant.commence directement ta réponse par introduction : : # INTRODUCTION: ( l'introduction se fait en un paragraphe) - Approche par constat - Posez la citation - Reformulation de la citation - Nuancez la thèse (antithèse) - De cette opposition naît le problème - En quoi - Idée de la citation # DÉVELOPPEMENT: ## Première partie (Thèse) - Introduction partielle (thèse + arguments1 + arguments2) - Argument 1: * Explications * Illustration (citation + reformulation) - Argument 2: * Explications * Illustration (exemple + explication) - Transition: * Bilan (thèse + arguments1 + arguments2) * Annonce de l'idée critique ## Deuxième partie (Antithèse) - Introduction partielle (antithèse + arguments3 + arguments4) - Argument 3: * Explications * Illustration (citation + reformulation) - Argument 4: * Explications * Illustration (exemple + reformulation) # CONCLUSION: - Bilan global de l'analyse (rappel du problème + thèse + antithèse) - Prise de position (réponse à la question critique de l'introduction) Je veux un travail bien détaillé et complet avec un français raffiné et soutenu. """ # Ajout du contenu du cours à la prompt si disponible if course_content: methodologie += f"\nEn te basant sur le cours suivant:\n{course_content}" prompt = methodologie try: model = genai.GenerativeModel(model_name="models/gemini-exp-1206", safety_settings=safety_settings) response = model.generate_content(prompt, request_options={"timeout": 1100}) dissertation = response.text return jsonify({"response": dissertation}), 200 except Exception as e: print(f"Erreur dans la génération de contenu : {e}") return jsonify({"error": str(e)}), 500 except Exception as e: print(f"Erreur dans submit_philo : {e}") return jsonify({"error": str(e)}), 500 @app.route('/admin/philosophy/courses', methods=['GET', 'POST', 'DELETE']) def manage_philosophy_courses(): if request.method == 'GET': try: conn = psycopg2.connect(DATABASE_URL) cur = conn.cursor(cursor_factory=RealDictCursor) cur.execute("SELECT * FROM cours_philosophie") courses = cur.fetchall() cur.close() conn.close() return render_template('philosophy_courses.html', courses=courses) except Exception as e: flash(f'Erreur lors de la récupération des cours : {e}', 'danger') return redirect(url_for('manage_philosophy_courses')) elif request.method == 'POST': if 'title' in request.form: # Vérification pour savoir si le formulaire soumis est celui d'ajout try: title = request.form.get('title') content = request.form.get('content') author = request.form.get('author') conn = psycopg2.connect(DATABASE_URL) cur = conn.cursor() cur.execute(""" INSERT INTO cours_philosophie (title, content, author) VALUES (%s, %s, %s) """, (title, content, author)) conn.commit() cur.close() conn.close() flash('Cours ajouté avec succès !', 'success') return redirect(url_for('manage_philosophy_courses')) except Exception as e: flash(f'Erreur lors de l\'ajout du cours : {e}', 'danger') return redirect(url_for('manage_philosophy_courses')) else: try: course_id = request.form.get('id') conn = psycopg2.connect(DATABASE_URL) cur = conn.cursor() cur.execute("DELETE FROM cours_philosophie WHERE id = %s", (course_id,)) conn.commit() cur.close() conn.close() flash('Cours supprimé avec succès !', 'success') return redirect(url_for('manage_philosophy_courses')) except Exception as e: flash(f'Erreur lors de la suppression du cours : {e}', 'danger') return redirect(url_for('manage_philosophy_courses'))