import random from django.db.models import Max; from django.http import HttpResponse from django.template import loader from django.contrib import admin from django.conf import settings from django.shortcuts import redirect from django.contrib import messages from .forms import * from .models import * from django.apps import apps from .functions import * from datetime import datetime """ Fonction displayZone Cette vue permet de charger les données d'une zone Si zone_id n'est pas fourni, cela affiche la première vue du jeu qui démarre le chrono de l'équipe et qui """ def displayZone(request, zone_id=None): if 'equipe_code' not in request.session: return redirect('app:setEquipe') equipe = Equipe.objects.get(code=request.session['equipe_code']) template = loader.get_template('app/zone.html') context = { 'zone':None } challenge = getMaxChallenge(equipe) if zone_id is None: messages.error(request, "Merci d'indiquer une zone à charger !") else: try: zone = Zone.objects.filter(code=challenge.zone.code)[0] if request.method == 'POST': form = ZoneForm(request.POST) if form.is_valid() and int(request.POST.get('code')) == zone.mdp: zone.etat = 'L' zone.save() stopChallengeTime(challenge) challenge = createChallenge(equipe) if challenge == -1: messages.warning(request, "Oups, aucune salle n'est disponible. Contactez l'administrateur !") elif challenge is not None: messages.success(request, "Bien joué, rendez-vous maintenant dans la zone "+challenge.zone.nom+" pour la suite de l'aventure"); else:#escape game terminé messages.success(request, "Bien joué, rendez-vous maintenant au point de départ pour scanner le QR code de fin de partie"); else: messages.warning(request, "Mauvais mot de passe") context = { 'zone':zone, 'title': "Bienvenue dans la zone
"+zone.nom, 'form': ZoneForm(), } elif zone_id == zone.code: startChallengeTime(challenge) zone.etat = 'O' zone.save() context = { 'zone':zone, 'title': "Bienvenue dans la zone
"+zone.nom, 'form': ZoneForm(), } else: messages.warning(request, "Mauvaise zone ! vous devez vous rendre dans la zone "+zone.nom) except Zone.DoesNotExist: messages.error(request, "Cette zone n'existe pas !") return HttpResponse(template.render(context, request)) """ Fonction setEquipe Fonction permettant d'enregistrer une équipe et de lui donner la prochaine zone de destination. Lors de la première exécution, la fonction démarre le chrono de l'équipe. """ def setEquipe(request): template = loader.get_template('app/setEquipe.html') if 'equipe_code' not in request.session: if request.method == 'POST': form = LoginForm(request.POST) if form.is_valid(): equipe = Equipe.objects.get(code=int(form.cleaned_data['equipe'])) request.session['equipe_code'] = equipe.code request.session['equipe_nom'] = equipe.nom challenge = getMaxChallenge(equipe) if challenge is None: startEquipeTime(equipe) challenge = createChallenge(equipe) context = { 'zone': challenge.zone.nom, 'equipe_nom': request.session['equipe_nom'], } else: context = { 'form': LoginForm(request.POST), } else: context = { 'form': LoginForm(), } else: equipe = Equipe.objects.get(code=request.session['equipe_code']) max_rank = Challenge.objects.filter(equipe=equipe).aggregate(max_rank=Max("rank"))['max_rank'] if max_rank is None: max_rank = 0 if max_rank < getSettings().nb_challenges: context = { 'zone': getMaxChallenge(Equipe.objects.get(code=request.session['equipe_code'])).zone.nom, 'equipe_nom': request.session['equipe_nom'], } else: stopEquipeTime(equipe) debut = datetime.strptime(equipe.start_time.strftime("%H:%M:%S"), "%H:%M:%S") fin = datetime.strptime(equipe.end_time.strftime("%H:%M:%S"), "%H:%M:%S") total_time = fin - debut request.session.flush() context = { 'formated_total_time': total_time } return HttpResponse(template.render(context, request)) def logout(request): request.session.flush() return redirect('app:setEquipe') def dashboard(request): if not request.user.is_authenticated & request.user.is_superuser: return redirect("/admin/login/?next=/admin-dashboard") template = loader.get_template('app/dashboard.html') liste_equipe = Equipe.objects.all().order_by('nom') liste_equipe_challenges = list() for equipe in liste_equipe: liste_challenges = Challenge.objects.filter(equipe=equipe).order_by('rank') liste_affichage = list() for challenge in liste_challenges: affichage = {"class":"","text":""} zone = Zone.objects.filter(code=challenge.zone.code)[0] text = ""+zone.nom+"
Code : "+str(zone.code)+"
Mdp : "+str(zone.mdp) if challenge.start_time is not None and challenge.end_time is not None:#Challenge terminé affichage["class"] = "table-success" debut = datetime.strptime(challenge.start_time.strftime("%H:%M:%S"), "%H:%M:%S") fin = datetime.strptime(challenge.end_time.strftime("%H:%M:%S"), "%H:%M:%S") total_time = fin - debut text = text+"
Temps : "+str(total_time) elif challenge.start_time is not None and challenge.end_time is None:#Challenge en cours affichage["class"] = "table-primary" elif challenge.start_time is None and challenge.end_time is None:#Challenge attribué affichage["class"] = "table-warning" else: affichage["class"] = "" affichage["text"] = text liste_affichage.append(affichage) temps_equipe="" if equipe.start_time is not None and equipe.end_time is not None:#EscapeGame terminé debut = datetime.strptime(equipe.start_time.strftime("%H:%M:%S"), "%H:%M:%S") fin = datetime.strptime(equipe.end_time.strftime("%H:%M:%S"), "%H:%M:%S") total_time = fin - debut temps_equipe = "
Temps : "+str(total_time) data = {'equipe':equipe,'liste_affichage':liste_affichage,'temps_equipe':temps_equipe} liste_equipe_challenges.append(data) nb_challenges = list() for i in range(getSettings().nb_challenges): nb_challenges.append(i+1) context = { 'title': "Dashboard", 'nb_challenges': nb_challenges, 'liste_equipe_challenges': liste_equipe_challenges } return HttpResponse(template.render(context, request)) def distances(request): if request.method == 'POST': for key, value in request.POST.items(): if key != 'csrfmiddlewaretoken': zone1 = Zone.objects.filter(pk=key.split("_")[0])[0] zone2 = Zone.objects.filter(pk=key.split("_")[1])[0] if value == "": value = 0 try: distance = Distance.objects.filter(zone1=zone1,zone2=zone2)[0] distance.distance = int(value) distance.save() except IndexError: distance = Distance(zone1=zone1,zone2=zone2,distance=value) distance.save() try: distance = Distance.objects.filter(zone1=zone2,zone2=zone1)[0] distance.distance = int(value) distance.save() except IndexError: distance = Distance(zone1=zone2,zone2=zone1,distance=value) distance.save() template = loader.get_template('app/distances.html') liste_zones = Zone.objects.all().order_by("id") data = list() for zone_row in liste_zones: row = list() for zone_col in liste_zones: if zone_col.id <= zone_row.id : row.append({"class":"table-secondary","value":""}) else: try: distance = Distance.objects.filter(zone1=zone_row,zone2=zone_col)[0] row.append({"class":"","value":distance.distance,"ref":str(zone_row.id)+"_"+str(zone_col.id)}) except IndexError: row.append({"class":"","value":"","ref":str(zone_row.id)+"_"+str(zone_col.id)}) data.append({"zone":zone_row,"distances":row}) context = { 'data':data, 'title': "Gestion des distances", } return HttpResponse(template.render(context, request)) def settings(request): template = loader.get_template('app/settings.html') if request.method == 'POST': form = SettingsForm(request.POST) if form.is_valid(): settings = getSettings() if settings is None: settings = Settings(nb_challenges = int(form.cleaned_data['nb_challenges'])) settings.save() else: settings.nb_challenges = int(form.cleaned_data['nb_challenges']) settings.save() try: settings = Settings.objects.all()[0] initial_values = { "nb_challenges":settings.nb_challenges, } context = { 'form': SettingsForm(initial = initial_values), 'title': "Paramètres", } except IndexError: context = { 'form': SettingsForm(), 'title': "Paramètres", } return HttpResponse(template.render(context, request)) """ Fonction createNewGame Cette fonction efface les challenges présents en base pour en créer de nouveaux pour chacune des équipes """ def createNewGame(request): #On efface les challenges existants Challenge.objects.all().delete() #On libère toutes les zones liste_zone = Zone.objects.all() for zone in liste_zone.iterator(): zone.etat='L' zone.save() liste_equipe = Equipe.objects.all() for equipe in liste_equipe.iterator(): equipe.start_time=None equipe.end_time=None equipe.save() #On vérifie que le nombre de zones soit au moins égal au nombre d'équipe +1 if len(liste_zone) < len(liste_equipe)+1: messages.error(request, "Pas assez de zone pour créer un nouveau jeu") else: messages.info(request, 'Création du jeu OK.') return redirect('app:admin-dashboard')