from django.shortcuts import render, redirect from django.contrib.auth import authenticate, login, logout from django.contrib.auth.decorators import login_required from django.conf import settings from main.openAIAppreciations import * from django.urls import reverse from django.http import JsonResponse from django.contrib.auth.models import User from main.models import UserCredit, Modele import os import uuid import json def login_view(request): if request.method == 'POST': username = request.POST['username'] password = request.POST['password'] user = authenticate(request, username=username, password=password) if user is not None: login(request, user) return redirect('generation') return render(request, 'login.html') @login_required(login_url='/login/') def generation(request): if request.method == 'POST': appreciations_pdf = request.FILES.get('appreciations_pdf') appreciations_path = None tmp_dir = os.path.join(settings.BASE_DIR, 'main', 'tmp') os.makedirs(tmp_dir, exist_ok=True) if appreciations_pdf: ext = os.path.splitext(appreciations_pdf.name)[1] random_name = f"appreciations_{uuid.uuid4().hex}{ext}" appreciations_path = os.path.join(tmp_dir, random_name) with open(appreciations_path, 'wb+') as destination: for chunk in appreciations_pdf.chunks(): destination.write(chunk) # Appel du traitement après upload appreciations_json = convertPdfToJSON(appreciations_path) if appreciations_path and os.path.exists(appreciations_path): os.remove(appreciations_path) request.session['appreciations_json'] = appreciations_json return redirect('resultat_appreciations') return render(request, 'generation.html') @login_required(login_url='/login/') def resultat_appreciations(request): appreciations_result = request.session.get('appreciations_json', []) credit = 0 if hasattr(request.user, 'credit'): credit = request.user.credit.credit modeles = Modele.objects.filter(actif=True) return render(request, 'resultat_appreciations.html', { 'appreciations_json': appreciations_result, 'credit': credit, 'modeles': modeles }) @login_required(login_url='/login/') def generer_appreciation_ajax(request): if request.method == 'POST': data = json.loads(request.body) eleve = data.get('eleve') modele = data.get('modele') user = request.user # Vérifier le crédit if hasattr(user, 'credit') and user.credit.credit > 0: appreciation = generer_appreciation_pour_eleve(eleve, request.session.get('appreciations_json', []), modele) # Décrémenter le crédit user.credit.credit -= 1 user.credit.save() credit = user.credit.credit stop = credit == 0 return JsonResponse({'appreciation': appreciation, 'credit': credit, 'stop': stop}) else: return JsonResponse({'appreciation': 'Crédit épuisé', 'credit': 0, 'stop': True}) return JsonResponse({'error': 'Méthode non autorisée'}, status=405) def logout_view(request): logout(request) return redirect('login') def generer_appreciation_pour_eleve(eleve, eleves_json, modele=None): eleve_data = next((e for e in eleves_json if e["eleve"] == eleve), None) if not eleve_data: return f"Aucun élève trouvé avec le nom {eleve}" if modele is None: modele = "ft:gpt-4o-2024-08-06:personal:app-gen-gangneux2:AYJecsON" completion = openai.ChatCompletion.create( model=modele, messages=[ {"role": "system", "content": "Rédige une appréciation générale (500 caractères max) pour cet élève"}, {"role": "user", "content": str(eleve_data["appreciations"])} ], temperature=0.7, presence_penalty=0.6, frequency_penalty=0.6, top_p=0.5) return completion.choices[0].message.content