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