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
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 |