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.
 
 
 
 

122 lines
4.0 KiB

from django.http import HttpResponse
from django.template.response import TemplateResponse
from django.template import loader
from .models import Atome, Score
from random import shuffle
from datetime import datetime
from django.shortcuts import redirect
import time
from django.views.decorators.cache import never_cache
from django.db.models import Min
from .forms import UserForm
def home(request):
return TemplateResponse(request, 'quiz_atomes/home.html', {'favicon':'vial-solid.svg'})
def login(request):
if request.method == 'POST':
form = UserForm(request.POST)
if form.is_valid():
request.session['pseudo'] = form.cleaned_data['login'].upper()
request.session['difficulte'] = int(form.cleaned_data['diff'])
return redirect('quiz_atomes')
else:
form = UserForm()
context = {
'form': form,
'favicon':'vial-solid.svg'
}
return TemplateResponse(request, 'quiz_atomes/login.html', {'form': form})
def logout(request):
request.session.flush()
return redirect('home')
@never_cache
def quiz_atomes(request):
if request.POST.get('ok'):
return resultats(request)
if 'pseudo' not in request.session or 'difficulte' not in request.session:
return redirect('login')
atome_list = Atome.objects.all().values()
random_list = list(atome_list)
shuffle(random_list)
random_list = random_list[:int(request.session['difficulte'])]
request.session['quiz'] = random_list
request.session['time'] = time.time()
template = loader.get_template('quiz_atomes/quiz_atomes.html')
context = {
'user': request.session['pseudo']+" ("+str(request.session['difficulte'])+")",
'atome_list': random_list,
'favicon':'vial-solid.svg'
}
return HttpResponse(template.render(context, request))
def resultats(request):
resultats = []
points = 0
dt = round(time.time()-request.session['time']-1)*-1
for i in range(int(request.session['difficulte'])):
current = [request.session['quiz'][i]['nom'],'',request.session['quiz'][i]['symbole'],'','']
if request.POST.get('input'+str(i+1)).casefold()==request.session['quiz'][i]['symbole'].casefold():
points+=20
current[1]=request.session['quiz'][i]['symbole']
current[3]="+20"
current[4]="bg-success text-white"
elif request.POST.get('input'+str(i+1)).casefold()=="":
points-=5
current[1]=request.session['quiz'][i]['symbole']
current[3]="-5"
current[4]="bg-warning text-dark"
else:
points-=10
current[1]=request.POST.get('input'+str(i+1))
current[3]="-10"
current[4]="bg-danger text-white"
resultats.append(current)
new_score=points+dt
best_score=0
if new_score>0:
score_list = Score.objects.all().order_by('-score')[:20]
min_selection_score = score_list.aggregate(Min("score")).get('score__min')
if new_score>min_selection_score or Score.objects.count()<20:
if len(Score.objects.filter(pseudo=request.session['pseudo'])) >= 1:
if Score.objects.filter(pseudo=request.session['pseudo']).values_list('score',flat=True)[0] < new_score:
Score.objects.select_for_update().filter(pseudo=request.session['pseudo']).update(score=new_score, score_date=datetime.now())
best_score=1
else:
Score(pseudo=request.session['pseudo'], score=new_score, score_date=datetime.now()).save()
best_score=1
template = loader.get_template('quiz_atomes/resultats.html')
context = {
'points': points,
'dt': dt,
'score': new_score,
'best_score': best_score,
'correction': resultats,
'favicon':'vial-solid.svg'
}
return HttpResponse(template.render(context, request))
def scores(request):
score_list = Score.objects.all().order_by('-score')[:20]
template = loader.get_template('quiz_atomes/scores.html')
context = {
'score_list': score_list,
'favicon':'vial-solid.svg'
}
return HttpResponse(template.render(context, request))