You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

99 lines
4.1 KiB

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.replace("\\n", " ").strip()