from openai import OpenAI from PyPDF2 import PdfReader from django.conf import settings liste_eleves = {} client = OpenAI(api_key=settings.OPENAI_API_KEY) def split_by_eleve(text): """ Découpe le texte en une liste de chaînes, chaque élément commençant par 'ELEVE'. """ import re # On split sur chaque occurrence de 'ELEVE' suivie d'un ou plusieurs chiffres parts = re.split(r'(ELEVE\d+)', text) result = [] for i in range(1, len(parts), 2): # parts[i] est 'ELEVEid', parts[i+1] est le texte associé bloc = parts[i] + parts[i+1] if i+1 < len(parts) else parts[i] result.append(bloc.strip()) return result def anonymiserPdf(file, eleves): eleve_id = 1 pages_content = "" for page in file.pages: lines = page.extract_text().split('\n') curent_page = [] write = False eleve_found = False for i, line in enumerate(lines): # Attendre la ligne qui se termine par " Trimestre" if not write: if line.strip().endswith("Trimestre"): write = True continue # Enregistrer la ligne suivante (nom de l'élève) if write and not eleve_found: eleve_nom = line.strip() if eleve_nom not in eleves: eleves[eleve_nom] = f"ELEVE{eleve_id}" eleve_id += 1 curent_page.append(eleves[eleve_nom] + "\n") eleve_found = True continue # Attendre la ligne qui commence par "Appréciations" if eleve_found: if line.strip().startswith("Appréciations"): # Commencer à écrire les lignes suivantes for l in lines[i+1:]: if l.startswith("M.") or l.startswith("Mme"): continue curent_page.append(l + "\n") break # Fin du traitement de cette page pages_content += "".join(curent_page) return pages_content def get_eleve_name(text, eleves): """ Extrait le nom de l'élève à partir du texte. """ for line in text.split('\n'): line = line.strip() if line in eleves: return eleves[line] return None def replace_eleve_ids_with_names(text, eleves): # Inverse the eleves dict to map ELEVEid -> nom prénom id_to_name = {v: k for k, v in eleves.items()} # Trier les IDs par longueur décroissante pour éviter les remplacements partiels for eleve_id in sorted(id_to_name.keys(), key=len, reverse=True): nom = id_to_name[eleve_id] if eleve_id in text: text = text.replace(eleve_id, nom) return text def generatationAppreciations(appreciations_path, modele_path=None): if (modele_path): modele = PdfReader(modele_path) modele_anonyme = anonymiserPdf(modele, liste_eleves) appreciations = PdfReader(appreciations_path) appreciation_anonyme = anonymiserPdf(appreciations, liste_eleves) tableau_appreciations = split_by_eleve(appreciation_anonyme) responses = [] #debug tableau_appreciations = tableau_appreciations[:3] for eleve in tableau_appreciations: if modele_path: # Si un modèle est fourni, on utilise le modèle pour chaque élève data = [ { "role": "developer", "content": "Tu dois générer des appréciations générales de bulletins avec le style de l'exemple suivant (500 caractères max)" },{ "role": "assistant", "content": modele_anonyme }, { "role": "user", "content": eleve }] else: data = [ { "role": "developer", "content": "Tu dois générer des appréciations générales de bulletins (500 caractères max)" }, { "role": "user", "content": eleve }] completion = client.chat.completions.create( model="gpt-4.1-mini", messages=data, temperature=1, top_p=1) resultat = "" + get_eleve_name(completion.choices[0].message.content, liste_eleves) + "\n" resultat += replace_eleve_ids_with_names(completion.choices[0].message.content, liste_eleves) responses.append(resultat) return responses