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